声纹识别
一、什么是声纹识别?和语音识别什么关系?
在AI领域,解决的问题分三个阶段:看/听清、看/听懂、满足(PS:和百度开发者大会上景鲲对DuerOS的架构描述一致,所见略同)。在语音领域,声纹识别往往对应的是听清,语音识别对应着听懂的初期阶段(听懂在语音识别后,还需要大量的LU技术)。
对语音信息的挖掘,一般而言包括以下几个部分:
- 说了什么——语音识别
- 谁说的——声纹识别
- 用什么语言说的——语种识别
- 说话时的情绪——情感识别
- 说话人的年龄——年龄识别
具体的说,声纹识别关心的“谁在说”,用于解决生物身份确认和识别;而语音识别关心的“说了什么”,用于解决对说话内容的识别。
声纹识别的理论基础:每个生物个体说话都具有其独特的特征。决定这些独特特征的因素有很多,主要有:
- 声腔差异。包括咽喉、鼻腔、口腔以及胸腔等器官形状、尺寸和位置上的差异决定了声腔的差异
- 发生方式差异。唇、口齿、舌头等部位在发生的互相作用差异。
二、声纹识别的难度
正常生物个人在说话时的声纹状态还是相对稳定的。但受到身体状况、年龄和情绪的变化影响,声纹特型会出现变化。
注册语音和测试语音的差异,这部分是对声纹识别在应用场景需要面临的一个难点。比如注册语音是歌手的歌曲音频,但测试语音是歌手的访谈音频,两种情况下的发声方式会有较大区别。
三、声纹识别的过程
声纹识别的一般步骤包括:收集语音->噪声抑制和有效语音(VAD)->声纹特征提取->发声人的声音建模->识别匹配
声纹特征提取
语音信号可以认为是一种短时平稳信号和长时非平稳信号,其长时的非平稳特性是由于发音器官的物理运动过程变化而产生的。从发音机理上来说,人在发出不同种类的声音时,声道的情况是不一样的,各种器官的相互作用,会形成不同的声道模型,而这种相互作用的变化所形成的不同发声差异是非线性的。但是,发声器官的运动又存在一定的惯性,所以在短时间内,我们认为语音信号还是可以当成平稳信号来处理,这个短时一般范围在10到30毫秒之间。
这个意思就是说语音信号的相关特征参数的分布规律在短时间(10-30ms)内可以认为是一致的,而在长时间来看则是有明显变化的。在数字信号处理时,一般而言我们都期望对平稳信号进行时频分析,从而提取特征。因此,在对语音信号进行特征提取的时候,我们会有一个20ms左右的时间窗,在这个时间窗内我们认为语音信号是平稳的。然后以这个窗为单位在语音信号上进行滑动,每一个时间窗都可以提取出一个能够表征这个时间窗内信号的特征,从而就得到了语音信号的特征序列。这个过程,我们称之为声学特征提取。这个特征能够表征出在这个时间窗内的语音信号相关信息。如下图所示:
这样,我们就能够将一段语音转化得到一个以帧为单位的特征序列。由于人在说话时的随机性,不可能得到两段完全一模一样的语音,即便是同一个人连续说同样的内容时,其语音时长和特性都不能完全一致。因此,一般而言每段语音得到的特征序列长度是不一样的。
在时间窗里采取的不同的信号处理方式,就会得到不同的特征,目前常用的特征有滤波器组fbank,梅尔频率倒谱系数MFCC以及感知线性预测系数PLP特征等。然而这些特征所含有的信息较为冗余,我们还需要进一步的方法将这些特征中所含有的说话人信息进行提纯。
发声人的声音建模
百度内部的声纹建模实际采用两个模型融合来完成:
- 经典的DNN-ivector系统
- end2end CNN系统
DNN-ivector算法
这是目前被广泛采用的声纹识别系统。其主要特点就是将之前提取的声学特征通过按照一定的发声单元对齐后投影到一个较低的线性空间中,然后进行说话人信息的挖掘。直观上来说,可以理解成是在挖掘“不同的人在发同一个音时的区别是什么”。
首先我们会用大量的数据训练一个能够将声学特征很好的对应到某一发声单元的神经网络,如下图所示:
这样,每一帧特征通过神经网络后,就会被分配到某一发声单元上去。然后,我们会对每一句话在所有的发声单元进行逐个统计,按照每个发声单元没单位统计得到相应的信息。这样,对于每一句话我们就会得到一个高维的特征矢量。
在得到高维的特征矢量后,我们就会采用一种称之为total variability的建模方法对高维特征进行建模:
M=m+Tw
其中m是所有训练数据得到的均值超矢量,M则是每一句话的超矢量,T是奇通过大量数据训练得到的载荷空间矩阵,w则是降维后得到的ivector特征矢量,根据任务情况而言,一般取几百维。最后,对这个ivector采用概率线性判别分析PLDA建模,从而挖掘出说话人的信息。
发声单元包括大概五千个特征,这些特征就包括两种情况。一种情况就是你在说什么,具体对应说话内容的文本空间;第二种情况是你的声音是什么样的,你的特征是什么,具体对应说话音调等声音特征。在这五千个特征里面,其中90%是说话的内容,10%是声音的特征,百度从中提取400个特征。输入两端人声对比的时候就比对这400个特征。
end2end CNN系统
上一套方法还借鉴了一些语音学的知识(采用了语音识别中的发声单元分类网络),那么基于端到端深度学习的说话人信息提取则是一个纯粹的数据驱动的方式。通过百度的海量数据样本以及非常深的卷积神经网络来让机器自动的去发掘声学特征中的说话人信息差异,从而提取出声学特征中的说话人信息表示。
我们首先通过海量的声纹数据训练一个深度卷积神经网络,其输出的类别就是说话人的ID,实际训练中我们使用了数万个ID来进行网络的训练。从而得到了能够有效表征说话人特性底座网络。在根据特定场景的任务进行自适应调优。具体过程如下图所示:
在完成网络的训练后,我们就得到了一个能够提取说话人差异信息的网络,对每一句话我们通过该网络就得到了说话人的特征。
端对端的系统,通过深度学习让机器自动挖掘声学特征中说话人的信息差异,用了2万个人、共5千个小时左右的数据去训练。该端对端网络会分析每段语音中的1020个特征,分析不同语音下同一特征像不像。这个端对端的网络的目标是输入两段声音,判断是不是同一个人说的话。
两套系统最后在得分域上进行了加权融合,从而给出最后的判决结果。