阿里QA导读:前两期,柯淮、洵武分别给大家介绍了音频降噪的原则和测试实践、音频回声消除(AEC)原理及测试。在音视频中,突然而来的刺耳轰鸣,会引起用户极度的不舒适,本期阿里巴巴企业智能事业部萦盈给大家带来“音频啸叫抑制原理及测试”。

一、算法背景

在我们的音视频会议系统中,当正在同一场会议中的两个设备挨得够近,就会产生刺耳的鸣叫,对用户造成极度不舒适的体验,这就是在啸叫。

在对声音问题的处理中,包括声音增益、噪声消除、回声消除和啸叫抑制等算法,其目的就是减少音视频会议过程中声音的质量问题,提升音频质量。本文针对啸叫产生的原因,啸叫抑制算法,啸叫抑制收敛效果的测试方法,以及音视频产品啸叫抑制的实现效果进行简单的介绍。

二、啸叫原理

java分析jvm java分析声音分贝_音频的音量检测java实现

如上图所示,声音信号首先从麦克风拾入,经过扩声系统的功率放大器放大后由扬声器送出,经过各种障碍物的反射后,又被麦克风拾入,从而形成一个闭合环路。如果传声器对某些频点的拾音灵敏度过高,导致声音在这些频点的增益是正值,就形成了一个正反馈过程,声音信号经过多次反复循环放大后,在某些频点的声音强度超过一定的增益上限,就会发生自激震荡,形成啸叫。    原理如下图所示:

                       

java分析jvm java分析声音分贝_java分析jvm_02

其中,v(ω)是近端语音信号,u(ω)是扬声器聩给信号,y(ω)是麦克风采集信号,x(ω)是经过传递函数G(ω)作用产生的反馈信号。C(ω)是放音系统传递函数,主要是A/D、D/A产生的时延,K是扬声器增益。整个反馈的幅值需要将信号放大:C(ω)→K→G(ω) ,增益为:|KC(ω)G(ω)|,其啸叫产生的数学描述是:|K·C(ω0)·G(ω0)|≥1


在音视频会议场景中,设备1采集的声音,通过网络传输在设备2的扬声器播放出,由于在同一个空间,设备2的扬声器播放出的声音,经过室内混响,又被设备1的麦克风采集到了,同一个信号声音经过麦克风到扬声器的增益和扬声器到麦克风的增益,被不断放大,产生啸叫。                          

java分析jvm java分析声音分贝_音频的音量检测java实现_03

产生啸叫的典型场景是一个空间中,存在两个同时采集和播放声音的设备,比如当我们携带笔记本到会议室中开会时,会议室的座机也会被拉入同一场会议中。此时会议室座机和笔记本电脑都在同时采集和播放声音,容易产生啸叫。

三、啸叫检测和啸叫抑制

1、啸叫检测

为了检测和抑制啸叫信号,需要对啸叫信号的基本特性做一定的分析,对啸叫信号在时域和频域上进行分析,最终得出以下结论:啸叫信号的时域波形是一个频率恒定的正弦波,其幅值随着时间的增加迅速增大,直到超出了功放放大区,进入饱和区和截止区时,产生削波现象,如下图所示:

                                      

java分析jvm java分析声音分贝_自适应_04

啸叫的频谱图如下所示,可以看到持续性的声音能量:

                                           

java分析jvm java分析声音分贝_测试方法_05

啸叫检测的算法框图如下所示:

          

java分析jvm java分析声音分贝_测试方法_06

啸叫检测从用户层面上来说,就是要在啸叫发生时,在尽可能少的时间内,提示用户已经产生啸叫,在啸叫抑制算法生效前,通过一些人为手段切断啸叫,比如关闭自己本端的麦克风和扬声器。而从音频系统层面来说,啸叫检测是啸叫抑制的前提,当算法检测到啸叫相应的频率点后,啸叫抑制算法才开始生效,啸叫抑制的目的就是通过算法尽快尽可能的在用户不干预的前提下消除啸叫。

2、啸叫抑制的方法

1. 一些物理方法

形成啸叫的一个条件是扬声器的声音经过空间的反射,又被麦克风采集到了。因此很多工程人员在结构声学,室内装修方面下功夫,以减少声音的反射,避免啸叫的产生,不过这样的造价成本非常大。

另外像是在大会会场,主持人麦克风讲话,现场扬声器播放,也容易产生啸叫,这个时候需要专业的音响师通过均衡器对播放的声音进行调节,均衡法的原理就是通过衰减或切除声音信号中某些过强的频率来抑制住声反馈。均衡器首先将声音频率进行分段,然后通过调节各频率段增益来弥补声场合扬声器的缺陷,达到抑制某一频点啸叫的目的。


