基于高斯混合模型的说话人识别
---翻译 by Grace_yan
与我们之前的文章“语音性别检测”类似,这篇博客文章关注的是初学者回
答语音文件中“谁是说话者”这个问题的方法。近年来,人们开发了许多语音生
物识别系统,可以从所记录的语音中提取说话人的信息,并从数据库中的一组训
练好的说话人模型中识别说话人。在这篇博文中,我们将用一种使用高斯混合模
型(GMM)的简单方法来说明这一点。还有其他传统的和现代的方法,它们对信道
噪声的鲁棒性更强,而且比本文所采用的方法性能更好。
1、使用 MAP (Maximum Aposteriori)方法的文章[1]的 MM-UBM(高斯混合模
型-通用背景模型)是实现说话人识别的一种成功的传统技术。
2、文章[2]中基于 i -vector 的说话人识别,是目前许多语音生物识别产品
中应用的最新技术。
作为一个初学者,上面提到的技术可能会让你不知所措,因为它们是数学上
复杂的方法,需要一些研究工作才能理解。因此,我没有遵循这两种方法中的任
何一种。相反,我感兴趣的是向您展示如何实现说话人识别的基本步骤(使用
GMMs),然后可以开发 GMM-UBM 或 I-vector 方法。
数据集下载:here
1. 训练语料集:它是从 on-line VoxForge speech database 中提取的音频
加工而来的,由每个说话者的 5 个语音片段组成,共有 34 个说话者( 15-20
秒/人)
2. 测试语料集:包括同样 34 位说话者的其余 5 个语音片段。所有音频文件
的持续时间为 10 秒,采样频率为 16000 赫兹。(其实数据集中有很多说
话人,不止 34 个,只是用 txt 文件挑了 34 个人,每个人有十段语音,5
段选为训练用,5 段选为测试用)
我强烈建议您阅读我们之前的文章“语音性别检测”,作为如何处理语音信
号的简单入门介绍。我们也讨论了如何提取一个流行的语音特征:梅尔倒谱系数
(MFCCs)。GMM 将输入说话人训练样本的 MFCCs 和 MFCCs 的导数,并尝试了解它
们的分布情况,这将代表说话人。典型的说话人识别过程如下图所示:
在测试新语音样本的说话人识别时,首先提取样本的 40 维特征(MFCCs +
delta MFCC),然后使用训练过的说话人 GMM 模型计算所有模型的特征得分。预
测得分最大的说话人模型作为要预测的说话人。前面已经说过,我们将通过
python 实现以下步骤:
1. 40 维的特征提取
2. 训练说话人模型
3. 在测试集上评估模型
那我们现在就开始吧!
1、特征提取
我们从语音帧中提取 40 维特征。有 20 个 MFCC 特征和 20 个 MFCC 特征的衍生
物。MFCCs 的导数提供了 MFCCs 随时间变化的动力学信息。结果表明,在许
多语音分析应用中,计算 delta-MFCC 并将其附加到原来的 MFCC 特性(20 维)
中可以提高性能。为了计算 MFCCs 的 delta 特征,我们应用下面的方程:
N 是 deltas 求和之后的数,一般取 2.
下面的 python 函数提取 MFCC 特征,并从音频信号中得到 delta 系数。
2、训练说话人模型
我们知道,在训练语料库中有 34 个不同的说话者,这些说话者是从 VoxForge
提供的大量说话者中抽取出来的。所有用于训练的音频文件(每个说话人 5
段)的路径都在这个文件中给出。通常有一个非常重要的步骤称为预处理,也
称为语音活动检测(VAD),其中包括从音频中去除噪声和静音截断。我假设这
里不需要执行 VAD。
为了从上述提取的特征中构建一个说话人识别系统,我们现在需要对所有说
话人进行独立建模。我们使用 GMMs 来完成这项任务。
(下面这段和上篇文章一模一样)
高斯混合模型是一种概率聚类模型,用于表示总体中存在的子种群。
训练 GMM 的思想是,通过 k 维高斯分布/簇的线性组合来近似类的概率分
布,也称为 GMM 的分量。(大概就是:K个 GSM 混合成一个 GMM,每个 GSM
称为 GMM 的一个 component,也就是分为 K 个类,与 KMeans 一样,K 的值
需要提前确定。例如:
随机变量 X 是由 K 个高斯分布混合而成,取各个高斯分布的概率为π1,
π2... πK,第 i 个高斯分布的均值为μi,方差为Σi。若观测到随机
变量 X 的一系列样本 x1,x2,...,xn,试估计参数π,μ,Σ。可以自行
百度 GMM)
模型数据点(特征向量)的似然性由下式给出:
首先,GMM 通过 k -means 算法识别数据中的 k 个簇,并为每个簇分配相等的
利用λ类的训练数据估计第 k 个高斯分布的参数:均值、协方差矩阵和
权值 w =1。 然后将 k 个高斯分布拟合到这些 k 个簇上。在迭代中更新所有
簇的参数μ、σ和 w,直到收敛为止。最常用的估计方法是期望最大化(EM)算
权值 w。
法。
Python 的 sklearn.mixture 包可以让我们从包含 40 维 MFCC 和 delta-MFCC
特征的特征矩阵中学习到想要的 GMM 模型。更多关于 sklearn GMM 的信息可
以阅读我们之前的文章“语音性别检测”的第 3 部分。下面的 Python 代码用
于训练具有 16 个分量的 GMM 说话人模型。代码为每个说话人运行一次,
train_file 是变量,其中含有的文本文件名包含到每个说话人的所有音频的
路径。此外,您还必须创建一个“speaker_models”目录,在此目录中,将
存储所有训练好的说话人模型。
3、在测试集上评估模型
测试集由 34 名说话者的剩余 5 段语音组成。在这个 txt 文件中给出了所有用
于评估的音频文件(每个说话人 5 个)的路径。
当一个测试语音样本到达时,我们首先提取它的 40 维 MFCC 特征,帧大小为
25 ms,帧间重叠为 10 ms。接下来,我们需要样本每一帧的对数似然值,1,
2,…,,每个说话人都要做。即计算 P(|说话人 1)和 P(|说话人 i)。
利用上篇文章的公式(2),将该说话人 GMM 模型的μ和σ代入,计算出帧来
自该说话人的可能性。对模型中的每个 k 维高斯分量都这么做,并根据模型
的参数取各分量 k 个概率的加权和。对得到的和进行对数运算,得到该帧的
对数似然值。对样本的所有帧重复此操作,所有帧的似然值都加在一起。将
似然得分最高的说话者模型作为识别说话者。
下面给出的 Python 代码预测测试音频的说话者。
结果与结论:
这种初学者的方法具有 100%的内嵌精度,可以正确识别所有 170 个语音。这
样完美的结果有下面几个理由:
1、来自 VoxForge 的说话者所发出的测试集的声音很可能是来自相同的信道
或环境。
2、这种评估是建立在小数据集基础上的。想象一下,你可能接到的识别任
务是一个每天数千个的数据流。
3、考虑这样一种情况:我们必须从 1000 名说话人中识别出说话人。
4、在这个评估中,我们没有考虑到任何训练集外面的说话人,也就是说,
如果音频不是来自训练集,我们的系统仍然会根据最高可能性将其识别
为训练集中的某个人。
5、在真实的环境中,我们可能会得到更多的噪音和没有清理过的数据。说
话人识别系统需要健壮性。
我们希望这篇博客文章成功地解释了说话人识别任务的基本方法。我们希望你能
重现我们发布的结果。记住,这不是结束。希望你能以此为背景,对这一课题进
行进一步的研究。为了阅读更有效的技巧,下面是为说话者识别任务提供的参考。
[1] Douglas A. Reynolds, Thomas F. Quatieri, and Robert B. Dunn, “Speaker
Verification Using Adapted Gaussian Mixture Models”, M.I.T. Lincoln
Laboratory, 2000
[2] Najim Dehak et al., “Front end Factor Analysis for Speaker
Verification”, IEEE transaction on Audio, Speech and Language Processing,
2010
本篇文章的完整代码可以从 GitHub 链接下载。还请记住下载文章开头提供的数
据集哦。
如果你喜欢这篇文章,请关注这个博客,获取即将发表的文章更新。同时,分享
它,这样它就可以接触到能真正从中受益的读者(比如刚刚进入语音识别领域的
研究生同学)。请在下面讨论关于这篇文章的任何事情。我很想听听你们的意见。
快来一起快乐的机器学习吧!