回声消除的技术实现|牛人说

类别:
技术道场
发布时间:
7月22日

本文从回声产生的原因、回声消除的技术挑战、回声消除算法介绍等方面入手,分享七牛云在 AEC 技术方面的实践经验。

导读: 回声消除作为 3A(AEC、ANS、AGC)算法之一,是音频前处理的重要环节。回声一般出现在同时有音频的采集和播放的场景,比如:连麦互动、混音返听等等,采集到的音频通过扬声器又播放出来,同时又被采集进去,从而产生了回声或者啸叫声。

在业界,回声消除技术是公认的难题,它本质上并不是一个简单的算法问题,而是一个系统性的问题,涉及到设备、使用场景、空间环境等。

本文从回声产生的原因、回声消除的技术挑战、回声消除算法介绍等方面入手,分享七牛云在 AEC 技术方面的实践经验。



一、回声是如何产生的?

谈到回声,大多数人能想到的场景:你对着一个空旷的山谷喊叫时,会有回声传来。这种回声是由空间反射,语音信号碰到阻碍,返回到说话人,从而听到回声。

而在我们音视频系统中所说的回声,则通常是因为,麦克风和喇叭距离较近,麦克风直接采集到喇叭播放的声音,并发送给对方,从而导致对方听到自己的回声。

对于回声的影响,麦克风直接采集到的喇叭声音,是最重要的因素,空间反射造成的回声被麦克风采集,其强度通常要弱于麦克风直接采集的回声,可能形成多个不同的延迟的回声信号。

并且,由于设备的扬声器和麦克风性能各不相同,很多情况下,都可能导致失真,也即麦克风采集的扬声器的声音,与播放的声音并不完全一致,里面有很多的非线性变化。


二、回声消除的技术挑战?

要做到消除回声,我们首先需要让系统能识别出什么是回声,才能将回声消除,而不会影响对方的正常通话。人耳可以很轻易地判别出听到的声音是自己的回声,还是对方的声音。但系统不行,对于麦克风来说,无论是回声还是本地端的人员说话,从声学特征上来说,都没有区别。

所以这时候回声消除系统需要知道刚才播放了什么声音,专业术语叫远端声音,或者参考声源,基于参考声源,我们就可以知道扬声器播放了什么声音,从而可以通过算法来估计麦克风采集的声音是否是回声。有了参考声音,以及本地端麦克风采集的声音,我们就可以考虑从麦克风采集的声音中,将回声给消除。

回声消除的性能取决于以下几个因素:

1)参考声音和本地声音的时延对齐速度和准确性

2)用来通过参考声音来估计回声的线性滤波器性能

3)残留回声的估计准确性

回声消除的时延,对于同一类型终端来说,变化不大,如果只有一种硬件设备,我们可以将该时延预置,只做较小的调整,从而可以大大加速时延对齐的速度,提高回声消除算法的性能和稳定性。对于硬件也自行研发的厂家来说,底层的播放和采集的时延基本上可固定。

但对于音视频 SDK 来说,软件可能运行在各种不同的终端上,并且拿到的参考声音并不真正是底层喇叭播放的数据,可能因为网络,硬件不同等原因,导致时延并不相同。因此,需要由算法来估计时延。

估计时延的算法,通常主要是基于时域的 NLMS 算法(即归一化最小均方算法)和基于频域或者时域的相关算法。两者都能快速跟踪时延变化。时延估计并不需要特别精准,只要能大体对齐,消除算法就可以生效。

对回声消除性能影响更大的还是线性处理和非线性处理,这两大块也是难点。

在对齐时延后,就需要通过线性滤波器模拟回声路径,根据参考声音,模拟出回声,并从采集的声音中将回声消除。

目前业内比较常见的线性滤波器算法代表为卡尔曼滤波器,开源代码 Speex 所用的 MDF(Multidelayblock frequency domain adaptive filter)算法,WebRTC 所采用的 PBFDAF 算法(Partitioned Block Frequency Domain Adaptive Filter)。

从鲁棒性来说,卡尔曼滤波器算法更高,但收敛较慢。Speex 的 MDF 算法对滤波器系数的计算方法进行了优化,试图提高算法收敛速度。但这些算法经测试,大多数线性性能也只有十几 dB 的线性回声消除性能,且滤波器的收敛速度都较慢。而线性回声消除性能的好坏,将决定双讲性能的优劣。

