这篇文章分两部分,第一部分介绍x-vector的说话人识别细节算法,第二部分是对最新技术的跟进,本质是对训练数据做了data augmentation,x-vector方法在kaldi上的实现细节将在下一篇文章中展示。
一 . 对文章“Deep neural network embeddings for text-independent speaker verification” 的解读。
1. 概要
在实际应用中,往往被测试者或被验证者的语音长度相对较短,若使用传统的PLDA/ivector模型效果会相对一般(这一点会在结果中体现出来)。神经网络具有极强的特征提取能力,所以这篇文章提出了使用TDNN提取语音的embeddings,然后再基于一个PLDA backend 对embeddings进行相似度打分。
2. 实现
关于TDNN的介绍,我计划放在深度学习那个分支。这个算法对神经网络的使用十分有意思。
2.1 训练思路
阶段一(对神经网络的训练):
训练的神经网络结构如图所示,pooling层之前的结构是TDNN,TDNN总的输入是一段语音,每次TDNN取固定帧数,这个原理会在深度学习TDNN的介绍里详细说。然后pooling层把每个TDNN的输出向量积累下来后,计算均值和标准差作为pooling层的输出。pooling层之后接着两层全向连接层最后加一个softmax层为输出。输出的神经元个数和我们训练集中说话人个数保持一致。可以看到图中所写,输出是一个后验概率。这样设计的好处就是,我们可以处理时长不同的语音。
训练用损失函数为交叉熵:
其中 n代表要输入的语音(segment),k代表各个说话人, 是输入segment n后,由softmax层给出的它属于各个说话人的后验概率。
只有当segment n 的标记(说话人)是k时才等于1,否则为0。观察公式,靠里的求和其实只有一项,靠外是对所有(或者是一个bash)内的语音的求和。
众所周知,神经网络并不仅仅是一个分类器,而是一个特征提取器和分类器的结合,每一层都有极强的特征提取能力。所以我们要高度利用神经网络的这种能力,因此我们把softmax层之前的两层用来作为这段语音的embeddings(可以理解为特征向量)。
阶段二:
去掉已经训练好的神经网络的softmax层,之前已经说过,我们仅仅需要它的特征抽象能力。利用剩余结构为我们导出每段语音的embeddings。之后就是利用这些embeddings训练PLDA模型。和经典的PLDA/ivector相比较,文章提出的方法区别仅仅在于对语音特征向量提取的方法,提取出特征向量后(无论是ivector还是xvector)其余步骤都是一样的。
2.2 细节
特征处理:这篇文章里喂给神经网络的特征是20维MFCC特征,帧长是25ms,帧移没有提(一般是帧长的一般10ms左右)。在3s内特征还需要做一个归一化,我个人认为是为了减弱声音强度对特征能量的影响。
PLDA归一化:一是在进入PLDA模型打分前,需要对embeddings做length normalization(研究了下但是没看懂怎么弄,我的感觉是对原始向量的一种投影,减弱其非高斯表现);二是PLDA打分后得分的归一化,用的是adaptive s-norm,本质是一种test-norm,这里不再赘述。
3. 结果及结论
从图中能看出我们提取了两个embeddings,分别是a,b。所以我们主要讨论embeddings的使用对结果的影响,还有就是我们的训练是基于sre2010的,都是英文,单独还测试了这个模型对广东话和tagalog的效果。结果如下:
(fusion指的是对embeddings和ivector打分的综合得出的结果;10s-10s:指的是注册语音10s,测试10s,其余列都是注册语音full length,测试的分别为5s-full的变化)
结论:1. 测试语音比较长时,ivector的优势比较明显;2测试语音在5-20s时,dnn效果较好;3. embedding的综合要比只用单个embedding好;4. dnn对out of domain 的效果优于ivector
二. 对文章‘Robust DNN embeddings for speaker recognition’ 的解读
1. 概要
文章主要是就如何加强系统健壮性提出了data augmentation的方法,并将其应用于三种系统(1.PLDA/ivector;2.ASR-TDNN+PLDA;3. 第一部分的xvector方法)。比较了做了data augmentation之后个不做的效果,以及分析了具体在哪一步做aug对效果的影响。还有一点是增加数据来加训PLDA 模型。
2. 实现
在这一块不再介绍上述三种模型的细节,重点介绍他的data augnmentation是怎么做的,以及各个预料库的用法。
文章中提出的策略是加混响以及各种噪声。总计有四种:babble,music,noise,reverb。 涉及到的预料库有:SWBD, SRE_2004-2010, Mixer6, Fisher, Voxceleb, SITW, SRE16 Cantonese。加噪声的方式是,先将原来的clean utt复制两次,则总共有三份相同的utt。然后留一份,剩下的两份用来做augmentation。对每个要处理的文件,随机选择四种中的一种,文章中给出了每一种的信噪比的标准。
我整理了每一步训练和测试所用数据集:
模型一(PLDA/ivector):
UBM, extractor: SWBD + SRE_2004-2010 + Mixer6
PLDA model: SRE_2004-2010 + Mixer6
PLDA model*: SRE_2004-2010 + Mixer6 + (VoxCeleb-VoxCeleb∩SITW)extractor*: SWBD + SRE_2004-2010 + Mixer6 + (VoxCeleb-VoxCeleb∩SITW)
模型三(xvector):
TDNN: SWBD+ SRE_2004-2010 + Mixer6
PLDA model: SRE_2004-2010 + Mixer6
PLDA model*: SRE_2004-2010 + Mixer6 + (VoxCeleb-VoxCeleb∩SITW)
extractor*: SWBD + SRE_2004-2010 + Mixer6 + (VoxCeleb-VoxCeleb∩SITW)
注:*表示在原有数据集上增加了microphone语音训练的模型。
3. 结果及结论
注:最后一行指的是,加入了VoxCeleb语料后对plda以及extractor的加强训练。而且VoxCeleb是经过data augmentation的,当然所有的训练语料都是经过augmentation的。
结论:
1. x-vector取得了比另外两种ivector更优异的效果,尤其是在out-domain(Cantonese)上保持了优势;
2.本文所提出的data augmentation 可以大大减少EER,同时data augmentation在xvector上效果最好;
3. PLDA aug 或者extractor aug 在三种模型上都有所改进,但是二者结合取得的效果最好;