回声消除问题及解决

613 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

背景概述

回声产生: 远端的声音信号首先通过扬声器播放出来,然后在房间中经过多个传播和反射路径,最后和近端的声音一起被麦克采集进去。如果没有做回声消除处理,那么远端就会把重新采集进去的远端声音信号播放出来,而且和原始的远端声音有一定的延迟时间,这就是回声

回声消除: 实时的去除麦克采集到的回声,原理见后面-其他补充

问题表现

场景表现:连麦场景中,不连麦主播声音正常,一连麦主播声音忽大忽小

数据表现:主播上行正常,且网络无卡顿丢包,观众听主播声音听不见或时断时续,听其他观众的声音确是正常的

问题分析

2个人同时说话的时候,回声消除-声音小的一方就会被抑制

上行主播外放很大,导致上行主播播放下行观众的声音时又再次被上行的麦采集到,二次采集到的观众声音比主播本人声音大,导致主播声音被抑制

解决方案

原理: 减弱回声或者增强原声

解决:

  • 行为规范-临时方案:

针对目前条件下,遇到此类问题的建议:

  1. 保证双方都带耳机效果最好
  2. 不想带耳机的话,播放设备离麦克风远一点(外放回声小些),主播说话最好离麦克风近一点(增强原声)
  3. 避免双讲模式:即连麦时尽量避免主播和观众一起说话
  • 后期解决-长期方案:
  1. 关闭回声抑制:关闭回声抑制功能,看看效果 (风险是关闭后主播声音虽然能听到了,但观众同时可能听到背景音:自己的回声、环境噪声等,因为关闭后无法消除这些了)
  2. 主动提示:针对发生问题现象时的监控指标上主动发现忽大忽小问题,提示主播调整一下说话节奏和话筒位置
  3. 环境改造-需成本:直播间房间装修(如吸声材料)改造为无回声环境,阻止远端回声产生,不会出现此类问题
  4. 优化回声消除算法:这个从技术上看不是很容易做到

其他补充

回声消除原理: 远端的声音信号和回声是相关的,但远端的声音信号并非等同于回声。远端的声音从扬声器播放出来,到被采集端采集,经历过扬声器 - 房间 - 麦克风(Loudspeaker-Room-Microphone,LRM)这样的回声馈路。在 LRM 回声馈路中传播的时候,远端声音一方面经过多次反射,另外一方面经过多次叠加,最后变得和远端声音信号有差别了,我们把这个差别用一个函数来表示:

fe=f(fs)

其中,

fs=far-end signal(远端信号);

fe=far-end echo (远端回声);

如果能够对这个函数求解,那么就可以根据远端声音信号和远端回声之间的相关性进行建模。这个模型是对回声馈路 LRM 的模拟,会高度逼近回声馈路 LRM。

等到这个模型稳定时,输入远端声音信号 fs,就可以输出高度接近远端回声的信号 fe。通过滤波器生成反相的信号,和采集到的声音信号进行叠加,就可以把回声信号消除掉。这就是回声消除 AEC 的基本原理。

这个函数求出来的解不大可能和远端回声完全一致,只能高度逼近。该函数求出来的解和远端回声越逼近,回声消除的效果就越好。

可参考:www.infoq.cn/article/how…

进一步了解可搜索关键词:回收消除技术, WebRTC, AEC