听听百度工程师聊聊声纹识别的原理
扫描二维码
随时随地手机看文章
百度大脑最近参加了综艺节目《最强大脑》,就是那个请一堆人类记忆大师和神童上去挑战的节目。
此前第一期节目里面,搭载了百度大脑的小度以3:2在人脸识别的比赛中赢了人类选手王峰。第二期的节目比的则是声纹识别,大概就是从一堆人中找出说某句话的人是谁,不过,做为“最强道具组”的《最强大脑》,为了节目效果,当然不会让项目那么简单。
节目中的名人堂选手申一帆甚至表示,这个题目太变态了。确实,对于普通人来说,这样的题目基本靠瞎蒙……
具体来说,节目组请来了一组专业的高校合唱团(21人),嘉宾周杰伦从中选出了声线相近的三个人,分别对周杰伦说一句话,节目从中截取三秒不连续的只言片语。两位选手听过三个人的说话片段之后,现场听合唱团合唱一曲,然后从中选出嘉宾选的三个人分别是谁。
这次百度大脑的对手是听音神童孙亦廷。结果,两位选手都分别只对了一题,因此打平,其中第一道题中两位选手都错了,而且写错的答案一样。
跟上次一样,我们来关注一下,机器是怎么辨认出说这句话的人是谁的呢?我们来听百度工程师们讲解一下。
声纹识别要回答什么问题
本次比赛对机器来说是声纹识别。声纹识别和语音识别的不同之处在于,它的目的不是识别语音的内容,而是识别说话人的身份。
声纹识别
据百度方面介绍,声纹的理论基础是“每个人的说话特性都具有其独特的特征”,而决定这种独特特征的主要因素有:
1) 声腔的差异,其包括咽喉、鼻腔、口腔以及胸腔等,这些器官的形状、尺寸和位置决定了声腔的差异,不同的人说话,其声音的频率分布是不同的。
2) 发声的操作方式,主要是指唇、口齿、舌头等部位在发声时的相互作用。
一般而言,人正常说话时的声纹状态还是相对稳定的。但两个因素非常容易受身体状况、年龄、情绪等情况的干扰,从而导致声纹特性的变化。比如如果一个人感冒了,因为鼻腔堵塞也导致声纹特性不一致。总而言之,声纹特征是类似于虹膜、指纹等一种具有独特性的生物特征。
跟上次介绍过的人脸识别类似,声纹识别的任务主要分成两类:声纹确认技术(1:1)和声纹识别技术(1:N)两类。前者回答的是两句话到底是不是一个人说的,比如微信登陆中使用的声纹识别技术,回答的就是类似的问题;而后者回答的则是”给定的一句话属于样本库中谁说的”问题。这次节目中要回答的就是第二类问题,从21个个合唱团成员中找出嘉宾指定的三个人。
不过,百度方面也指出,这次节目中声纹识别的比赛比一般的声纹识别要难。
一是因为给定的样本(注册语音)是属于唱歌的声音,但要识别的(测试语音)则是正常说话的声音,两种情况下同一个人的发生方式可能是不同的。二是因为合唱要求成员的声音不能过于突出,这使得注册语音趋同。三是测试声音是断续的。四是因为测试声音时长过短,不超过10个字,有效时间不大于3秒。“我们需要更为鲁棒(Robust)地来提取出短时的、断断续续的线人说话声音所能够表征的线人特性。”
声纹识别的过程
百度方面介绍,一个基本的声纹识别过程主要包括声纹注册和声纹测试阶段:
在声纹注册阶段,每个可能的用户都会录制足够的语音然后进行说话人特征的提取,从而形成声纹模型库。这个模型库就像字典,所有可能的字都会在该字典中被收录。节目中的大合唱阶段就是声纹注册阶段。
在声纹测试阶段,测试者也会录制一定的语音,然后进行说话人特征提取,提取完成后,就会与声纹模型库中的所有注册者进行相似度计算。相似度最高的注册者即为机器认为的测试者身份。节目中断断续续的语音,即可以看成是线人的测试语音。
声纹识别的一般步骤
那百度大脑如何提取声纹特征,其中又用了什么算法?听百度工程师聊聊具体过程。以下为百度工程师撰写的内容,将采用工程师第一人称(想要看简单版的同学可以直接跳到最后):
1) 声学特征提取
语音信号可以认为是一种短时平稳信号和长时非平稳信号,其长时的非平稳特性是由于发音器官的物理运动过程变化而产生的。从发音机理上来说,人在发出不同种类的声音时,声道的情况是不一样的,各种器官的相互作用,会形成不同的声道模型,而这种相互作用的变化所形成的不同发声差异是非线性的。但是,发声器官的运动又存在一定的惯性,所以在短时间内,我们认为语音信号还是可以当成平稳信号来处理,这个短时一般范围在10到30毫秒之间。
这个意思就是说语音信号的相关特征参数的分布规律在短时间(10-30ms)内可以认为是一致的,而在长时间来看则是有明显变化的。在数字信号处理时,一般而言我们都期望对平稳信号进行时频分析,从而提取特征。因此,在对语音信号进行特征提取的时候,我们会有一个20ms左右的时间窗,在这个时间窗内我们认为语音信号是平稳的。然后以这个窗为单位在语音信号上进行滑动,每一个时间窗都可以提取出一个能够表征这个时间窗内信号的特征,从而就得到了语音信号的特征序列。这个过程,我们称之为声学特征提取。这个特征能够表征出在这个时间窗内的语音信号相关信息。如下图所示:
这样,我们就能够将一段语音转化得到一个以帧为单位的特征序列。由于人在说话时的随机性,不可能得到两段完全一模一样的语音,即便是同一个人连续说同样的内容时,其语音时长和特性都不能完全一致。因此,一般而言每段语音得到的特征序列长度是不一样的。
在时间窗里采取的不同的信号处理方式,就会得到不同的特征,目前常用的特征有滤波器组fbank,梅尔频率倒谱系数MFCC以及感知线性预测系数PLP特征等。然而这些特征所含有的信息较为冗余,我们还需要进一步的方法将这些特征中所含有的说话人信息进行提纯。
2) 说话人特征提取
我们在提取说话人特征的过程中采用了经典的DNN-ivector系统以及基于端到端深度神经网络的说话人特征(Dvector)提取系统。两套系统从不同的角度实现了对说话人特征的抓取。
A. 算法1 DNN-ivector
这是目前被广泛采用的声纹识别系统。其主要特点就是将之前提取的声学特征通过按照一定的发声单元对齐后投影到一个较低的线性空间中,然后进行说话人信息的挖掘。直观上来说,可以理解成是在挖掘“不同的人在发同一个音时的区别是什么”。
首先我们会用大量的数据训练一个能够将声学特征很好的对应到某一发声单元的神经网络,如下图所示:
这样,每一帧特征通过神经网络后,就会被分配到某一发声单元上去。然后,我们会对每一句话在所有的发声单元进行逐个统计,按照每个发声单元没单位统计得到相应的信息。这样,对于每一句话我们就会得到一个高维的特征矢量。
在得到高维的特征矢量后,我们就会采用一种称之为total variability的建模方法对高维特征进行建模:
M=m+Tw
其中m是所有训练数据得到的均值超矢量,M则是每一句话的超矢量,T是奇通过大量数据训练得到的载荷空间矩阵,w则是降维后得到的ivector特征矢量,根据任务情况而言,一般取几百维。最后,对这个ivector采用概率线性判别分析PLDA建模,从而挖掘出说话人的信息。
在实际中,我们依托百度领先的语音识别技术训练了一个高精度的深度神经网络来进行发声单元的对齐,然后依托海量数据训练得到了载荷矩阵空间T,最后创造性地采用了自适应方法来进行调整T空间和PLDA空间,大大增强了模型在唱歌和说话跨方式以及短时上的声纹识别鲁棒性。
B. 算法2 基于端到端深度学习的说话人信息提取
如果说上一套方法还借鉴了一些语音学的知识(采用了语音识别中的发声单元分类网络),那么基于端到端深度学习的说话人信息提取则是一个纯粹的数据驱动的方式。通过百度的海量数据样本以及非常深的卷积神经网络来让机器自动的去发掘声学特征中的说话人信息差异,从而提取出声学特征中的说话人信息表示。
我们首先通过海量的声纹数据训练一个深度卷积神经网络,其输出的类别就是说话人的ID,实际训练中我们使用了数万个ID来进行网络的训练。从而得到了能够有效表征说话人特性底座网络。在根据特定场景的任务进行自适应调优。具体过程如下图所示:
在完成网络的训练后,我们就得到了一个能够提取说话人差异信息的网络,对每一句话我们通过该网络就得到了说话人的特征。
两套系统我们最后在得分域上进行了加权融合,从而给出最后的判决结果。
以上是百度工程师对百度声纹识别过程的分享,在百度首席科学家吴恩达和深度学习研究院主任林元庆接受媒体采访时,也表示百度的声纹识别其实训练了两个模型,最后通过两个模型分数相加得出最后的结果。吴恩达用非常通俗解释了两个模型:
第一种算法则是从一段语音中提取大概五千个特征,这些特征就包括两种情况。一种情况就是你在说什么?第二种情况是你的声音是什么样的?你的特征是什么?在这五千个特征里面,其中90%是说话的内容,10%是声音的特征,百度从中提取400个特征。输入两端人声对比的时候就比对这400个特征。
另一种是端对端的系统,通过深度学习让机器自动挖掘声学特征中说话人的信息差异,用了2万个人、共5千个小时左右的数据去训练。该端对端网络会分析每段语音中的1020个特征,分析不同语音下同一特征像不像。这个端对端的网络的目标是输入两段声音,判断是不是同一个人说的话。
两位科学家也说出了一个比赛现场很有意思的事。比赛中,两个模型其实各自做对了两道题,但分数加起来之后,最后反而只对了一道题。他们解释,这就像两个模型投票一样,“其实这两个模型,你哪一个模型是比较自信的,比较有信心的你就会选择(它)”。
吴恩达表示,这个细节也会让团队发现进步的可能。团队未来除了用更多的数据训练模型,很有可能选择多个模型投票的办法。