WebRTC端点检测使用中遇到的部分问题汇总

WebRTC端点检测使用中遇到的部分问题汇总

背景

端点检测技术作为语音识别等技术预处理截断的一项非常重要的技术一直以来是业界研究的重点,也可以说语音信号的端点检测精度直接影响后面进行的语音识别精度,而目前的端点检测算法主要受到以下几个因素的制约:

  1. 噪声环境: 待检测语音信号中的环境噪声强的时候其端点检测精度就明显下降,所以目前采用的主要技术是麦克风阵列技术实现噪声的抑制,从而获得信噪比较高的语音信号作为端点检测的输入。
  2. 多说话人: 在待检测语音中存在多人同时说话时端点检测的精度也会明显下降,同样,目前业界主要还是通过麦克风阵列技术实现说话人定向、波束成形、信号增强等技术手段获得较为理想的语音信号。(麦克风阵列技术也是一项非常重要的技术。本人毕业设计就是做的移动机器人声源定位)

就目前端点检测算法来说主要有基于能量阈值的检测方法(能量方法又包括多中能量)、基于能量与过零率的检测方法、基于谱熵的检测方法、基于倒谱的检测方法等,这些方法在实际应用中对于环境的泛化能力较弱,算法的鲁棒性较低,主要受噪声、音量、远近场的不同等因素影响。

正文

几个月前公司的一个项目中需要做一个鲁棒性较好的端点检测算法来更换公司在用的基于能量与过零率实现的端点检测算法,经过一段时间的折腾(为什么说折腾呢?因为公司也没告诉我用什么算法,所以全靠我自己摸索了),最后我决定用Google的开源项目WebRTC试试(无奈,我只是个来实习生啊,苦)经过一个月的探索终于有点眉目了,我通过修改了WebRTC底层算法的部分逻辑实现又经过无数次实际环境中的测试终于有一天项目经理说合格了(激动的心,颤抖的手啊)。下面我将使用WebRTC的过程中遇到的部分问题分享出来供大家参考:

首先WebRTC的VAD模块返回的是每一帧音频数据是否为语音信号的标志位,也就是直接使用的话接收到的是一帧一帧拼接的语音数据,在实际项目中使用时不能满足实际需要,听到的声音断断续续的,所以这时就需要在WebRTC中VAD算法的基础上再进行一次封装,这次封装主要解决的为题是按照实际应用中的那样将每帧音频按照语音,非语音分成完整的段。

由于我们的使用环境噪声较大,信噪比较低,实际测试中端点检测时出现了将大量噪声判别为语音的情况,所以此时我通过修改WebRTC底层判别语音信号的能量阈值(vad_core.h)KMinEnergy,这样就可以过滤掉大部分低能量的噪声对端点检测算法的影响。

其次在WebRTC的VAD中判别语音还是非语音的高斯模型中在计算六个频段的似然比之后与设定的阈值比较时,分为两种情况:

  1. 当六个频带的局部似然比阈值超过阈值门限时判别为语音;
  2. 当六个频带的似然比阈值加权求和后得到的一个全局阈值超过预先设定的阈值门限时判定为语音。

原始的算法当满足这两者之一时就可以认为此帧为语音帧,通过实验这样做的方式得到的效果并不好,所以我通过屏蔽局部逻辑判断进行了测试,实验表明这样做效果更好,端点检测精度更高。

最后在修改上述地方后我通过开放似然比阈值接口实现了再多种环境下的端点检测模式的设定。

今天就先记录到这里,后期我再详细的描述WebRTC算法的工作流程和低信噪比环境下的优化。

你可能感兴趣的:(端点检测)