声纹识别基本概念汇总

作为一名刚接触深度学习的小白,第一个任务就是让我搞个声纹识别,难顶啊....

那么来总结一下声纹识别里的基本概念以及常用的方法,梳理一下比较清楚。

基本概念

人体语音学基本概念

  • 元音,vowel; 按气流的受阻程度分,“唯二”的两个半元音是:i,u;
  • 辅音,consonant;
  • 音节,syllable;由一个或几个音素构成的最小的语音结构单位;
  • 音素,phoneme;是语音中最小的单位,依据音节的发音动作来分析,一个动作构成一个音素。

    • 如:a,i。“ai”不是音素,因为ai=a+i
  • 音子,phone;语音识别建模时的单位,根据需要可以是音节、音素等,或者是更小的单位;
  • senone,(无中文翻译);音子又可以分为多个状态,如:开始,中间,结束。如果不同音子的同一状态相同,则可合并;而这些不同的状态,就叫做senone。

声纹

声纹(Voiceprint),是用电声学仪器显示的携带声音信息的声波频谱。研究表明,声纹不仅具有特定性而且还具有稳定性,所以在人类成年之后,每个人说话的声音都是有各自的特点的,因此类似于指纹,声纹也是可以用来特定区分人的身份的。

声纹识别

声纹识别,也叫说话人识别,是用来区分不同人的声音,从而通过声音确定不同人的身份。为了识别声纹,不能只用耳朵听啊,比较明显的老人、年轻人,男人、女人,熟人、陌生人,确实能用人耳分辨出来,但是对于一些声音比较类似的人的声音,只用耳朵听就不那么好使了,况且就算用耳朵去听,假如有很多人的语音需要识别,光用人工那得花多少人力物力啊,所以我们把这个任务交给计算速度超快的计算机来完成。

由于每个人的发声部位的不同,发声器官、肺、口腔、牙齿、气流等的差异,任何两个人的声纹基本上是不一样的,所以声纹的的确确可以用来区分人的身份。想想看,这是不是比指纹识别方便多了,完全不用伸手,只需要说几句话就能确认你的身份。

声纹识别的分类

根据不同的角度,声纹识别可以分为三类。

根据不同的应用类型来分。

声纹辨认和声纹确认

声纹辨认(Speaker Identification,SI)的意思是对于一段需要识别的语音,从语音库中找出哪个人的语音与该语音最相似,也称为1:N型。

声纹确认(Speaker Verification,SV)的意思是对于一段需要识别的语音,还要提供需要将这段语音和谁匹配,确定该语音是不是和需要确认的说话人的语音匹配,也称为1:1型。

根据不同的使用场合来分

文本相关、文本无关和文本提示

文本相关(Text-Dependent,TD)指说话人在注册和验证时必须说出指定的文本。

文本无关(Text-Independent,TI)指说话人在注册和验证时只需要随意录制一段时间的语音即可,不需要关注其语音的内容。

根据不同识别方法来分

闭集识别和开集识别

闭集识别指需要识别的说话人已在训练集中,而开集识别指需要被识别的说话人不在训练集中,可以说计算机压根就没见过这个说话人。

声纹识别分类

声纹识别分类

常用方法

处理方法

对齐

知道哪段区域发了什么音,找到什么时间每帧发哪个音。对齐的目的就是要知道每帧属于哪个音,什么类别。

分帧

说话人识别或者语音识别的第一步就是特征提取。特征提取是将输入的样点序列转换长特征向量序列,一个特征向量用于表示一个音频片段,称为一帧(Frame)。一帧包含若干个样本点,通常来说,使用25ms作为帧长(Frame length)。但是为了避免帧之间的特征突变,通常每隔10ms取一帧,即帧移(Frame Shift)为10ms。这样一来,每个帧与前一个帧、后一个帧就会有重叠的部分(首帧只与后一帧有重叠,尾帧只与前一帧有重叠)。

分帧示意图

分帧示意图

简而言之,语音信号整体上不稳定,但局部上可以看作是稳定的,在以后的语音处理中,需要输入一个稳定的信号,所以需要对整个语音信号进行帧处理,即将其分割成多个片段。

