深入浅出实战:说话人识别

 

1

声纹识别概念

由于语音特征的特别,我们很难在机器学习入门的文章中看到关于语音的案例或者实验,本文主要介绍说话人识别的大体流程与原理,不在具体的细节公式上做过多讨论(因为实在是太复杂了)。

声纹识别(Speaker Recognition)属于生物特征识别技术,是通过计算机利用人体所固有的生理特征或行为特征来进行个人身份鉴定,它也称说话人识别,是通过对收到的说话人语音信号进行分析和提取,自动地确定说话人是否在所建立的说话人集合里面,并确定说话人是谁的过程。

声纹识别分为说话人辨认(Speaker Identification)和说话人确认(Speaker Verification),前者是根据说话人语音确定为 N 个参考说话人中的某一个,是一个选择问题;后者是证实说话人的身份与其声明的是否一致,是一个二选一的判定问题。

说话人说话内容预先确定的声纹识别称为与文本有关(text-dependent)的声纹识别;说话人说话内容预先不确定,说什么内容都可以的声纹识别称为与文本无关(text-independent)的声纹识别。

2

说话人识别

说话人识别也是属于监督分类的应用,样本数据主要来源于音频文件,由于数据的特殊性更准确的说是人耳的特殊性,音频文件我们不能像对待图像文件那样直接用灰度值,人能听到的频率在20HZ到20KHZ,音频文件转换成频谱图像后更可以观察到。

我们需要对频率采样而不是每个都要取,因为短时间的声音的变话人是反应不过来了,此处省略很多公式原理。

我们可以通过提取语音的plp特征或者mfcc特征作为训练样本,以plp为例,因为plp参数分布表示了声纹,不同人的plp参数分布不同,正好可以用来区分说话人,如果一个人说话足够多,覆盖了不同因素的话,就可以对特征进行建模,可以实现声纹识别。

最近换了小米8很是开心,不仅可以实现快速人脸识别,而且还可以进行对小爱同学的语音唤醒,以及语音操作(虽然我是米粉,但此处不是打广告)。

3

LBG建模

LBG与K-means类似属于聚类算法,一种无监督的算法。说到这思路应该很清晰了,与说话人样本质心做比较而决定是不是说话人,这种模型描述能力有限,音频文件避免不了有各种背景噪音,而模型又对背景噪音影响很大

 

4

GMM介绍

高斯混合模型 GMM 能很好地刻画参数空间中训练数据的空间分布及其特征,并且具有简单高效的特点,已广泛应用于与文本无关的说话人系统

高斯混合模型就是若干个高斯函数的叠加,他们的线性组合于是就可以模拟说话人矢量特征的连续概率分布,即描述了说话人的特性。直观上,每个高斯分别和发音单元相关,对应了不同的音素分布,所以一般高斯混合度越高识别效果越好,当然要基于大量的语音样本去学习,如果数据量小的话,高斯混合度与准确率可能不成正比关系。

 

高斯混合模型:

其中是系数且都大于0,之和为1 ,是高斯分布密度,服从于分布:

称为第k个模型。

GMM参数估计EM算法

  1. 取参数初始值开始迭代

  2. E步:依据当前模型参数,计算分模型k对观测数据的响应度

  3. M步:计算新一轮迭代的模型参数

  1. 重复计算2与3步直至收敛即可


    由于EM算法的性能跟初始点的选择有较大关系,所以一般做GMM训练时候,会先做无监督分类,例如LBG、K-means,选择质心点作为初始点对GMM进行初始化,无监督分类的类别数与GMM维度相同。

 

5

GMM-UBM

高斯混合模型是通用背景模型,针对一个说话人需要训练其GMM,想要得到一个覆盖说话人全部因素,或者得到一个GMM模型分布能够表征说话人音素分布,是需要大量的训练语料,然而针对具体应用场景很少能够得到说话人大量语音数据,因此通用背景模型应运而生。

什么是UBM模型呢?其实UBM就是GMM模型,只是训练的目的不同,GMM我们希望训练得到一个能够表征说话人音素分布的模型,而UBM是希望得到一个通用的模型,简单的说就是能够反应所有人共性的模型,其实某种意义上说就是一个取均值的过程。

在UBM的基础上,可以通过少量的说话人语料经过MAP的自适应过程就可以得到一个能够很好的识别说话人的GMM模型,训练语料没有覆盖的音素可以用UBM的来代替。这有点类似finetuning,在一个基础上进行微调,就可以很快的收敛,并得到一个不错的结果

