论文 | 【i-vector前身】关于说话人确认任务中一种高效的因子分析模型中的实现算法

一、Abstract

这篇论文是07年的《A Straightforward and Efficient Implementation of the Factor Analysis Model for Speaker Verification》,当时还没有提出i-vector,但在作者提出的这种Hybrid domain session compensation中暗含了信道总变化因子的思想。本篇paper主要讲了这么两件事:

  • 作者实现了一个简单明确的算法用来估计i-vector,也就是用在计算i-vector特征信道的MAP计算中;
  • 基于标准的GMM似然计算中提出了一个与众不同的补偿均值超向量supervectors的方案:是通过一个SVM分类器来补偿均值超向量;

总体来说,这篇paper为你提供了一个训练i-vector的算法和一个i-vector前身的一些思路。

二、Introduction

在Introduction中除了怼一下前人的方法有多么垃圾,再次强调一下自己的算法有多么多么高效:

  • 提出的了一个简洁直接的算法减少因子分析的计算量;

  • 提出了一种新的补偿方案,就是在处理特定句子影响中,不需要按照像《Speaker Verifiction Using Adapted Gaussian Mixture Models》中所用的得分规整,也就是在对每个说话人的GMM中进行的似然函数计算可以直接通过SVM分类器;

三、对语音变化性建模

作者给捋了一下思路,就是一个说话人的模型应该包含三个部分:

  1. a speaker-session independent compoment
  2. a speaker dependent component
  3. a session dependent component

作为一个数学渣渣,对于component分析的技术,还在学习,推荐看一本书,也是我在实验室偶然之间翻到的《独立成分分析》,这是一种ICA技术,也是因子分析中最重要的技术。

回到这篇论文,OK,在估计i-vector中主要是计算特征信道的MAP,我们用个公式来描述一下上面的三个部分是怎么组装在一起,分别代表了什么,整个公式计算的是一句话的所有信息,因为在论文《Front-End Factor Analysis for Speaker Verification》中,我也对这篇经典之作写了一下自己的感想,参见论文 |《Front-End Factor Analysis for Speaker Verification》,i-vector假设的是所有语音都有不同说话人产生,那么会对提取每一句话的i-vector:

m ( h , s ) = m + D y s + U x ( h , s ) m_{(h,s)} = m + Dy_{s} + Ux_{(h,s)} m(h,s)=m+Dys+Ux(h,s)

我们知道,UBM得到的就是一个GMM均值超向量GMM mean supervector,它是由GMM均值向量合并而成,维度大小是M x D,具体UBM方面如何计算和思想参见 论文 |《Speaker Verifiction Using Adapted Gaussian Mixture Models》

  • M:这个大的GMM有M个混合成分;

  • D:代表语音所提取的升学特征的维度,比如39维MFCC特征;

  • (h,s):代表说话人s的第h句话;

  • m ( h , s ) m_{(h,s)} m(h,s):代表session-speaker dependent supervector mean;特定说话人s在说特定语音h的超值均向量;

  • m:就是UBM得到的就是一个GMM均值超向量GMM mean supervector,UBM主要是估计参数 θ = ( m , Σ , α ) \theta=({m,\Sigma,\alpha}) θ=(m,Σ,α), 维度大小是M x D,对应第一个成分;

  • D: 是MD X MD大小的对角矩阵,满足 I = τ D t Σ − 1 D I=\tau D^{t}\Sigma^{-1}D I=τDtΣ1D, τ \tau τ是在标准MAP计算中的一个相关因子, D t D D^{t}D DtD是一个后验协方差矩阵;

  • y s y_{s} ys:大小是M X D,代表说话人向量;它和D构成了第二个成分

  • U U U: 是在低维R上的信道总变化矩阵,大小是M X D X R,这里的R就是i-vector的维度,在kaldi中常常取400维;

  • x ( h , s ) x_{(h,s)} x(h,s):也就是i-vector,是R维的向量,事实上, x ( h , s ) x_{(h,s)} x(h,s)并不依赖于具体说话人;它和 U U U构成了第三个成分;

其中, x ( h , s ) x_{(h,s)} x(h,s) y s y_{s} ys这两个因子服从 N ( 0 , I ) \mathcal N(0,I) N(0,I)分布。

