根据规划,今天来看第二部分模型训练:

1、声纹模型
声纹识别已有几十年的历史,但是真正的声纹模型应用,应该是从深度学习兴起之后,目前主流的声纹识别系统,也基本都是基于深度学习的方法来做的,包括经典的d-vector, x-vector, ResNet, ECAPA-TDNN等。
本文中为了训练方便,采用的是经典的x-vector模型,该模型是d-vector的重要演变,它首先通过TDNN层提取语音帧的帧级特征,然后通过pooling将帧级特征的均值和标准差连接起来作为段级特征,最后通过标准前馈网络将段级特征分类到其对应的说话人。
2、训练框架
目前声纹模型的训练框架有很多,经典的Kaldi中有TDNN的原始实现,厦大洪青阳老师实验室开源的asv-subtools,以及最近一年才开源的SpeechBrain, 此外,还有一些个人作者实现了很多不错的框架,例如deepaudio-speaker,tf-kaldi-speaker 等,有兴趣的同学可以多看看,本文接下来要用的是SpeechBrain,主要原因一个是用起来很方便,另一个是我比较熟~有一点要说明的是,框架其实并不影响我们最终的实现,得益于torchscript的便利性,我们最终实现的OpenSpeaker理论上可以支持所有pytorch训练出来的模型,比如上面提到的asv-subtools和deepaudio-speaker,后期我也会专门写一篇deepaudio-speaker的介绍,它有很多最新的模型,可以方便我们横向对比。
本文下面用到的SpeechBrain是基于PyTorch 的开源一体化语音工具包,支持包括语音识别、说话人识别、语音增强、多麦克风信号处理等多种任务,同时还提供了很多预训练的模型,通常在各项任务上都能达到很不错的效果,最后它的使用也很方便,通过yaml文件定义各个需要的组件,具有pytorch数据并行或者分布式并行的多GPU训练与推理,以及半精度训练等等优点,对于很多语音新人或者没有历史包袱的人,个人建议从SpeechBrain入手,学习成本更低。
3、搭建环境
既然是从零开始,那就连环境搭建的部分也一起写了,尽量简短,执行几行命令就能work起来:
• 因为SpeechBrain要求Python 3.8+,这里推荐用Conda,Linux系统下清华源的下载路径:Anaconda3 2021.05(Linux/x86_64,sh);
• 下载完成后,如下命令即可安装:bash Anacoda3-2021.05-Linux-x86_64.sh
• 如果有需要,也可能去创建其他的环境,此时的bass已经能正常使用了。
安装好环境后,可以安装SpeechBrain了,此处建议安装我clone的repo,主要原因是本项目中有许多要修改代码的地方,但是合入到官方版本又需要很多说明,不如我们自己维护一个分支,做做实验,想怎么修改就行。
克隆了代码之后记得选择OpenSpeaker分支:

关于改动,主要有用torchaudio替换了原有的Fbank特征提取部分,修改噪声路径为可配置,增加convert_model工具,以及模型结构梳理,后面会单写一篇说明为什么要做这些改进,这里就先简单的run起来。
将代码clone到本地后,进入SpeechBrain目录,执行下面命令安装当前项目:
pipinstall-e.-ihttps://pypi.tuna.tsinghua.edu.cn/simple从当前项目安装的好处是你随时可以本地修改代码做实验,而不需要进入重新安装等复杂的操作。
到这里,训练环境应该都搭建好了,再次回顾一下:
1. 安装conda环境
2. 下载SpeechBrain代码并切换到OpenSpeaker分支
3. 本地安装SpeechBrain
4. 成功
4. 模型训练
1. 训练数据准备
在上一篇文章中,我们指出了有多种中英文训练集可以使用,在SpeechBrain项目中,说话人识别是以VoxCeleb数据为例的,所以我们先下载VoxCeleb数据集,后续再考虑增加中文数据集。
首先进入Voxceleb官网,下载Dev A、Dev B、Dev C、Dev D四个部分,执行cat vox1_dev* > vox1_dev_wav.zip ,然后解压即可得到对应的音频,如果当前目录是/path/to/data,则可以得到 /path/to/data/vox1/wav的路径,wav下面就是所有的说话人文件夹,后续我们会传入这个路径进行训练。
2. 开始训练
SpeechBrain的说话人训练代码是在speechbrain/recipes/VoxCeleb/SpeakerRec目录,进入该目录后,找到刚刚的音频路径/path/to/data/vox1/wav,输入如下命令即可开始训练:

该过程中间会下载几个文件,包括rirs_noises.zip和veri_test2.txt,通常下载都会很快,不出意外就是静等最后模型训练出结果了,至于多长实际,可能是半天,也可能是两整天,具体要跟数据访问的速度和训练所用的GPU有关了。
模型训练好了应该存放在以下路径:

3. 模型测试
模型训练完成后,需要对得到的模型进行测试,在SpeakerRec目录下有两个测试脚本:speaker_verification_plda.py和speaker_verification_cosine.py,通常来收plda效果会好一些,但是cosine的实现更好理解,此处用的是plda测试,同样是一行命令就可以完成

其中pretrain_path 就是指向上面训练好的模型中的某个checkpoints目录。
最终的测试结果会是EER和minDCF,应该在这个值附近:

4.Google Colab 一键训练
Google在Colab上提供了免费的GPU,我们也可以薅一下羊毛,因此我实现了一个Colab的脚本,放在clone的SpeechBrain相应目录了。
大家可以直接打开并复制到自己的Drive,一键运行即可开始模型训练:

最终的训练结果会保存在drive/OpenSpeaker/train_results目录,大家可以按照之前的说明进去查看所有的文件。
5. 总结
至此,我们已经快速的从零搭建一套SpeechBrain的训练环境,能训练出一个可用的X-vector模型,并提供了一个Colab文档,方便没有GPU的同学做简单的尝试。模型训练和Colab我都在独立的环境试过,可以独立运行,使用中有问题大家也可以评论留言~
文章来源知乎,文章作者:蘑菇炖提莫