加窗

在对语音信号进行分帧之后,然后每一帧都当成平稳信号来处理,后面会用傅立叶级数展开每一项,以获取梅尔频谱特征,这时问题就出来了。

将具有不连续点的周期函数(如矩形脉冲)进行傅立叶级数展开后,选取有限项进行合成。当选取的项数越多,在所合成的波形中出现的峰起越靠近原信号的不连续点。当选取的项数很大时,该峰起值趋于一个常数,大约等于总跳变值的9%。这种现象称为吉布斯效应。

若出现了吉布斯效应,信号在分帧处理之后,就会越来越背离原始信号。此时我们需要对信号进行加窗处理,目的就是为了减少帧起始和结束的地方信号的不连续性问题。

总结一下,加窗的目的大致有以下两点:

  • 使全局更加连续,避免出现吉布斯效应
  • 加窗之后,使原本没有周期性的语音信号呈现出周期函数的部分特征

预加重

语音信号的预加重,目的是为了对语音的高频部分进行加重,去除口唇辐射的影响,增加语音的高频分辨率。

VAD

VAD(Voice Activity Detection)全称语音活动检测,又称语音端点检测,语音边界检测。目的是为了除去在一段语音中静音的部分。在使用python进行VAD处理时可以检测每帧语音的信号能量,通过设定一个阈值,信号能量低于阈值的可认为是静音,将静音部分删除,再将其余部分拼接起来,就完成了VAD去静音处理。

特征

Fbank&MFCC

人耳对声音频谱的响应是非线性的,经验表明:如果我们能够设计一种前端处理算法,以类似于人耳的方式对音频进行处理,可以提高语音识别的性能。语音特征提取本质上起到的是降维作用,用较少的维数表现了说话人的特征。FilterBank就是这样的一种算法。FBank特征提取要在预处理之后进行,这时语音已经分帧,我们需要逐帧提取FBank特征。

Fbank和MFCC都是对语音进行特征提取的过程,其计算方式如下:

Fbank和MFCC提取过程

Fbank和MFCC提取过程

MFCC比Fbank多一步DCT,去除各维信号之间的相关性,将信号映射到低维空间若去除这一步,得到的则是Filter Bank特征,因为DNN模型可以学习特征间的相关性,因此不需要去相关性的操作。

MFCC是在FBank的基础上进行的,所以MFCC的计算量更大。

FBank特征相关性较高,MFCC具有更好的判别度,这也是在大多数语音识别论文中用的是MFCC,而不是FBank的原因。

deep feature

bottleneck feature

tandem feature

模型&算法

高斯混合模型-通用背景模型(GMM-UBM)

SGM

SGM(Single Gaussian Model)全称单高斯模型,单高斯分布模型在二维空间上近似于椭圆形,在三维空间上近似于椭球形。由多个SGM会构成GMM,每个SGM称为一个component,这些component的线性加权在一起就组成了GMM的概率密度函数。

来看看SGM的概率密度函数:

  1. 当一个一维向量$X$服从高斯分布时,它的概率密度函数定义为

$${\cal N}(x;\mu,\sigma^2)=\cfrac{1}{(2\pi\sigma^2)^{1/2}}exp{[-\cfrac{1}{2\sigma^2}{(x-\mu)}^2]}$$

这里,$\mu$表示均值,$\sigma^2$表示方差。

  1. 当一个多维向量$X$服从高斯分布时,它的概率密度函数定义为

$$\mathcal N(x; \mu, \Sigma) = \cfrac{1}{(2\pi)^{D/2}}\cfrac{1}{(|\Sigma|)^{1/2}}exp{[-\cfrac{1}{2}{(x-\mu)}^T\Sigma^{-1}(x-\mu)]}$$

这里,$\mu$表示均值,$\Sigma$表示$D*D$的协方差矩阵,$|\Sigma|$为该协方差的行列式的值。

GMM

GMM(Gaussian Mixture Model)全称高斯混合模型,由多个单高斯模型线性加权而得。假设GMM由K个SGM组成,则其概率密度函数为