这部分就是又回忆了一下i-vector的公式长啥样,怕大家后面计算又忘了。

四、因子分析模型中的Striaghtforward具体实现

本文中的因子分析模型主要估计三个部分:

  • 总体估计,其实就是对通过已知UBM的估计,计算一些零阶和一阶统计量,服务于对隐变量( x ( h , s ) x_{(h,s)} x(h,s) y s y_{s} ys这两个因子)和矩阵U(低维R上的信道总变化矩阵)进行估计;

  • 隐变量估计( x ( h , s ) x_{(h,s)} x(h,s) y s y_{s} ys这两个因子);

  • 矩阵U(低维R上的信道总变化矩阵)估计;

下面分别介绍一下,前方有一大波公式:

1. 总体估计

对于一个句子或者一个说话人有M维的混合成分,那么对于说话人和句子本身我们计算得到两个零阶统计量,大小为M x 1的向量:

M维的特定说话人相关的统计量(每个说话人都用M维的GMM表示,GMM对每个说话人说的所有话的响应度): N s [ g ] = Σ t ∈ s γ g ( t ) N_{s}[g]=\Sigma_{t\in s}\gamma_{g}(t) Ns[g]=Σtsγg(t);

  • Σ t ∈ s \Sigma_{t\in s} Σts:表示说话人s说的所有的话加在一起,也就是总帧数,t表示总帧数中的其中一帧;

  • γ g ( t ) \gamma_{g}(t) γg(t):在观测时刻t上,在第g个高斯成分上的后验概率,也就是在当前模型参数下第t个观测数据来自第g个分模型的概率,称为分模型g对观测时刻t的响应度;

M维的特定句子相关的统计量(特定说话人s说的特定句子h也就是该说话人说的每一句都用M维的GMM表示,GMM对每个说话人的每一句话的响应度): N ( h , s ) [ g ] = Σ t ∈ ( h , s ) γ g ( t ) N_{(h,s)}[g]=\Sigma_{t\in (h,s)}\gamma_{g}(t) N(h,s)[g]=Σt(h,s)γg(t)

  • Σ t ∈ ( h , s ) \Sigma_{t\in (h,s)} Σt(h,s):表示说话人S说的其中一句话ht表示特定句子h中的其中一帧;

  • 同理, γ g ( t ) \gamma_{g}(t) γg(t)的意义在这里就不再赘述;

进一步分析,我们用 X s X_{s} Xs X ( h , s ) X_{(h,s)} X(h,s)分别代表说话人和特定句子的一阶统计量,对每一帧提取D维特征,大小为M x D的向量;

M x D维的特定说话人相关的统计量: { X s } [ g ] = Σ t ∈ s γ g ( t ) ⋅ t \{X_{s}\}_{[g]}=\Sigma_{t\in s}\gamma_{g}(t)\cdot{t} {Xs}[g]=Σtsγg(t)t

M x D维的特定句子相关的统计量: { X ( h , s ) } [ g ] = Σ t ∈ ( h , s ) γ g ( t ) ⋅ t \{X_{(h,s)}\}_{[g]}=\Sigma_{t\in (h,s)}\gamma_{g}(t)\cdot{t} {X(h,s)}[g]=Σt(h,s)γg(t)t

感觉总体估计就是在造脚手架,脚手架造好了,并且需要知道的是这个四个脚手架都是直接用UBM中估计的就行,就可以继续了。

注:

  • 统计量:我在知乎上看到一个通俗易懂的解释就是说,你有一批苹果进行估计,那么我们怎么估计苹果的特征呢,可以炸成果汁,果汁就是统计量,数学上讲统计量就是个函数。而对零阶、一阶和二阶,我的个人认为指的是特征变量的个数,有几个影响因子?!

  • 所有的后验概率均由UBM模型计算而来

2. 隐变量估计

隐变量主要是对信道因子也就是i-vector( x ( h , s ) x_{(h,s)} x(h,s))和说话人因子( y s y_{s} ys)进行估计。首先还需要做一些脚手架。

