转发大神关于说话人识别的ivector系统的说明,看了瞬间懂了

作者:Leon晋
链接:https://www.zhihu.com/question/63978977/answer/215215119
来源:知乎
 

1、先用一部分训练集(包含多个说话人),通过EM期望最大化算法,训练UBM通用背景模型;通常我们会先训练一个协方差对角矩阵,再训练全矩阵,理由如下:

 

1、M阶高斯的稠密全矩阵UBM效果等同于一个更大高斯分量的对角矩阵;

2、对角UBM较为稀疏,计算量低效率快;

3、对角UBM性能上有优势;

UBM特点:一个与说话人、信道无关的高斯混合模型;可以作为这个训练集的统一参考坐标空间;在一定程度上,还解决了某些说话人少样本问题;

2、假如初始化UBM时,我设了M=2048个高斯分量components,就会有2048个单高斯分量,每个 i 分量(i=1,2,...,M)包括一个权重、一个均值矢量、一个协方差矩阵:λ = {ci,μi,∑i},其中μi和∑i分别是矢量与矩阵;

假如声学特征是D=39维,则UBM的第 i 个高斯分量的均值矢量将包含了D维

如果把均值矢量与协方差对角阵展开,则是μi = {μi1,μi2,...,μiD},∑i = diag{σ^(2)i1,σ^(2)i2,...,σ^(2)iD},即均值是一个D x 1维矢量,方差是D x D维对角(全)矩阵

3、训练好了UBM,接下来就是计算充分统计量,我们会用一大部分的训练集去计算;充分统计量包括零阶、一阶(部分存在二阶),这是用于接下来训练总变化子空间矩阵T,公式分别如下:

转发大神关于说话人识别的ivector系统的说明,看了瞬间懂了_第1张图片

Pr(i | x)是UBM的第 i 个高斯分量的后验概率,如下:

xt 是某句话的第 t 帧(D维),有改进的论文会把一阶统计量公式的 xt 改为 (xt - μi),这是基于UBM通用背景的均值矢量,实现去中心化,使 xt 更突出它的说话人变化性,如:

转发大神关于说话人识别的ivector系统的说明,看了瞬间懂了_第2张图片

这里我截图了别的论文,和上图是对应的,c是第c个高斯分量,F是一阶统计量

可以把上图的yt改为如下:

4、根据充分统计量,我们会先将M个高斯分量的均值矢量(每个矢量有D维),串接在一起形成一个高斯均值超矢量,即M x D维,构成F(x)F(x)是MD维矢量;同时利用零阶统计量构造N,N是MD x MD维对角矩阵,以后验概率作为主对角线元素拼接而成;然后,先初始化T矩阵,构造一个[MD, V]维矩阵,V要远小于MD,V<

接着,固定T矩阵,根据最大似然准则MLE,估算隐变量 w 的零阶和一阶统计量;再把新的零阶和一阶统计量放回去上面的式子,继续估算w……即使用无监督EM算法去迭代收敛,反复迭代5-6次,即可认为T矩阵收敛。

T矩阵特点:说话人的截荷空间,用于只表征说话人变化,不带有信道与噪声变化;是一个映射矩阵,类似于权重矩阵;能把高维统计量(超矢量)映射到低维说话人表征(i-vector);起到降维作用;

 

5、当UBM和T训练好,我们会将待提取i-vector的语音,提取高斯均值超矢量;基于UBM模型,用最大后验概率MAP去自适应当前句子的GMM模型,方法如下:

转发大神关于说话人识别的ivector系统的说明,看了瞬间懂了_第3张图片

训练当中,可以只对均值进行更新,因为大量实验证明过只更新均值是性能最好的;然后生成M个分量的GMM,以每个高斯分量的均值矢量(每个矢量有D维)作为串接单元,形成MD维的高斯均值超矢量M

6、根据联合因子分析(简化):

M是第5步的待提取iv的语音的高斯均值超矢量,m是UBM的高斯均值超矢量,T是总变化子空间矩阵,w是i-vector;

维度对应的是 : MD = MD + [MD , V]*V 如果MFCCs设为13维,一二阶差分后成39维,UBM是2048分量,那均值超矢量就是79,872维,V设600即i-vector维度

参考文献:

【1】Speaker Verification Using Adapted Gaussian Mixture Models

【2】Front-End Factor Analysis for Speaker Verification
【3】SVM BASED SPEAKER VERIFICATION USING A GMM SUPERVECTOR KERNEL AND NAP VARIABILITY COMPENSATION

-------------------------------分割线-----------------------------------------------------

后端过程:


训练时有了GMM-UBM,有了T矩阵,测试时就对enrollment和test的MFCC提取高斯超矢量M;然后根据M = m + Tw,得到w,也就是属于enrollment和test的i-vector;接下来就可以做分类了。

得到i-vector,那接下来就用PLDA或者cos作为后端分类器就好了,这个在kaldi的SRE10里有脚本。

如果想要在提取i-vector过程中使用到DNN,那就是借助语音识别的办法,训练DNN模型;然后以DNN的输出节点数作为UBM的高斯数。这个在SRE10-v2里有,不过这整套工程跑起来挺费时。

如果把DNN作为后端分类,也不是不行,就是把整个流程搞得太长了:得到i-vector之后,每次直接把单句话的iv输入进去,输入节点数等于iv维度;集内有多少个SPK,输出节点就有多少维,标签就有多少维;每个SPK的标签都保持one-hot;训练阶段用softmax或者cross entroy;这样就可以完成集内的识别。当然这方法有几个弊端,一是集内二是基于ivector。

如果要做识别,当然还有更暴力的方法,脱掉UBM T矩阵 ivector那一套,如果数据量够多的话,直接用MFCC输入DNN作识别就OK了,参考d-vector方法;不过dvector办法还是有弊端。同样,做二分类确认,也可以直接用DNN解决,只是还有些trick。

你可能感兴趣的:(转发大神关于说话人识别的ivector系统的说明,看了瞬间懂了)