腾讯云游戏多媒体引擎GME(Gaming Multimedia Engine,以下简称 GME)针对网吧场景提出了一套降噪技术解决方案,能在复杂的环境下将噪音对语音的影响降到最低。

如何在复杂的网吧环境下实现降噪?

在网吧嘈杂环境下的降噪诉求是:队友不讲话时,听不到任何其他声音,当队友讲话的时候,希望听到的是队友清晰的声音,当队友话毕其他声音随即静默。
以上要解决的问题可以抽象成嘈杂环境里单一主讲人的通话处理。针对可容忍的体验诉求,需要一个排除主讲人以外声音的语音活性检测算法(VAD)。而这个VAD算法和常规意义的语音检测有所不同,因为它不但要排除掉非语音,还要排除掉主讲人以外的语音,否则队友附近的人的话音甚至环境较远处的嘈杂语音仍会被发送给耳机这头的你。
针对这样的情况,GME朝着满足诉求的方向,给出了这个“VAD”算法,流程如下:
在判断声音性质时,一个要进行的过程是,计算语音的相关性,相关性测度定义如下:
E(τ)=N−1∑n=0[s(n)−βs(n−τ)]2
其中 β 为增益因子,N 为分析帧长。令∂E(τ)∂β=0 ,求得:
β=N−1∑n=0s(n)−βs(n−τ)N−1∑n=0s2(n−τ)
从而,有
E(τ)=N−1∑n=0s2(n)−[N−1∑n=0s(n)s(n−τ)]2N−1∑n=0s2(n−τ)
相对误差能量为
R[E(τ)]=E(τ)N−1∑n=0s2(n)=1−ρ2(τ)
其中
ρ(τ)=N−1∑n=0s(n)s(n−τ)√N−1∑n=0s2(n)N−1∑n=0s2(n−τ)
为了得到这个结果,还需要做一些预处理:
1,去均值:分析窗口内非零均值或非常低的低频噪声出现时,ρ(τ) 会在所有τ 上都很大,这对依赖ρ(τ) 进行清浊分类时的安静段语音尤其麻烦。解决办法是去掉均值:
s′(n)=s(n)−1NN−1∑n=0s(n)
2,低通滤波:为减小高频共振峰和高频噪声的影响,要进行一个800赫兹的低通滤波,去掉大部分共振峰影响,并可以再基音频率最高500赫兹时仍能保留其一次,二次谐波,其技术指标要求为:
1T=8000Hz ,ωc2π=800Hz,ωr2π=1200Hz,1−δ1=−0.25dB,δ2=−50dB
据此,由双线性变换法设计一个五阶的滤波器,幅频响应如图:
3,数值滤波:
上述低通滤波可以较为有效的去掉第三个第四个共振峰的影响,但前两个共振峰的影响仍然存在,浊音语音周期性会模糊,为了去掉这一影响,进行数值滤波。数值滤波能正确显现信号的趋势,如上升沿:
y(n)=12K+1K∑i=−Kx(n+i)
但这个是个非因果的数字系统,为了因果性改写如下:
y(n)=1NN∑i=0x(n−i)
注意,这个过程引入了算法延时。