在消费类摄像头领域中,相比于视频图像方面的3A(自动曝光AE Auto Exposure,自动白平衡AWB Auto White Balance以及自动对焦AF Auto Focus)处理,在对音频数据的处理上同样存在3A处理,也就是音频3A:自动增益控制AGC(Auto Gain Control),声学回声消除AEC(Acoustic Echo Cancellation),自动噪声抑制ANS(Auto Noise Suppression)。本文的目的就是尝试对以上音频3A处理的理论技术以及工作原理流程进行总结。
下图是一个典型的音频3A处理并通过服务器与远端进行语音双向通信交互的流程图:
- •麦克风采集的数据,首先要结合收到对端的语音数据信息,识别出来其中的回声,利用AEC回声消除算法消除回声。
- •然后把经过回声消除的语音信息再经过ANS降噪处理过滤掉音频噪声,提升音频采集的品质。
- •AGC则用于根据采集语音的幅度动态自适应的调整音频增益,把传输到对端的声音信号强度调整到合适的幅度。
- •对原始音频数据进行编码并通过网络和服务器传输到语音通信交互的对端。
- •对端收到语音信息后利用各种缓冲、丢包重传等机制对音频数据进行整理。
- •对端对收到的音频压缩数据进行解码,恢复出来原始音频数据。
- •最后再结合本地混音等的设置,把原始音频数据在扬声器上播放出来。

总的来说,对于音频3A在一个全双工的双向音频对讲的应用中,一般的处理顺序是AEC回声消除最先处理,其次是ANS音频噪声抑制,最后是AGC自动增益控制环节。
二. 声学回声消除AEC
回声就是声音信号经过一系列反射之后,又听到了自己讲话的声音,这就是回声。一些回声是必要的,比如剧院里的音乐回声以及延迟时间较短的房间回声;而大多数回声会造成负面影响,比如在有线或者无线通信时重复听到自己讲话的声音(回想那些年我们开黑打游戏时,如果其中有个人开了外放,他的声音就会回荡来回荡去)。因此消除回声的负面影响对通信系统是十分必要的。
针对回声消除(Acoustic Echo Cancellation,AEC )问题,现如今最流行的算法就是基于自适应滤波的回声消除算法。本文从回声信号的两种分类以及 AEC 的基本原理出发,介绍几种经典的 AEC 算法并对其性能进行阐释。
1. 回声分类
在通信系统中,回声主要分为两类:电路回声和声学回声(线性回声和非线性回声)
a. 电路回声
电路回声通常产生于有线通话中,为了降低电话中心局与电话用户之间电话线的价格,用户间线的连接采用两线制;而电话中心局之间连接采用四线制(上面两条线路用于发送给用户端信号,下面两条线路用于接收用户端信号)。问题就出来了,造成电路回声的根本原因是转换混合器的二线-四线阻抗不能完全匹配(使用的不同型号的电线或者负载线圈没有被使用的原因),导致混合器 接收线路 上的语音信号流失到了 发送线路 ,产生了回声信号,使得另一端的用户在接收信号的同时听到了自己的声音。

在现如今的数字通信网络中,转换混合器与数模转换器融为一体,但无论是模拟电子线路还是数字电子线路,二-四线的转换都会造成阻抗不匹配问题,从而导致其产生电路回声,影响现代通信质量。由于电路回声的线性以及稳定性,用一个简单的线性叠加器就可以实现电路回声消除。首先将产生的回声信号在数值上取反,线性地叠加在回声信号上,将产生的回声信号抵消,实现电路回声的初步消除。然而由于技术缺陷,线性叠加器不能完整地将回声信号抹去,因此需要添加一个非线性处理器,其实质是一个阻挡信号的开关,将残余的回声信号经过非线性处理之后,就可以实现电路回声的消除,或者得到噪声很小的静音信号。由于电路回声信号是线性且稳定的,所以比较容易将其消除,而本文主要研究的是如何消除非线性的声学回声。

b. 声学回声
在麦克风与扬声器互相作用影响的双工通信系统中极易产生声学回声。如下图所示
远端讲话者-->远端麦克风-->通话网络---->近端扬声器--->近端麦克风-->通话网络-->远端扬声器--->远端麦克风--->远端电话-->近端电话---->......就这样无限循环,
详细讲解:远端讲话者的声音被远端麦克风采集并传入通信设备,经过无线或有线传输之后达到近端的通信设备,并通过近端扬声器播放,这个声音又会被近端麦克风采集形成声学回声,经传输又返回到远端的通信设备,并通过远端扬声器播放出来,从而远端讲话者就听到了自己的回声。
详细讲解:远端讲话者的声音被远端麦克风采集并传入通信设备,经过无线或有线传输之后达到近端的通信设备,并通过近端扬声器播放,这个声音又会被近端麦克风采集形成声学回声,经传输又返回到远端的通信设备,并通过远端扬声器播放出来,从而远端讲话者就听到了自己的回声。