训练过程

  • 训练GMM – 准备训练数据,来自于很多人很多场景的通话

  • 利用kmeans获取到M个高斯的GMM初值

  • 利用EM算法,调整模型参数,使得对观测数据的似然度最大

6

MAP自适应过程

大量实验表明只对均值更新,效果比较好,因此下面步骤只考虑对均值的更新
UBM参数

C为GMM的混合阶数;说话人X的训练语音的特征向量序列为 x

  1. 首先计算语音特征向量序列中的各个向量相对于每个UBM混元的概率得分。 

     
  2. 对于UBM中的任意混元i,特征向量xi对于它的后验分布概率为:  

     
  3. 利用后验概率计算均值所需要的统计量  

     
  4. 最后利用上面两个统计量对UBM均值进行更新,其对任意混元 i 的均值更新表达式如下:  

     

自适应系数控制着旧估计与新估计之间的均衡,自适应算法就是对UBM参数做个微调,使得参数在一定背景的基础下调整到能够表征说话人发音特征,在语音数据不充分的情况下,没有覆盖到的发音特征可以用UBM的平均发音特征来代替。第2步公式,反应了当前模型下,第j个观测数据,来自第K个分模型的概率,称为分模型K对观测数据yj的响应度。

 MAP自适应小结

在GMM-UBM模型中,通过贝叶斯自适应算法获得目标语言的模型,贝叶斯自适应算法是指通过训练得到的通用背景模型利用自适应方法获得每个说话人的GMM模型,贝叶斯自适应算法最大的特点是:在语料库相当大的情况下,也能迅速有效地获得每个说话人的GMM模型。

自适应算法分为两个步骤:

  1. 第一步与EM算法E步相同,对于UBM每个混合成分,计算每个所华人训练语音的权重、均值、方差。

  2. 第二步,为了自适应这个新的权重、均值、方差估计与旧的权重、均值、方差估计通过一个与数据相关的混合系数进行合并。混合系数的设定:目标语言的高数据量的混合成分在最后的参数估计中更依赖与新的权重、均值、方差,而目标语言的低数据量混合成分更依赖旧的权重、均值、方差。

7

联合因子分析

高斯结构包含 C 个高斯成分,每个声学特征矢量为F维,将GMM的数个高斯均值串起来则可以得到一个 CF 维的均值超矢量,所有说话人的均值超矢量构成一个超矢量空间,如果不加任何限制,则说话人相关的模型在空间内可以任意变化,如果想精确的估计出说话人在超矢量空间的位置,则需要大量的数据,因此,我们对该超矢量空间利用子空间加以限制,认为说话人均值超矢量只能在空间内的某些方向上变化,子空间就被称为EigenSpace.

因子分析用于声纹识别

对语音可变因素分解

  • 说话:嗓音类型,说话类型

  • 会话:通道,说话人属性:健康、年龄、情感

 因子分析模型表示超向量

  1. 每个高斯每一维的均值点均可以用某种固有因子的线性组合表示

  2. M=S+C

  3. 只考虑说话人部分:同一人不同段的语音,存在一个公共的因子(说话人因子),剩余的内容包含信道、年龄、情绪、噪声等

  4. 还考虑信道部分:剩余的部分中,我们仍然可以假设还有一个公共的因子(信道因子)影响着这部分变化

  5. 考虑残差部分:最后剩下的部分我们称为残差

 i-vector

i-vector把说话人特征空间与信道空间整合到一个空间中来表达。相比于高斯混合模型的均值超矢量,i-vector可以用一个维数固定的低维空间矢量来表示一个语音片段。

 

求解i-vector过程就是求取w的过程  
 
这两篇论文详细说明了,i-vector提取过程及原理:

李亚琦, 黄浩. 语音识别中基于i-vector的说话人归一化研究[J]. 现代计算机(专业版), 2014(14):3-7.  
林舒都, 邵曦. 基于i-vector和深度学习的说话人识别[J]. 计算机技术与发展, 2017, 27(6):66-71.

8

LDA

我们只想要找到说话人的特征能够对说话人很好的区别,所以i-vector中的信道空间明显是没用的,同时也有论文中提到信道空间中也含有说话人的特征,除去信道中的说话人特征剩下的就是扰动因子了,我们需要做降维也叫信道补偿,希望能够避开扰动因子的干扰。更好的识别说话人。

LDA的思想,LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是由类别输出的。PCA是不考虑样本类别输出的无监督降维技术。LDA的思想可以用一句话概括,就是“投影后类内方差最小,类间方差最大”,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据中新之间的距离尽可能的大。

 

这篇博文详细说明了LDA原理

机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA) https://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html

 

Python与机器学习算法频道