$${\cal P}(x) = \sum_{k = 1}^{K}{p(k)p(x|k)} = \sum_{k = 1}^{K}{\pi_k {\cal N}(x;\mu_k,\Sigma_k)}$$

其中,$\pi_k$表示第$k$个component的概率(或权重),$\mu_k$表示第$k$个component的均值,$\Sigma_k$表示第$k$个component的协方差矩阵。每个component表示为${\cal N}_k\sim(\mu_k,\theta_k),k=1,2,3,...,K$,分布对应一个聚类中心,每个聚类中心的坐标可以看成是$(\mu_k,\theta_k)$,对于一个样本$x_i$,它属于第$k$个聚类中心的可能性为$\pi_k$,$\pi_k\sim(0,1)$。

GMM-UBM

高斯混合模型(Gaussian Mixture Model)作为一种通用的概率模型,能有效的模拟多维矢量的任意连续的概率分布,因此很适合文本无关的说话人识别。那什么是通用背景模型(Universal Background Model)呢?稍后再说。GMM将空间分布的概率密度用多个高斯概率密度函数的加权来拟合,可以平滑的逼近任意形状的概率密度函数,并且是一个易于处理的参数模型,具备对实际数据极强的表征力。GMM规模越庞大,表征力越强,但是其负面效应也会越明显,就是参数规模也会等比例的膨胀,需要更多的数据来驱动GMM的参数训练才能得到一个更加通用(更泛化)的模型。

实际项目中,可能每个人没有那么多的数据提供给GMM,所以这将导致无法训练出高效的GMM模型。并且由于多通道的问题,训练GMM模型的语音与测试语音存在失配的情况,这些因素都会降低声纹识别系统的性能。所以由DA Reynolds团队提出了UBM,也就是通用背景模型了。

现在的问题就是无法提供一个人的大量的语音数据,导致无法得到一个很好的GMM模型,那么现在的办法就是不去收集需要用来训练的每个人的大量语音样本,我们先从其他地方,比如说从专门的开源网站提供的开源数据集中拿到许多非目标用户的语音样本训练一个UBM。然后再对UBM进行调整,形成一个很好适应目标用户的GMM模型。说的通俗一点,就是我们没有很多目标用户的数据,但是我们可以找到很多非目标用户的数据,用非目标用户的数据让计算机知道现在的任务是做声纹识别,而不是做其他任务,让计算机有一个先验知识,对语音特征在空间分布的概率模型给出一个良好的预先估计,然后将目标用户的数据在这个模型上进行参数的微调即可。

训练UBM模型的方法和训练GMM的方法是一致的,都是通过EM算法,不停地更新三组GMM的参数,权重,均值,方差,最后达到收敛。而我们使用的数据是部分个人的,整体的。之后,我们再使用自适应算法,比如MAP算法,比如说MLLR算法,对原本UBM的参数进行自适应调整,结果就是我们对每一个人都适应了一个模型。之后,我们提取这个GMM模型的所有成分的均值信息,拼接起来,就可以得到那个我们需要的”最大的特征“。这个最大的特征就是均值超矢量。

GMM—UBM流程

GMM—UBM流程

EM(Expectation Maximization)算法

啥是EM算法?EM算法全称是最大期望算法。是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐性变量。

最大期望算法经过两个步骤交替进行计算:

第一步是计算期望(E),利用对隐藏变量的现有估计值,计算其最大似然估计值;

第二步是最大化(M),最大化在E步上求得的最大似然值来计算参数的值。M步上找到的参数估计值被用于下一个E步计算中,这个过程不断交替进行。

具体了解可以看这里,讲的比较好,也比较全面。

极大后验概率(MAP)算法

在GMM-UBM系统框架中,UBM拟合出大量说话人的特征分布,目标用户的数据散落在UBM某些高斯分布的附近。其中自适应的过程就是将UBM的每个高斯分布向目标用户数据偏移。极大后验概率(MAP)算法就是解决这种问题的算法之一。

