目录

声纹识别X-Vector

背景

声纹识别上x-vector被作为很多赛事的baseline使用,包括aishell2018、ASVspoof2019。介绍x-vector的文章主要有[1] [2]两篇,[1]介绍x-vector的整体和细节部分,[2]对实验进行了补充分析。

Prerequisites: TDNN,embedding。

核心思路

将系统分成两个部分:

  1. Embedding:将不定长的语音通过加噪和加混响进行数据扩充,然后经由深度神经网络映射成定长的向量,将映射之后的向量称为x-vector。
  2. Compare pairs of embeddings:采用PLDA

x-vector系统

输入:24维filterbanks(在[1]中是20维MFCC),帧长25ms,经过 a. 3秒滑动窗口的均值归一化 b. speech activity detection(SAD)去除没有说话人语音的帧 处理。

系统框架

Deep Neural Network Embeddings

系统参数:

参数

Step 1. Time Delay Neural Networks (TDNN)

系统框架图中的Statistics Pooling之前的部分就是TDNN,下图是TDNN的示意图,来源为 [3]。

TDNN示意图

TDNN

根据系统参数有如下图的TDNN:

根据系统绘制的TDNN

根据系统参数所示,frame5的output是1500,因此每一次TDNN的输入都是15帧,输出都是1500维的向量。

对语音每15帧提取一次1500维的向量,如果输入的语音有T帧长,那么最终就能得到T个1500维的向量。

p.s. 如果说输入的语音特征总共有T帧,在边缘不补零的情况下,输出是T-2*7帧,而不是刚好T帧。这里说得到T个向量是为了与论文一致,后文也将沿用论文的说法。(p.s.具体实现的时候可以用dilation,可参见代码)

Step 2. Statistics pooling

对这T个向量计算均值和方差(因为每个1500维的向量都是从一个15帧的数据提取的,这样能够集合不同时间上的信息),将均值和方差合并起来,则得到一个2x1500=3000维的向量。

系统框架所示,pooling之后,使用两层全连接层,最后softmax之后的输出长度是说话人的数量K(p.s.在[2]中说话人数量的符号是N,为了与损失函数公式符号保持一致,这里统一用K表示说话人数量)。

模型的损失函数为下式的多分类交叉熵:

损失函数

其中,有K个说话人,每人说了N个片段(segment)。当对说话人片段n打上的标签是k时,$d_{n k} $是1,否则为0。

第n段语音的loss计算可以用以下的表格表示:

* 说话人A 说话人B 说话人K
Label 0 1 0
Pred 0.3 0.6 0.1

$$ \text {loss}=-(0 \times \log (0.3)+1 \times \log (0.6)+0 \times \log (0.1) $$

Step 3. extract embedding

神经网络并不仅仅是一个分类器,而是一个特征提取器和分类器的结合,每一层都有极强的特征提取能力。因此可以将模型的一部分作为特征提取器,也就是embeddings。

在训练完前述模型之后,截取模型的前一部分。截取哪部分要考量两点:

  1. 选取能够利用整段语音信息的部分(所以选取pooling之后的部分) 。
  2. 输出不宜过长(pooling之后的输出结果的长度为3000,所以选择经过全连接层的,输出结果长度为512)。
  • 系统参数所示,文献[1]选取segment6的输出作为embeddings。

  • 系统框架所示,文献[2]选取了两种embedding方法进行对比,并增加了联合两种embedding的方法( Instead of concatenating embeddingstogether,wecomputeseparatePLDAbackendsfor each embedding, and average the scores),效果如下图:

对比embedding

跨语言对比

结论:1. 测试语音比较长时,i-vector的优势比较明显;2. 测试语音在5-20s时,dnn效果较好;3. embedding的综合要比只用单个embedding好;4. dnn对out of domain 的效果优于i-vector

Step 4. PLDA backend

PLDA(Probabilistic Linear Discriminant Analysis)是一种信道补偿算法,号称概率形式的LDA算法,PLDA算法的信道补偿能力比LDA更好,已经成为目前最好的信道补偿算法。

利用前述的embeddings训练PLDA模型, 使用PLDA的方法和i-vector是一样的。具体做法如下:

建模

定义第i个说话人的第j条语音为xij,然后定义xij的生成模型为$x_{i j}=\mu+F h_{i}+G w_{i j}+\epsilon_{i j}$。

模型分为两部分:

  1. 信号部分:$\mu+F h_{i}$,只与说话人身份有关,该项描述了**个体之间**的差异。
  2. 噪声部分:$G w_{i j}+\epsilon_{i j}$,同一个人每次说话也会有差异,描述了**个体内部**的差异。

$\mu$是全体训练数据的平均值;

F可以看做是身份空间,包含了可以用来表示各种身份的基底;

$h_i$就可以看做是一个人的身份(或者是人物在身份空间中的位置);

G可以看做是误差空间,包含了可以用来表示同一身份不同变化的基底;

$w_{ij}$表示的是在误差空间中的位置;

$\epsilon_{i j}$ 用来表示随机误差,该项为零均高斯分布,方差为 Σ。

由于我们只关心区分说话人,所以并不需要计算误差空间,所以可以把噪声部分的两项合并,则得到$X_{i j}=\mu+F h_{i}+\epsilon_{i j}$,其中$\epsilon$~N(0, Σ),$h_i$~N(0,1)。

训练

训练PLDA模型,就是通过训练数据估计出参数$\phi$和Σ。估计这两个参数的方法是经典EM算法迭代求解,即猜(E-step)-反思(M-step),重复。

测试

模型测试阶段的思想是使用对数似然比来计算得分:

测试模型公式

n1和n2分别是两个语音的x-vector(或i-vector)矢量,这两条语音来自同一空间的假设为Hs,来自不同的空间的假设为Hd。

其中p(n1, n2 | hs)为两条语音来自同一空间的似然函数;

p(n1 | hd),p(n2 | hd)分别为n1和n2来子不同空间的似然函数。通过计算对数似然比,就能衡量两条语音的相似程度。

得分越高,两条语音属于同一说话人的可能性越大。

具体的PLDA得分计算也有不同的实现,[4]中介绍了在i-vector上用的Gaussian PLDA(GPLDA)。

论文结论

文献[2]主要是对数据扩充对不同模型的影响进行了对比分析,性能结果如下图:

各模型性能对比

文献[2]的结论:

  1. x-vector取得了比另外两种ivector更优异的效果,尤其是在out-domain(Cantonese)上保持了优势;

  2. 本文所提出的data augmentation 可以大大减少EER,同时data augmentation在xvector上效果最好;

  3. PLDA aug 或者extractor aug 在三种模型上都有所改进,但是二者结合取得的效果最好;

参考资料