远端语音信号:被远端麦克风采集的信号(说话人语音),也等于近端扬声器播放的语音,也称为参考语音
2. 声学回声消除AEC
AEC要解决的问题则是在双向语音通话中(例如电话会议中),通话一端扬声器发出的声音(这个声音来自于通话的另一端)会被同一端的麦克风收集到,并传输到另外一端,这样就会造成双方说话的声音在两端之间反复回传后形成明显的回声的效果。
从以上的这个双向通话回音生成原理的示意图上可以看出,只有在双向全双工(也就是通话两端的麦克风和喇叭都保持打卡状态)语音通话的时候才会发生回声的问题。如果是半双工的话(类似于对讲机),是不存在回音及其回音消除问题的。因为,在半双工语音通话的情况下,同一时间只有一方的麦克风打开,而且通话过程中总是一方听完对方说的话以后,才会按下通话键向对方发送自己的语音,这样的话,每次某一方的麦克风打开时,他自己的喇叭是不会发出声音的,这样的话自然就不存在回声和回声消除的问题了。当然,这样的通信方式自然是比较低效的,因为同一时间只能有一方说话。
在具体的回声消除的应用场景中,又往往根据回声产生的路径,把回声分为两种类型:
- •直接回声:也称为线性回声。是指远端传输过来的声音信号在本地端的喇叭上播放出来以后,没有经过任何反射和折射,直接被本地端的麦克风所采集的情况。这种直接回声不受环境影响,只与本地端的麦克风和喇叭之间的距离和位置有关,也因此回声产生的时间延迟相对比较好估计。
- •间接回声:也称为非线性回声。是指远端传过来的声音信号在本地端的喇叭上播放出来以后,还要经过本地端环境中的各种障碍物、墙面、地面等反射和折射回来以后,才会被本地端的麦克风所采集的情况。因此间接回声的大小与房间环境、布局甚至各种障碍物的声波吸收系数等均有关。当通话设备本身处于移动状态之下,喇叭和麦克风与回声环境各种障碍物的位置也就在始终变化中,回声的延迟也就是动态变化的,因此,这类回声相对不太好处理。
3. 回声消除问题的处理逻辑
从回声所产生的流程上讲,通话双方A和B,A端的语音信号被A端的麦克风采集以后,传输给B端,在B端的喇叭播放出来以后,又重新被B端的麦克风所采集,与B端本身的语音信号叠加在一起,再传输给A端,这样A端就能在自己的喇叭中听到自己刚才所说的话。因此,整个过程中,A端是无辜的,出现回声问题是由于B端的麦克风在采集声音的时候,把自己的语音信号和喇叭播放出来的A端语音信号混合在一起,未作任何处理直接发给A端,导致A端出现回声问题。

因此,回声问题的解决,就要从B端着手,在B端麦克风采集到音频数据后,要从其中识别和分离出来自己的语音信号和喇叭中播放的A端的语音信号,然后把麦克风采集的混合音频信号中的A端语音信号处理掉,只保留自己的语音信号,然后再发给A端。这就是针对这个问题需要在B端引入AEC回声消除模块的处理逻辑所在。
当然,因为A端和B端始终是在全双工双向语音通信之中,双方是对等的,那么在实践中就需要在两端同时分别加入各自的AEC回声消除功能和模块,在这个模块中把自己喇叭播放出来的对端语音信号从麦克风采集的混合信号中识别并消除掉。
4. 回音消除的工作原理
如上所述,所谓的回音消除,就是在麦克风端接收到的混合信号中,把本地喇叭播放出来的远端语音信号识别出来,并且消除掉,确保只有本地的原始语音信号会被被传输到另外一端。那么针对这个设计需求,回音消除模块的实现上一般而言就存在以下四个模块。
a. 时延估计**(Time Delay Estimation, TDE)**模块。
要把喇叭播放出来的远端语音信号消除掉,首先要能够从本地麦克风采集的混合信号中把该信号识别出来,并确定出来喇叭播放出来的远端语音信号和本地麦克风采集的语音信号之间的时间差。有了这个时间差,才能在后续的处理模块中准确的定位需要削弱的远端语言信号在麦克风采集数据中的位置。
那怎么才能找到两个语音信号(收到远端的语音信号数据,本地麦克风采集的语音信号数据)之间的时间差呢?答案是对两个语音信号做切片处理,分别针对分片的音频数据帧做傅里叶变换,得到其频谱数据,然后通过互功率谱等计算来比较二者在频域上的相似性,直到找到双方的音频数据的频谱表现在哪个切片上一致性最佳,就找到了双方的时间差。
b. 基于自适应滤波器的线性回声消除**(Linear Acoustic Echo Cancellation, AEC)**模块。
该模块是整个回声消除模块的核心所在。
在回声消除算法的具体实现中,以本地接收到的远端语音数据作为输入,通过动态迭代和更新自适应滤波的滤波器权重参数,使其输出信号尽可能接近真实的回声信号数据,最终从麦克风采集到的混合信号中减去自适应滤波器输出的预测回声数据,达到保留纯净本地语音数据的目标。
c. 非线性残留回声抑制**(Residual Acoustic Echo Suppression, RAES)**模块。
以上基于自适应滤波器实现的线性回声消除模块,仅能消除声学路径的线性回声成分,但是无法完全消除非线性失真。因此,在使用自适应滤波器对线性回声进行过滤之后,就需要利用非线性模块,通过频域能量分析、动态增益控制等手段,进一步抑制残留的非线性回声。
d. 双向对讲检测**(Double-Talk Detect, DTD)**模块。
该模块通过对远端语音数据以及本地麦克风采集的语音数据的动态监测,判断当前是只有一方在说话,还是双方都在说话。
因为如果双方同时对讲的情况下,本地麦克风采集的音频数据中就同时包含了双方的语音数据,在这种情况下,本地的语音信号就会被误判为回声的残留部分,导致滤波器参数错误更新。因此在算法通过双向对讲检测模块识别到双方正在处于双讲状态时,就会冻结滤波器权重的更新,避免算法因噪声干扰而发散。
而如果双向对讲检测模块检测到当前只有一方在说话时,就可以恢复对自适应滤波器的权重更新,并且提升滤波器的回声抑制强度,彻底消除残留回声,从而达到更好的对讲效果。
结合下图可以更好地理解完整的回音消除算法的实现,及其各个子模块在完整的回音消除流程中所起的作用。