我们对目标用户的GMM模型自适应的过程分为两个步骤:

  1. 首先,使用目标说话人的训练数据计算出UBM模型的新参数(高斯权重、均值和方差);
  2. 将得到的新参数与UBM模型的原参数进行融合,从而得到目标说话人的模型

总而言之,MAP将预先训练过的模型向目标说话人模型进行微调。这种方式可以大大减少训练所需要的样本量和训练时间(通过减少训练参数)。

MAP处理过程

MAP处理过程

当一个新的数据点来到的时候,我们需要首先确定当前的数据点是属于UBM分布的哪一个分量。然后,我们根据下面的公式对该分布的参数进行响应的更新,更新的公式如下所示:

$$\widetilde{\mu}=\frac{\tau\mu_0+\sum_n \gamma(n)x_n}{\tau+\sum_n\gamma(n)}$$

其中,$\tau$ 是超参,控制UBM和特定人语音数据之间的平衡。$μ_0$是UBM的均值,在之前使用EM算法求得的结果。$x_n$是自适应的新的个人的数据。$\gamma$是当前数据特征在当前GMM中成分的概率。

最大似然线性回归(MLLR)算法

MLLR(maximum likelihood linear regression)算法同样也作为自适应算法之一。提出该算法的原因是,MAP算法有一个缺点,针对每一个数据点来说,它所更新的成分是固定的。而又由于实际中,一个UBM中的成分很多,因此,每次更新到的参数对比之下少太多了。于是,MLLR算法就像通过线性的方法,去训练一个统一的转换模型。对每一个UBM的成分,对它的均值做一个线性的变换。下面参数$A$以及$b$就是我们要求解的变换。

$$\hat{\mu}=A\mu+b$$

我们通过最大化它的似然函数,来求得最优的线性转换。它的似然函数如下所示:

$$L=\sum_r\sum_n \gamma_r(n)log[K_re^{-\frac12(x_n-W\eta_r)}\sum_r^{-1}(x_n-W\eta_r)]$$


支持向量机(SVM)

在GMM-UBM模型中,在自适应环节只是对UBM模型在目标人数据上做了均值的自适应。GMM-UBM算法可以解决目标人数据不足导致的建模效果太差的问题,但是不能消除由信道干扰导致的说话人信息的扰动。换句话说,用iPhone手机在云端注册模型,换个小米手机拿来做识别就不通过了。这是因为声音是通过录音设备进行采集的,不同的型号的录音设备对语音都会造成一定程度上的畸变,同时由于背景环境和传输信道等的差异,对语音信息也会造成不同程度的损伤。

WM Campbell将支持向量机引入了GMM-UBM的建模中,通过将GMM每个高斯分量的均值单独拎出来,构建一个高斯超向量(Gaussian Super Vector,GSV)作为SVM的样本,利用SVM核函数的强大非线性分类能力,在原始GMM-UBM的基础上大幅提升了识别的性能,同时基于GSV的一些规整算法,例如扰动属性投影(Nuisance Attribute Projection, NAP),类内方差规整(Within Class Covariance Normalization,WCCN)等,都在一定程度上补偿了由于信道易变形对声纹建模带来的影响。


因子分析(FA)

在MAP框架下,我们都是单独去调整GMM的每一个高斯分量,参数太多太累了,那有没有办法同时调整一串高斯分量呢?我们借助了因子分析(Factor Analysis,FA)的算法框架,只用数百个基向量的线性组合(每个基向量的权重就可以看作是在这个基坐标上的坐标点),就足够能表征全体高斯超向量的变化了,也就是说,我们现在只需要几百个变量(通常为400~600),就足够表示一个50000维度的高斯分量均值集合!

基向量的估计是通过一种称为基于概率的主成份分析的(Probabilistic Principal Component Analysis, PPCA)的类EM算法,基于海量的背景说话人数据学习而来。这样少量的数据就能实现GMM高斯分量的整体参数估计,随着数据量的增加,GMM会迅速趋于一个稳定的参数估计。

联合因子分析(JFA)

