一.搞了几天,首先说一下X-vector的优势:
1.训练速度非常快
2.无需特定语种的训练集,由于设置一个embedding层进行提取特征直接进行plda打分
3.识别率不错
二.Kaldi中有现成的例子,可供研究
https://github.com/kaldi-asr/kaldi/tree/master/egs/sre16/v2
https://github.com/kaldi-asr/kaldi/tree/master/egs/voxceleb/v2
上面是kaldi的两个例子
- 根据《X-VECTORS: ROBUST DNN EMBEDDINGS FOR SPEAKER RECOGNITION》
简要解释上图X-vector的网络结构,如上图前5层是帧级别,然后做了池化后插入两层段级别的embedding,使用segment6这层作为提取xvector特征,该特征可以当做ivector进行plda打分,最后一层是softmax层对于训练集中所有的说话人目标。比起BNF特征提取要容易的多,BNF需要训练基于音素的声学模型,而且提取后的特征又需要进行UBM-ivector过程,相当耗时。
详细细节可以看一下论文描述,这里仅记录下流程。
- 代码部分
首先kaldi这里代码好像有点问题,不知道是不是我这里版本的问题,具体在训练xvector部分steps/libs/nnet3/train/frame_level_objf/common.py中定位到common_lib.execute_command(
"""{command} {combine_queue_opt} {dir}/log/combine.log \
nnet3-combine 。。。
这里删掉#--max-objective-evaluations={max_objective_evaluations} \
# max_objective_evaluations=max_objective_evaluations,
这两行代码,看了下nnet3-combine选项中没有这个参数,想必是该脚本作者优化了源码。
打开voxceleb的v2中的run.sh脚本
从stage顺序看:
- 准备语料训练集以及测试集,可以是不同语言越多越好
- 使用mfcc提取特征,尝试过替换Mel-filter bank特征效果并不好,主要也没有调节各种参数
- 利用回响和三种噪音增强了训练数据,测试了增强于非增强的效果还是非常明显
- 这部分对增强的数据进行了随机筛选于原始数据相同数量级的数据提取特征并于原始数据结合
- 做了归一化移除了静音帧
- 这里移除了小于min_len时长的语音段,也舍弃了小于min_num_utts段数音频的说话人信息
- 生成egs并训练xvector网络
- 利用embedding层提取xvector特征
- lda降维然后再用plda打分
- 计算eer