在音视频会议室场景中,也可以通过1.佩戴耳机 2.增加两台设备之间的距离 3.调低扬声器的音量 4.短暂关闭声音再打开 的方式来阻断啸叫的产生。

2. 移频移相法

移频就是移动频率,移频器的工作原理是对声音信号的频点向上或向下移几个或几十个频点,破坏构成声反馈的条件,最终达到防止啸叫的目的。但是,移频法导致了整个声音频率范围内的频率失真,对音质损伤较大。

3. 压限法

它的工作原理是根据输入声音信号的大小自动改变输出信号的增益。当声音信号强度超过设定的电平值时,压缩器就将压缩比调到∞:1,语音信号强度就不会再继续增大,啸叫也就自然而然地被消除掉了。但是,这种抑制方法会对声音带来动态损失,不适宜要求较高的场合。

4. 陷波器法

原理是将啸叫频点对应的频段进行增益衰减,就是通过窄带滤波器/自适应滤波器进行特定频率的滤波,前提是找到这个频率。与前述方法不同,采用陷波器法也就是需要首先进行啸叫检测,检测原则可以通过峰值/均值比等参数准则得出。检测出成分之后,利用陷波滤波器破坏

java分析jvm java分析声音分贝_音频的音量检测java实现_07

条件,从而达到啸叫抑制的目的,其原理如下图所示:                     

java分析jvm java分析声音分贝_音视频_08

5. 自适应声反馈抵消法

自适应声反馈抵消法,利用FIR滤波器模拟声场的反馈,利用输入信号

java分析jvm java分析声音分贝_自适应_09

,减去啸叫信号

java分析jvm java分析声音分贝_音频的音量检测java实现_10

,获得误差信号

java分析jvm java分析声音分贝_自适应_11

,其中

java分析jvm java分析声音分贝_音频的音量检测java实现_10

由功率放大后信号

java分析jvm java分析声音分贝_java分析jvm_13

经过FIR滤波器得到,最后利用误差信号

java分析jvm java分析声音分贝_自适应_11

按照一定代价函数自适应迭代更新FIR滤波器系数,并得到相应准则下最优的FIR滤波器系数,其原理如下图所示:                        

java分析jvm java分析声音分贝_java分析jvm_15

6. 神经网络算法

神经网络算法原理是通过将啸叫声和干净语音数据来训练出一个神经网络模型。把啸叫声当成噪声来消除。缺点是神经网络训练需要较多数据,潜在的风险未知。但优势也很明显,就是立竿见影不需要去估计啸叫的各种模型。

四、测试方法

1.对其他算法的影响

啸叫抑制之前的算法处理模块是回声消除和噪声抑制,有时AEC算法在一些脉冲信号下可能会出现回声残留,这些残留回声不断放大,产生啸叫。测试中需要关注这种现象。以及啸叫抑制后没有其他的音频算法,需考虑啸叫抑制的效果以及对于音质的影响,例如人声模糊、音量突然降低等情况。

对AEC的影响:由于AEC算法需要前一段时间的参考信号,因此如果产生了啸叫,会对后一时段的AEC算法产生影响,导致其无法收敛。

2.测试方法

对于一个已经发生了啸叫的场景,为了减少对用户体验的影响,需要尽快尽可能的消除啸叫,针对啸叫抑制效果的测试,主要考察的是收敛时间和收敛效果两点。

    在测试过程中,需要构造啸叫场景,并将啸叫声音进行录制,通过分析啸叫频谱考察收敛效果。为避免多啸叫干扰,需要禁掉其中一个设备的扬声器和另一个设备的麦克风,其测试拓扑如下所示:

java分析jvm java分析声音分贝_测试方法_16

获得啸叫抑制效果的录音文件后,再对录音文件进行分析,从啸叫产生时间开始到啸叫结束,为啸叫抑制时长;啸叫的收敛效果选择啸叫收敛后的平均RMS作为衡量标准,另外在对比各产品时,也考察同等距离下,发生啸叫的最小音量。

3.竞品现状

以下分别为 A、B和C 三个产品的啸叫抑制时域图:

产品 A

产品 B

产品 C

java分析jvm java分析声音分贝_java分析jvm_17

java分析jvm java分析声音分贝_测试方法_18

java分析jvm java分析声音分贝_音视频_19

各个产品的收敛速度和收敛效果如下:

产品

啸叫收敛时间

收敛后 RMS

A

1.83s

-39.89dB

B

5.17s

-41.71dB

C

11.48s

-44.34dB

在上述产品中,阿里会议收敛速度最优,在2s内就可以完成啸叫收敛, C的啸叫收敛则需要10s以上。在收敛后的平均RMS上,各产品相差不大。