既然声纹信息可以用一个低秩的超向量子空间来表示,那噪声和其他信道效应是不是也能用一个不相关的超向量子空间进行表达呢?加拿大蒙特利尔研究所(Computer Research Institute of Montreal,CRIM)的科学家兼公式推导帝Patrick Kenny提出了联合因子分析(Joint Factor Analysis,JFA)的理论分析框架,将说话人所处的空间和信道所处的空间做了独立不相关的假设,在JFA的假设下,与声纹相关的信息全部可以由特征音空间(Eigenvoice)进行表达,并且同一个说话人的多段语音在这个特征音空间上都能得到相同的参数映射,之所以实际的GMM模型参数有差异,都是由特征信道(Eigenchannel),即信道效应的干扰导致的,我们只需要同时估计出一段语音在特征音空间上的映射和特征信道上的映射,然后撇掉特征信道上的干扰就可以实现更好的声纹环境鲁棒性。


隐马尔科夫模型(HMM)

隐马尔科夫模型(Hidden Markov Model)是基于概率统计的模型,用于描述一个含有隐含未知参数的马尔科夫过程。HMM的核心是状态,因为状态本身是一个通常取离散值的变量。当一个离散状态的值被一般化为一个新的随机变量时,马尔科夫链便一般化为隐马尔科夫序列,或者当它用于表现或近似实际生活中序列的统计特性时,会被一般化为隐马尔科夫模型。

由于HMM能够描述语音信号中不平稳但有规律并可学习的空间变量,同时它具有顺序排列的马尔科夫状态,使得HMM可以分段的处理短时平稳的语音特征,并以此逼近全局非平稳的语音特征序列。隐马尔科夫模型曾广泛应用于声纹、语音识别领域。


评估

cosine similarity

余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。

$$cos\theta=\frac{\vec x \cdot\vec y}{||x||\cdot||y||}$$

在说话人识别时,可用此方法计算提取出的两个说话人语音的embedding向量的相似度,得到分数,设定阈值,进而通过分数与阈值的大小情况来判断两段语音是否属于同一说话人。

在python中,可使用以下代码来计算:

from sklearn.metrics.pairwise import cosine_similarity
score=cosine_similarity([emb1, emb2])[0][1]

PLDA

PLDA有两篇经典文章,思想相同,但实现有所差异,且没有互相引用。

参考文献11的方法如下

PLDA生成模型的公式为

$$\bf{x}_{ij}=\mu+\bf{F}h_i+\bf{G}{w}\bf{}_{ij}+\epsilon_{ij}$$

我们假设训练数据语音由$I$个说话人的语音组成,其中每个说话人有$J$段自己不同的语音。那么,我们定义第$i$个说话人的第$j$条语音为$\bf{x}_{ij}$。

$\mu+\bf{F}h_i$只跟说话人有关而跟说话人具体的某一条语音无关,称为信号部分,这里描述的是说话人的类间的差异。$\mu$表示全体训练数据的均值,$\bf{F}$可以看做是身份空间,包含了可以用来表示各种说话人的信息,$\bf{h}_i$可视为具体的一个说话人的身份(或是说话人在身份空间中的位置)。

$\bf{G}{w}\bf{}_{ij}+\epsilon_{ij}$描述了同一说话人的不同语音之间的差异,这里为噪音部分。$\bf{G}$表示误差空间,包含了可以用来表示同一说话人不同语音变化的信息,$\bf{w}_{ij}$表示第$i$个说话人的第$j$条语音在误差空间$\bf{G}$中的位置,$\epsilon_{ij}$是残留噪声项,用来表示尚未解释的东西。

$\bf{h}$和$\bf{w}$可以分看作是分别在各自空间的特征表示,比如$\bf{h}_i$就可以看作是$\bf{x}_{ij}$在说话人身份空间中的特征表示,$\bf{w}_{ij}$表示第$i$个说话人的第$j$条语音在误差空间$\bf{G}$中的位置。在识别打分阶段,如果两条语音的$\bf{h}_i$特征相同的似然度越大,那么两条语音更大概率属于同一个人。

