回声产生
回声就是声音信号经过一系列反射之后,又听到了自己讲话的声音,这就是回声。
在RTC实时语音通话中,是近端通话者的声音被自己的麦克风拾取后通过网络传到远端,远端扬声器播放出来的声音被麦克风拾取后通过网络又重新发回近端,再加上网络和数据处理等各种延迟的影响,使得近端通话者能够从扬声器中听到自己的刚才所说的话,就产生了回声。
回声消除
回声消除:就是在麦克风采集到声音之后,将本地扬声器播放出来的声音从麦克风采集的声音数据中消除掉,使得麦克风录制的声音只有本地用户说话的声音。
回声消除的基本原理:使用自适应滤波算法,以扬声器信号与由它产生的多路径回声的相关性为基础,建立远端信号的语音模型,利用它对回声进行估计,并不断修改滤波器的系数,使得估计值更加逼近真实的回声,然后将回声估计值从麦克风的输入信号中减去,从而达到消除回声的目的。
回声消除的基本步骤:
第一步,需要找到参考信号/扬声器信号(蓝色折线)跟麦克风信号(红色折线)之间的延迟,也就是图中的 delay=T。
第二步,根据参考信号估计出麦克风信号中的线性回声成分,并将其从麦克风信号中减去,得到残差信号(黑色折线)。
第三步,通过非线性的处理将残差信号中的残余回声给彻底抑制掉。
回声消除方案
Android回声消除方案
方案 | 硬件回声消除 | Android系统回声消除API | WebRTC库 | Speex库 |
实现方式 | 在硬件电路上集成DSP处理芯片,通过VOICE_COMMUNICATION模式进行录音,自动实现回声消除。 | 利用Android自身带的AcousticEchoCanceler进行回声消除处理 | 接入WebRTC AECM开源库,验证语音通话时回声消除效果 | 接入Speex DSP开源库,验证语音通话时回声消除效果 |
建议 | 不建议,此方案不通用。当使用摄像头自带的麦克风采集音频,而这些麦克风没有硬件回声消除等处理时,无法实现回声消除。 | 不建议。有些Android设备并未实现回声消除。 | 强力推荐。市面上大多数回声消除方案都是基于此开源库。 | 建议。Speex具有回声消除模块。 |
通过硬件回声消除和Android系统回声消除API的方式,都有局限性,所以市面上基本上都是采用第三方回声消除方案。
AEC相对较难,要做好很不容易,在WebRTC开源前主要是大公司和专业的算法公司有好的实现方案,一般公司要想产品里有EC就去买算法库,但在WebRTC开源后一些核心的算法(包括AEC/ANS/AGC等)也随之开源,这样众公司开始用WebRTC里的算法,尤其是互联网公司,AEC等算法基本都是基于WebRTC。
当使用WebRTC或Speex第三方库进行回声消除的时候,需要将近端采集到的音频数据传入作为源数据,同时需要将远端要播放的音频数据传入作为参考数据,然后还需要传入一个延时间隔(因为播放的声音需要传播,而且麦克风采集声音还有相应的缓冲区),这样第三方库就能工作,从而得到回声消除后的声音