智能语音机器人中VAD语音端点检测算法优化实践
The following article is from 58技术 Author 陈佩利
导读
语音机器人是58同城TEG技术工程平台群AI Lab自主研发的具有自动电话拨打、多轮语音交互、智能意向判断等多种功能的智能对话机器人。可应用于自动电话销售、产品服务推广、信息审核、语音通知等多种业务场景。语音机器人中的语音端点检测模块(voice detection activity,简称VAD),用于检测人声的起始点与终止点。
背景介绍
语音端点检测模块是人机语音交互流程中一个极其重要的模块,它是从含有静音、噪音等的语音信号中找到人声的起点,开始进行语音识别,当检测到人声的终点时,结束语音识别,从而获取到语音识别的结果输入到对话管理器来完成多轮语音交互。语音端点检测性能的好坏直接影响语音交互对话的流畅性与用户体验。
基于双门限端点检测的VAD方法
VAD可以看作一个语音分类任务,在进行VAD时,我们对原始的语音切分成小段(分帧),例如20ms或者25ms,计算语音特征后,将语音特征作为模型的输入,而模型的输出则是一个二分类的结果:当前帧为人声(speech)或非人声(noise)。
在本文中,我们将人声视为正类,非人声视为负类。在语音机器人的任务中,我们主要关注的是切分的句子是否完整包含了所有的人声,从而不会影响到后续机器人的意图判断等操作。另一方面,我们也希望VAD截取的句子的前后尽量少地包含非人声,从而能够及时根据用户的停顿来判断句子的结束,及时地响应用户的话语。因此,我们重点关注的VAD模型效果是正向的准确率与召回率。
语音学中,发音时声带振动的音称为浊音,声带不振动的音称为清音。我们需要找的人声段包括清音与浊音,语音特征中的短时能量更适合检测浊音,而短时过零率更适合检测清音。我们最开始的VAD方法采用的是双门限端点检测法,它利用短时过零率与短时能量作为判断指标:
(1)短时过零率:
短时平均过零率是语音信号时域分析中的一种特征参数。它是指一帧语音时域信号穿过横轴(零电平)次数,计算公式如下所示:
式中sgn为符号函数,
(2)短时能量:
短时能量即一帧语音信号能量,人声段部分能量通常比非人声段部分的能量小,清音部分的能量比浊音部分的能量小,对于信号
下图为语音波形图与相应的短时能量,红色竖线与绿色竖线分别标识出人声段的开始与结束,可以看到人声段部分的短时能量明显比非人声段的要小。
计算了短时能量与短时过零率后,使用各自的上限与下限阈值判定人声段的开始与结束(下文称短时能量的上限阈值为energy_high,下限阈值为energy_low,对于短时过零率zcr,其上限阈值为zcr_high,下限阈值为zcr_low):
当短时过零率与短时能量均超过各自的上限阈值时,则找到人声帧开始;当短时过零率或短时能量中有一个低于各自的下限阈值时,则找到人声帧的结束,流程图如下所示:
双门限端点检测法的效果如下所示:
备注 | 正向准确率 | 正向召回率 | 正向F1值 |
双门限VAD | 35.73% | 97.37% | 52.28% |
可以看到,使用双门限VAD的正向召回率较高,而正向准确率较低,这说明这种VAD方法切分的句子中可能会包含较多冗余的非人声,例如空白音或背景噪声。双门限端点检测法计算简单,只需要通过简单的指标计算以及条件判断即可判别当前语音帧是否属于人声。
对于一些突发性的随机噪声或背景噪声往往会引起短时能量或短时过零率数值很高,造成双门限VAD误判的情况。为了进一步提升VAD模块的效果,我们尝试了WebRTC VAD。
基于WebRTC VAD的VAD方法
WebRTC是一个由Google发起的实时通讯解决方案,其中包含视频音频采集,编解码,数据传输,音视频展示等功能,开发者可以利用WebRTC快速地构建出一个音视频通讯应用,而WebRTC VAD是其中的语音端点检测模块。
WebRTC VAD基于GMM对人声与非人声进行建模,其判别耗时非常短,每帧判别耗时仅需不到1ms,其中GMM的初始化参数以及似然比阈值均为预先设定的初值,因此其不需要经过训练即可使用,它目前支持10/20/30ms三种可选的语音输入,并且包含4档激进模式,用于控制判定当前帧为语音帧的倾向性。激进模式使用数字0~3做区分,激进程度与数字大小正相关,数字越大,越倾向于判定当前语音帧为人声帧。
WebRTC VAD包括判别过程与自适应参数更新两个步骤。
在判别过程中,它按照语音的频率分布,将语音分成六个子频带,对于每个子频带对应两个高斯混合模型(GMM模型),这两个GMM分别表示语音模型和噪声模型,用于计算同一频带上人声概率相对非人声的对数似然比,与此同时,也计算所有子频带的加权对数似然比,整体步骤如下所示:
当六个子频带的对数似然比中,有一个超过阈值时,或者加权对数似然比超过阈值时,则将当前语音帧判定为人声。
完成判别过程后,会进入到自适应参数更新过程,在这一步更新噪声模型与语音模型的的均值与方差,根据输入数据对模型参数进行更新,从而根据输入数据的实际分布来调整参数,以获取更好的效果。注意这里的参数更新过程,使用的是同一VAD对象的输入数据,在语音机器人中,在拨打每一通电话的最初会初始化一个VAD对象,它会根据当前通话的语音帧进行自适应的参数更新,具体步骤如下所示:
参数更新过程依赖于当前频带的预测结果,当前帧被预测为噪声时,在参数更新阶段会更新六个频带中噪声模型的均值与方差,而语音模型的均值与方差则不被更新;当前帧被预测为人声时同理。具体更新过程如下所示:
可以从下表中看到,相对于双门限端点检测法,WebRTC VAD的正向准确率与正向召回率均优于双门限端点检测,其F1值相对双门限端点检测绝对提升约20%。
备注 | 正向准确率 | 正向召回率 | 正向F1值 |
WebRTC VAD | 54.75% | 97.36% | 70.09% |
双门限VAD | 35.73% | 97.37% | 52.28% |
WebRTC VAD的正向召回率保持在一个较高的水平,而正向准确率还有待改进的空间。因此,本文尝试将深度学习模型VADNet应用到VAD任务。
VADNet的初步探索
VADNet是一个可应用在VAD任务上的深度学习模型,它所使用的模型结构为CRNN结构,其输入为声音波形或声学特征,模型输出为当前语音帧为人声或非人声的判别结果,具体结构如下图所示。
初期实验时, 我们尝试了不同的输入与模型结构,以探索语音特征或CNN作为特征提取器对语音分类效果的影响:
(1)使用声音波形作为输入,使用CNN+RNN结构;
(2)使用语音特征FBank特征作为输入,使用RNN结构。
输入 | 正向准确率 | 正向召回率 | 正向F1值 | FEC | OVER | MSC | NDS |
MFCC | 79.76% | 91.36% | 85.17% | 7.20% | 0.37% | 6.60% | 4.04% |
FBank | 71.47% | 94.06% | 81.22% | 4.72% | 0.64% | 5.06% | 6.20% |
声音波形 | 80.87% | 91.85% | 86.01% | 6.81% | 0.35% | 6.47% | 3.71% |
可以看到,对于MFCC、FBank、声音波形三种不同的模型输入,当模型输入为声音波形时,正向F1最高,因此后续的实验使用声学波形作为模型输入。
在线上应用语音端点检测时,我们还需要考虑两个因素:
a.模型输入语音的时长:输入的语音帧长度越大,粒度越大,越不精确。
b.在线预测耗时: 考虑到语音机器人的实时性,需要保证在线预测耗时尽可能短。
因此我们尝试了了不同的语音输入时长以及不同的模型结构,对比其模型效果以及预测耗时的变化。具体效果如下所示:
备注 | 在线预测耗时 | 正向准确率 | 正向召回率 | 正向F1值 |
帧长500ms+conv3+2层RNN | 120ms/帧 | 80.87% | 91.85% | 86.01% |
帧长200ms+conv3+2层RNN | 44ms/帧 | 77.69% | 90.08% | 83.42% |
帧长200ms+conv4+2层RNN | 30ms/帧 | 72.71% | 92.88% | 81.57% |
帧长200ms+conv4+1层RNN | 26ms/帧 | 75.78% | 92.98% | 83.51% |
帧长200ms+conv4+无RNN | 16ms/帧 | 58.37% | 85.11% | 69.25% |
上表中的conv3表示三层的卷积与池化,而conv4是在conv3的基础上再加了一层卷积与池化层,其目的是令输入到RNN的步长减半,从而缩短在线预测时间。可以看到,对于相同的模型结构,当语音时长从500ms减小到200ms时,正向准确率与召回率都略微降低。输入到RNN的步长减半时,在线预测耗时也有所下降。考虑到在线预测耗时与模型预测效果两个因素,目前线上使用的是语音帧长度为200ms,模型结构为conv4与1层RNN的组合。在实际调用时,使用滑动窗口的形式获取语音帧,窗口大小200ms,移动步长100ms。
下表为VADNet与WebRTC VAD、双门限VAD的效果对比,可以看到VADNet的最大的正向F1值要比WebRTC VAD高出约15%(86.01% VS 71.59%)。由于VADNet是基于深度学习的VAD方法,其计算复杂度相对双门限端点检测与WebRTC VAD要高,每帧的判别耗时也相对更高。当VADNet的输入语音帧长度为200ms时,调用WPAI的平均在线预测耗时为26ms,后续VADNet的在线预测耗时方面还可以做进一步的优化。
备注 | 帧长 | 调用频率 | 在线预测耗时 | 正向准确率 | 正向召回率 | 正向F1值 |
VADNet | 200ms | 100ms | 26ms/帧 | 75.78% | 92.98% | 83.51% |
WebRTC VAD | 20ms | 20ms | <=1ms/帧 | 54.75% | 97.36% | 70.09% |
双门限VAD | 20ms | 20ms | <=1ms/帧 | 35.73% | 97.37% | 52.28% |
总结
本文重点介绍了语音机器人的语音端点检测模块的迭代优化历程,分别介绍了双门限端点检测、WebRTC VAD、VADNet三种不同的语音端点检测方法在语音端点检测模块上的应用。
目前语音端点检测模块为语音机器人稳定提供支持,语音端点检测模块还有一定的提升空间,后续会继续尝试输入不同的语音特征或使用不同的断句方法,优化预测耗时以及正向F1值,为语音机器人提供更快捷以及更精准的语音端点检测。
部门详细介绍可点击:ailab.58.com作者简介
陈佩利,58同城AI Lab算法高级工程师,2017年11月加入58,2018年6月毕业于吉林大学,在58同城主要负责语音机器人、智能写稿、语音识别相关算法工作。
AI Lab 招聘信息欢迎关注开源项目 qa_matchqa_match是58同城开源的一款基于深度学习的问答匹配工具,支持一层和两层结构知识库问答。qa_match通过意图匹配模型支持一层结构知识库问答,通过融合领域分类模型和意图匹配模型的结果支持两层结构知识库问答。qa_match同时支持无监督预训练功能,通过轻量级预训练语言模型(SPTM,Simple Pre-trained Model)可以提升基于知识库问答等下游任务的效果。github地址:https://github.com/wuba/qa_match
文章介绍:
欢迎关注部门微信公众号:58AILab
欢迎在欣秀(https://app.ic3i.com)平台上加入"58同城AILab技术沙龙"圈子,一起交流技术,可以扫描以下二维码加入该圈子。