该模型的参数有4个,分别是训练数据均值$\mu$、身份空间$\bf{F}$、误差空间$\bf{G}$、噪声协方差$\Sigma$。在模型训练阶段,使用EM算法去最大程度的拟合训练数据集$\bf{x}$的参数$\theta=\{\mu,\bf{F},G,\Sigma\}$,如果我们能知道隐变量$\bf{h}_i$和$\bf{w}_{ij}$就会很容易,但是问题就在于这两项未知,只能通过EM算法来迭代估计,保证每次迭代的似然度是增长的。

EM算法这里省略...(可阅读论文《Probabilistic linear discriminant analysis for inferences about identity》详细了解EM算法过程)

在之前是基于cosine距离来计算两个embedding的相似度给出得分的。在训练好PLDA模型后,我们计算俩条语音是否由说话人身份空间中的特征$\bf{h}_i$生成,或者由$\bf{h}_i$生成的似然程度,而不用去管类内空间的差异。下面给出得分公式:

$$score=\log\frac{p(\eta_1,\eta_2|{\cal H_s})}{p(\eta_1|{\cal H_d})p(\eta_2|{\cal H_d})}$$

其中,$\eta_1$和$\eta_2$是两个语音通过模型提取出的embedding,这两条语音来自同一空间的假设为${\cal H_s}$,来自不同的空间的假设为${\cal H_d}$。其中$p(\eta_1,\eta_2|{\cal H_s})$为两条语音来自同一空间的似然函数,$p(\eta_1|{\cal H_d})$,$p(\eta_2|{\cal H_d})$分别为$\eta_1$和$\eta_2$来自不同空间的似然函数。通过计算对数似然比,就能衡量两条语音的相似程度。比值越高,得分越高,两条语音属于同一说话人的可能性越大;比值越低,得分越低,则两条语音属于同一说话人的可能性越小。

参考文献12的方法如下
(这数学公式也太难顶了。PS:先记下来,以后熟悉了再看看)

在Kaldi中,实现了论文《Probabilistic linear discriminant analysis》中的方案。该方案的PLDA的核心思想是把样本映射到一个隐空间。对于样本$x$,$x$是一段语音的embedding,也可以是一张图像等。样本$x$的分布由协方差矩阵正定一个GMM定义,如果已知$x$属于某个高斯分量,且该高斯分量的均值点为$y$,那么:

$$P(x|y)={\cal N}(x|y,{\mit \Phi}_\omega)$$

上式中,$\Phi_\omega$是正定的协方差矩阵,$y$的先验概率同样满足高斯分布:

$$P(y)={\cal N}(y|m,{\mit \Phi}_b)$$

用这种方式表示的$x$如下图所示。

用预设均值的高斯分布表示样本

用预设均值的高斯分布表示样本

假设${\mit \Phi}_\omega$正定,${\mit \Phi}_b$半正定,那么我们可以找到一个非奇异矩阵$V$,使得:

$$V^T{\mit \Phi}_bV={\mit \Psi}$$

$$V^T{\mit \Phi}_\omega V=I$$

其中${\mit \Psi}$为对角阵,$I$为单位阵。

如果定义$A=V^{-T}$,那么:

$${\mit \Phi}_b=A{\mit \Psi}A^T$$

$${\mit \Phi}_\omega=AA^T$$

把${\mit \Phi}_\omega$和${\mit \Phi}_b$对角化后,我们可以把$x$映射到一个隐空间,在这个隐空间$u$表示样本,通过仿射变换$x=m+Au$与$x$建立联系。在这个隐空间中,$u$满足如下高斯分布:

$$u\sim{\cal N}(·|v,I)$$

$v$作为隐空间中的类别,满足:

$$v\sim{\cal N}(·|0,\mit{\Psi})$$

这样,就可以利用隐空间中的$u$表示样本,如下图所示。

用隐空间中的向量表示样本

用隐空间中的向量表示样本

上述这种把样本映射到隐空间的建模方法称为PLDA。