在线性回声消除之后,就进入到回声的非线性处理阶段,以进一步消除残留回声。就像前文所说,如果线性处理的性能不佳,残留回声较多,为了消除回声,必然对可能存在残留回声的声音进行更多的抑制,从而导致本地讲话人的声音也被抑制,影响双讲感知。

比如,如果麦克风采集到的回声有-20dB,那么线性消除后,回声为-35dB,要达到人耳听不到回声的效果,可能需要在非线性阶段施加接近 40~45dB 的抑制,本地声音如果也在-30dB 左右,就会导致本地声音也近似被完全抑制。

在非线性处理阶段,并没有统一的方法,各个厂家各显神通,依据设备的非线性失真情况,估算的混响情况,以及线性滤波器性能,会进行不同的非线性处理操作,从而体现出不同的回声消除性能。


三、回声消除算法介绍?

七牛云作为一站式智能视频云服务商,在考虑软件的鲁棒性和普适性基础上,为了提高回声消除的性能,并未采用业界的传统的线性滤波器算法,而是依据回声消除的基本原理,独辟蹊径地采用不同的线性滤波器算法,从而在线性滤波器收敛速度和线性消除性能上,明显领先于业内的通用算法。

1、线性滤波器的收敛速度比较

如下图,依次为“近端语音信号 ”,“参考信号”,“开源算法 WebRTC 的线性滤波器处理结果”, “开源算法 Speex 线性滤波器处理结果”,以及“七牛云自研回声消除算法线性滤波器处理结果”。

从下图,我们可以看到,当存在回声时,WebRTC 和 Speex 的开源算法,都存在明显的一个收敛时间,大约 1~2 秒钟之后,线性滤波器的输出回声才逐渐减小,并相对稳定。

而七牛云的自研算法,在回声出现的一瞬间,线性滤波器就达到最大的回声抑制效果,几乎没有收敛时间,就进入了稳态的回声抑制阶段,而且线性消除效果明显优于其他两个开源算法。

2、线性滤波器的增益比较

七牛云的线性滤波器在内部的测试集中,80% 以上可以稳定在 20dB 以上,部分场景甚至可以达到 37dB 左右的回声线性抑制效果。而两个开源算法在多数场景中都只能获得十几个 dB 的线性增益。

比如下图, 频域的音频图,依次为“近端语音信号 ”,“参考信号”,“开源算法 WebRTC 的线性滤波器处理结果”, “开源算法 Speex 线性滤波器处理结果”,以及“七牛云自研回声消除算法线性滤波器处理结果” 。

从下图,我们可以看到,对于 WebRTC 和 Speex 两个开源算法而言,其线性滤波器的输出,都存在大量的回声,而七牛云的线性滤波器的输出,回声已经基本得到抑制,仅存在少数残留。七牛云的回声抑制算法,明显优于两大开源算法。

3、AEC 算法在啸叫抑制上的应用

得益于七牛云的回声抑制算法,我们的终端在近端通信场景下,取得了良好效果。比如,我们使用两个测试终端:华为 Mate3,小米 11。

测试方法:开启 70% 外放音量,相距 1 米,平置桌面,办公室内开放场景,两者同时接入同一会议 ID。

1)开启 Qiniu 自研 AEC 算法测试对比:

在开启 Qiniu 音频算法后,正常进行对话,华为 Mate3 和小米 11 都可以清晰地听到声音,无啸叫,无重音。

2)只开启硬件回声消除算法或者两大开源的回声消除算法:

则几乎无法进行正常业务,会发生此起彼伏的啸叫。在尚未说话时,一个轻微的噪声就会诱发啸叫,并且说话时有重音,声音震荡,诱发长时间啸叫。

正如前文所述,由于回声问题的复杂性,回声消除技术一直是业界公认的难题。虽然七牛云回声抑制算法综合比较下来具有一定的优势,但要想完美解决回声问题,除了要有强大的算法,还需要在实际应用场景中不断地进行优化训练。七牛云也将持续打磨回声消除技术,为用户提供最佳的通话效果。

微信咨询
微信咨询
电话咨询
智能客服