X ˉ s \bar{X}_{s} Xˉs X ˉ ( h , s ) \bar{X}_{(h,s)} Xˉ(h,s)分别代表说话人和信道的统计量:

  • { X ˉ s } [ g ] = { X s } [ g ] − Σ h ∈ s N ( h , s ) [ g ] ⋅ { U x ( h , s ) } [ g ] \{\bar{X}_{s}\}_{[g]}=\{{X}_{s}\}_{[g]}-\Sigma_{h\in s}N_{(h,s)}[g]\cdot\{Ux_{(h,s)}\}_{[g]} {Xˉs}[g]={Xs}[g]ΣhsN(h,s)[g]{Ux(h,s)}[g] :说话人统计量把所有句子相关的信道因子减去了;

  • { X ˉ ( h , s ) } [ g ] = { X ( h , s ) } [ g ] − Σ h ∈ s N ( h , s ) [ g ] ⋅ { m + D y ( s ) } [ g ] \{\bar{X}_{(h,s)}\}_{[g]}=\{{X}_{(h,s)}\}_{[g]}-\Sigma_{h\in s}N_{(h,s)}[g]\cdot\{m+Dy_{(s)}\}_{[g]} {Xˉ(h,s)}[g]={X(h,s)}[g]ΣhsN(h,s)[g]{m+Dy(s)}[g]:信道统计量把所有说话人相关的说话人因子减去了;

再引入两个矩阵, L ( h , s ) L_{(h,s)} L(h,s)是一个大小为R X R的矩阵, B ( h , s ) B_{(h,s)} B(h,s)为一个大小为R x 1的向量:

  • L ( h , s ) = I + Σ g ∈ U B M N ( h , s ) [ g ] ⋅ { U } g t ⋅ Σ [ g ] − 1 ⋅ { U } [ g ] L_{(h,s)}=I+\Sigma_{g\in UBM}N_{(h,s)}[g]\cdot\{U\}^{t}_{g}\cdot\Sigma^{-1}_{[g]}\cdot\{U\}_{[g]} L(h,s)=I+ΣgUBMN(h,s)[g]{U}gtΣ[g]1{U}[g]

  • B ( h , s ) = Σ g ∈ U B M { U } g t ⋅ Σ g − 1 ⋅ { X ˉ ( h , s ) } [ g ] B_{(h,s)}=\Sigma_{g\in UBM}\{U\}^{t}_{g}\cdot\Sigma^{-1}_{g}\cdot\{\bar{X}_{(h,s)}\}_{[g]} B(h,s)=ΣgUBM{U}gtΣg1{Xˉ(h,s)}[g]

其中, Σ g \Sigma_{g} Σg代表第g个UBM成分中的协方差矩阵

有了上面的这些脚手架,就可以计算信道因子和说话人因子了,如下:

  • x ( h , s ) = L ( h , s ) − 1 ⋅ B ( h , s ) x_{(h,s)} = L^{-1}_{(h,s)}\cdot B_{(h,s)} x(h,s)=L(h,s)1B(h,s)

  • { y s } [ g ] = τ ( τ + N s [ g ] ) ⋅ D g ⋅ Σ g − 1 ⋅ { X ˉ s } [ g ] \{y_{s}\}_{[g]}=\frac{\tau}{(\tau + N_{s}[g])}\cdot D_{g}\cdot \Sigma^{-1}_{g} \cdot\{\bar{X}_{s}\}_{[g]} {ys}[g]=(τ+Ns[g])τDgΣg1{Xˉs}[g]
    其中, D g = Σ g 1 / 2 τ D_{g}=\frac{\Sigma^{1/2}_{g}}{\sqrt{\tau}} Dg=τ Σg1/2,其中 τ \tau τ是MAP相关因子,在实验中取14.0

3. 信道总体变化矩阵估计

信道总体变化矩阵U的估计可以通过一行一行的估计,因为U的维度是M X D X R,也就是M个大小为D X R矩阵,即: { U [ g ] i } \{U^{i}_{[g]}\} {U[g]i}可由i行的 { U [ g ] } \{U_{[g]}\} {U[g]}合并而来,公式如下:

U [ g ] i = L U g − 1 ⋅ R U g i U^{i}_{[g]} = LU^{-1}_{g}\cdot RU^{i}_{g} U[g]i=LUg1RUgi