在隐空间汇总可与预测样本$x$的类别。与常见的分类模型不同的是,即使训练数据中从未出现过某类别,仍然可以通过计算样本是否和该类样本属于同一类别而将样本分为此类。考虑有$M$个类别的参考样本$(x^1,...,x^M)$,现在有一个待测样本$x^p$,要预测该样本属于$1\sim M$的哪一类。

我们首先按照映射关系$x=m+Au$把所有的$(x^1,...,x^M)$和$x^p$映射到隐空间:

$$u=A^{-1}(x-m)$$

对$(u^1,...,u^M)$中的每个$u^g$,可计算该样本和$u^p$属于同一类的概率:

$$P(u^p|u^g)={\cal N}(u^p|\frac{\mit\Psi}{\mit\Psi+I}u^g,I+\frac{\mit\Psi}{\mit\Psi+I})$$

如果$M$类参考样本中每类有$n$个样本,在上式中取$u^g$的平均值$\overline u^g$即可,即:

$$P(u^p|u^g_{1...n})={\cal N}(u^p|\frac{n\mit\Psi}{n\mit\Psi+I}\overline u^g,I+\frac{\mit\Psi}{n\mit\Psi+I})$$

选取使$P(u^p|u^g_{1...n})$最大的$u^g_{1...n}$,就得到了对$u^p$的分类结果。

对于这个PLDA模型,需要训练的参数有均值向量$m$,协方差矩阵$\mit\Psi$,线性变换$A$。通过EM算法训练得到这些参数。至此,Kaldi中实现的PLDA打分后端的过程就是这些。

均值超矢量

均值超矢量(supervector)是GMM-UBM模型的最终结果。在GMM-UBM框架下,说话人模型是从UBM模型自适应得到的,过程中只改变了均值的大小,因此说话人之间的区别信息都蕴含在GMM的均值矢量中。将说话人GMM模型的每个高斯成分的均值堆叠起来,形成一个高维的超矢量,即为均值超矢量。假设语音声学特征参数的纬度为P,GMM的混合度为M(M个高斯成分),那么这个GMM的均值超矢量的维度为MP。均值超矢量生成过程如下图:

GMM超均值矢量

GMM超均值矢量

评判标准

使用对数似然比进行评价。用测试数据分别与模型和UBM进行似然度比较,然后将这两个似然相除再取对数,用得到的值作为打分来评价一条测试数据是否和模型匹配。由于UBM代表了最最普遍的平凡的语音特征,而模型代表了属于这一个说话人的特征。用对数似然比来表示,就是评价测试数据到底和模型更接近还是和UBM最接近。最后设定一个阀值,用来进行最后的分类判断。

i-vector

目前UBM-MAP-GMM是一种说话人确认技术的标准系统,在JFA模型下,我们可以把生成式模型扩展成为具有说话人部分(本征音空间矩阵V)和信道部分(本征信道空间矩阵U)这两个联合模型。但是,在JFA的实际使用中,我们发现说话人部分和信道部分没办法完美分离,还会存在一定的干扰。受到JFA理论的启发,Dehak提出了从GMM均值超矢量中提取一个更紧凑的矢量,称为I-Vector。即为Identity-Vector。

在I-Vector模型中,我们采用全局差异空间(Total Variability Space,T),即包含了说话者之间的差异又包含了信道之间的差异。所以I-Vector的建模过程在GMM均值超矢量中不严格区分话者的影响和信道的影响。

给定说话人$s$的一段语音$h$,这一新的说话人及信道相关的GMM均值超矢量定义为如下公式:

$$M_{s,h}=m_u+T\omega_{s,h}$$

其中,$m_u$是说话人与信道独立的均值超矢量,即为UBM的均值超矢量,该超矢量与具体说话人以及信道无关;$T$为全局差异空间矩阵,$\omega$为全局差异空间因子,它的后验均值,即为I-Vector矢量,它先验地服从标准正态分布。$M_{s,h}$服从均值$m_u$协方差矩阵为的$TT^*$正态分布。

在给定的公式中,$M$和$m$是我们可以计算的出的,而全局差异空间矩阵$T$和全局差异空间因子$\omega$是我们需要估计的。我们使用EM算法对$T$进行估计,步骤如下。

