回声消除 (AEC, Acoustic Echo Cancellation)是 WebRTC 的经典应用场景之一。
场景是:设备既能播放声音(扬声器/喇叭),又能录制声音(麦克风),但我们不想录制到自己刚刚播放的声音,只想保留“真实外部声音”(比如讲话的声音)。WebRTC 内置的 AEC 算法就是用来解决这种“扬声器-麦克风环路”。
原理简述
- 问题:当设备播放声音时,麦克风会“捡到”这些声音,导致对方听见自己说过的话的回声。
- 解决思路:WebRTC AEC 模块会使用回音路径建模算法,利用播放端输出的信号作为参考,尝试在录音流中将其抵消掉。
- 实现方式:在浏览器中,
getUserMedia
支持音频约束{echoCancellation: true}
,即可启用系统/浏览器内置的 AEC 算法;同时通过MediaStream
将播放和采集都放在同一上下文中。
示例演示(可直接运行在浏览器中)
下面我给出一个完整脚本,封装为模块化函数,场景是:
- 播放一段远程/本地音频。
- 同时麦克风采集声音,但不要包含播放声——依靠 WebRTC AEC 自动消除。
- 我写了详细注释,结构上分 初始化/播放/录制/测试