其中:

  • L U g = Σ s Σ h ∈ s ( L h , s − 1 + X ( h , s ) X ( h , s ) T ) ⋅ N ( h , s ) [ g ] LU_{g}=\Sigma_{s}\Sigma_{h\in s}(L^{-1}_{h,s} + X_{(h,s)}X^{T}_{(h,s)})\cdot N_{(h,s)}[g] LUg=ΣsΣhs(Lh,s1+X(h,s)X(h,s)T)N(h,s)[g]

  • R U g i = Σ s Σ h ∈ s { X ˉ ( h , s ) } [ g ] [ i ] ⋅ X ( h , s ) RU^{i}_{g}=\Sigma_{s}\Sigma_{h\in s}\{\bar{X}_{(h,s)}\}_{[g]}{[i]}\cdot X_{(h,s)} RUgi=ΣsΣhs{Xˉ(h,s)}[g][i]X(h,s)

在说话人确认中的一种新的补偿方法

这个名字起得挺不好理解,具体就是在说话人确认的评估工作中,会有注册者和测试者,删掉了信道变化因子部分,相当于对均值超向量进行补偿,即:

m s t a r = m + D y s t a r m_{s_{tar}}=m+Dy_{s_{tar}} mstar=m+Dystar

m s t e s t = m + D y s t e s t m_{s_{test}}=m+Dy_{s_{test}} mstest=m+Dystest

分别代表目标说话人和测试说话人,这样只需要对于不同说话人进行估计就好,不会在评估过程中涉及归整信道。

那么涉及到如何具体打分,有两种方法:

4.1 基于对数似然比率进行打分
计算两个说话人之间的距离:

L L K ( y ∣ m ( h t a r , s t a r ) ) − L L K ( y ∣ m ) LLK(y \mid m_{(h_{tar},s_{tar})})-LLK(y \mid m) LLK(ym(htar,star))LLK(ym)

其中, L L K ( ⋅ ∣ ⋅ ) LLK(\cdot | \cdot) LLK()是求对于所有帧的对数似然,同样求似然时,两个m的GMM中的协方差矩阵和混合权重都是相同的,即在训练中估计出来的数值。

这种是一种baseline的做法,本文的做法当然是下一种。

4.2 基于核函数和SVM建模进行打分
根据作者提出的因子分析模型在说话人确认的估计中只估计包含说话人信息的部分,信道部分是归一化的。通过一个SVM分类器计算GMM之间的距离,给出计算两个说话人之间的距离:

K ( X s , X s ′ ) = Σ g = 1 M ( α g Σ g − 1 / 2 m s g ) t ( α g Σ g − 1 / 2 m s ′ g ) K(X_{s},X_{s^{'}})=\Sigma^{M}_{g=1}(\sqrt{\alpha_{g}}\Sigma^{-1/2}_{g}m^{g}_{s})^{t}(\sqrt{\alpha_{g}}\Sigma^{-1/2}_{g}m^{g}_{s^{'}}) K(Xs,Xs)=Σg=1M(αg Σg1/2msg)t(αg Σg1/2msg)

其中, X s X_{s} Xs X s ′ X_{s^{'}} Xs分别是说话人 s s s和说话人 s ′ s^{'} s说的两句话, m s m_{s} ms来自于上面混合domain无信道变化因子的式子。上述计算称为核函数的计算,但是强调在GMM的均值向量都不相同的时候成立,同样两个m的GMM中的协方差矩阵和混合权重都是相同的。

以上就是整篇论文的核心思路~

一些想法

  • 初来乍到,刚开始看i-vector,找到了这篇论文,论文是07年发表的,从整篇论文中看得出当时流行的JFA思想;
  • 论文中露出一些i-vecvor的思想,但是方向与i-vector有些偏差,本文中把信道因子的那部分删掉了,而i-vector中保留的正式信道因子部分,把说话人因子删掉了;
  • 因子分析这部分数学公式蛮多的,许多公式看不懂,但是看多了,自然就懂些了,但是一定不要忘了坚持继续向前走;
  • 一定要和实践相结合,多跑代码,也别忽略了理论,既然选择了语音方向,就要比其他方向付出更多的努力;
  • 最近在研究kaldi,看一些经典的论文作为总结,还会继续更新;

寻求一起致力于kaldi声纹识别的小伙伴,大家一起努力,小伙伴们请加群729152186729152186729152186,我们一起加油!!!

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页