1、计算训练数据库中每个说话人所对应的Baum-Welch统计量

2、随机产生$T$的初始值。采用如下EM算法,迭代估计$T$矩阵

​ E-Step:计算隐变量$\omega$的后验分布,$\omega _{s,h}$的后验均值和后验相关矩阵的期望形式。

​ M-Step:最大似然值重估,重新更新$T$矩阵。

多次迭代(大概10次)之后,得到全局差异空间矩阵$T$。

得到$T$后,接下来就可以提取I-vector了,即$\omega_{s,h}$,步骤如下。

1、计算数据库中每个目标说话人所对应的Baum-Welch统计量

2、读入已训练好的全局差异空间矩阵$T$

3、把已知的代入式中$M_{s,h}=m_u+T\omega _{s,h}$,求出$w_{s,h}$,然后计算$w_{s,h}$的后验均值,即I-vector。

这样,每个目标说话人都有一个与之对应的I-Vector了。

嵌入向量

前面使用的是提取超均值矢量i-vector的方法为每个说话人提取表征特定说话人身份的向量,虽然i-vector基于GMM且训练无须为说话人识别的目标打标签,属于无监督训练,是一种优势。但是在今天,数据量变得越来越大,需要识别的说话人也越来越多,并且i-vector基于GMM,GMM不能有效对非线性或者近似非线性的数据区分,且DNN本身有比较好的特性,隐层之间的信息共享,泛化性更好,对于文本无关的任务,DNN更好,但需要更多的不同场景的数据喂给DNN。

基于深度学习的说话人识别,一种思路是使用DNN的输出状态代替GMM的混合分量提取i-vector,可以达到比基于GMM的i-vector更好的性能;另一种思路是提取嵌入向量表征说话人信息。嵌入向量就是为每个说话人语音分配一个固定长度的向量表示,这个长度可以自行设定,通俗来讲,嵌入向量就是将神经网络中某层的权重作为特定判断该说话人身份的向量。

嵌入向量

嵌入向量

d-vector

Google公司在2014年提出了d-vector方法。该方法是将声学特征序列通过一个DNN,其分类目标是说话人标签,取该神经网络的最后一个隐藏层输出的平均值,得到说话人的嵌入向量,称为d-vector。

将d-vector作为嵌入向量

将d-vector作为嵌入向量

x-vector

x-vector是Kaldi之父Daniel Povey教授等人在2017年在论文《Deep Neural Network Embeddings for Text-Independent Speaker Verification》中提出。x-vector方法和d-vector的思路类似,同样作为一种嵌入向量,使用说话人标签作为神经网络的分类目标,但有几点不同:

  • 前几层为TDNN(Time-Delay Neural Network)结构,使用了前后若干帧的信息。
  • 使用统计池化(Statisics pooling)层对各帧的TDNN输出进行平均。
  • 取池化层后面的隐藏层(通常为两层)的输出作为嵌入向量。

x-vector网络结构

x-vector网络结构

参考资料

  1. 说话人识别#1 GMM-UBM
  2. Speaker Adaptation
  3. 说话人识别模型(GMM-UBM)
  4. GMM-UBM和SVM说话人辨认系统及融合的分析
  5. I-vector的主要理论
  6. FBank与MFCC
  7. 语音信号的加窗处理
  8. 说话人识别(Speaker Verification)综述
  9. Kaldi语音识别实战(2020.4). 陈果果等
  10. Deep Neural Network Embeddings for Text-Independent Speaker Verification(2017), David Snyder.et al.
  11. Probabilistic linear discriminant analysis for inferences about identity(2007), Simon J.D. Prince et al.
  12. Probabilistic linear discriminant analysis(2006), Sergey Ioffe
本文作者:Author:     文章标题:声纹识别基本概念汇总
本文地址:https://alphalrx.cn/index.php/archives/118/     
版权说明:若无注明,本文皆为“LRX's Blog”原创,转载请保留文章出处。
Last modification:April 15th, 2020 at 04:34 pm
给作者赏一杯奶茶吧!

Leave a Comment