logo资料库

基于高斯混合模型的说话人识别.docx

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
基于高斯混合模型的说话人识别
基于高斯混合模型的说话人识别 ---翻译 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 链接下载。还请记住下载文章开头提供的数 据集哦。 如果你喜欢这篇文章,请关注这个博客,获取即将发表的文章更新。同时,分享 它,这样它就可以接触到能真正从中受益的读者(比如刚刚进入语音识别领域的 研究生同学)。请在下面讨论关于这篇文章的任何事情。我很想听听你们的意见。 快来一起快乐的机器学习吧!
分享到:
收藏