直播连麦音频与回声消除

本文梳理「直播连麦时,粉丝听到自己的声音」这一类回音问题的技术原理与解决办法。以 Mac 原生直播(微信视频号直播伴侣 + OBS + 大疆 DJI Mic + 耳机)为落点,先讲清回音从哪来、音频链路怎么走、回声消除(AEC)如何工作,再给出可执行的配置手册与排查清单。

一句话结论:回音的本质是「粉丝的声音被放出来后,又被主播这一端重新采集并回传」。要彻底消除,核心是让粉丝的连麦声只进耳机、不进扬声器,且不在软件里被二次采集。

1. 现象与本质

连麦回音的典型表现:粉丝在连麦时,从自己耳机/扬声器里听到了自己刚说的话,且往往带一点延迟(几十到几百毫秒)。这不是粉丝设备的问题,而是主播这一端的音频形成了回环。

回环有两条物理路径,理解它们就理解了全部排查方向:

1.1 声学回音(Acoustic Echo)

粉丝的声音在主播电脑上被扬声器外放出来,声波在空气中传播,又被主播的麦克风拾取,混进主播上行音频里传回粉丝。这条路径靠空气传播,所以:

1.2 电气回环(Electrical / Loopback Echo)

声音没有经过空气,在电脑内部就被「原样搬回去」了。常见来源:

电气回环戴耳机也断不掉——因为它根本不走空气。这类问题只能靠「关掉回环采集/监听」来解决。

对比项声学回音电气回环
传播介质空气电脑内部音频总线
断掉的方法戴耳机关闭回环采集 / 监听
AEC 能否处理可以(有条件)通常无法,必须改路由
典型设备扬声器 + 麦克风BlackHole / 立体声混音 / 监听开关
排查口诀:先断声学(戴耳机),再断电气(关回环、关监听)。两个都断了还回音,才是算法/平台侧问题。

2. 基础原理:音频管线与延迟

2.1 一条音频的完整旅程

数字音频的本质是「按固定时间间隔对声波采样」。直播连麦的音频要经过一条完整的管线:

阶段英文做什么Mac 上对应
采集Capture麦克风把声波转成数字采样帧CoreAudio / USB Audio 驱动
处理DSPAEC、降噪、增益、混音微信/直播伴侣/OBS 内置,或虚拟声卡
编码Encode压缩为 Opus/AAC 等码流推流 SDK
传输Transport经网络发往平台服务器RTMP / 私有连麦协议
渲染Render把收到的音频交声卡播放CoreAudio → 耳机/扬声器
采样率(Sample Rate)
每秒采样次数,直播通用 48 kHz。链路中若采样率不一致,会触发重采样,既增加延迟也可能引入杂音。
帧(Frame)
一次处理的最小音频块,常见 10 ms / 20 ms。AEC 按帧工作,帧越长算法看得越远、但延迟越高。
CoreAudio
macOS 的底层音频框架,管理所有物理与虚拟音频设备、采样率与时钟同步。
虚拟声卡(Virtual Audio Device)
纯软件模拟的音频设备,可把一个应用的输出「变成」另一个应用的输入,是 OBS 抓取系统声音的关键,也是电气回环的常见来源。

2.2 延迟与回声感知

回音之所以「听得出来」,是因为它比原声晚到。总延迟由几部分组成:

一般规律:延迟越大,回音越容易被分辨;当回音延迟小于约 10 ms 时,人耳会把它感知为「房间混响」而非回声。这也是为什么 AEC 必须知道精确延迟——它要靠延迟对齐参考信号才能抵消。

3. 核心算法

3.1 AEC 回声消除(Acoustic Echo Cancellation)

AEC 是解决声学回音的核心算法。它的思想很直观:既然我知道扬声器刚刚播了什么,我就能预测麦克风里混进了什么,然后把它减掉。

参考信号(Reference Signal)

AEC 必须拿到「将要播放的音频」(即下行粉丝声)作为参考,再与麦克风采集到的信号对比,估计出「扬声器→麦克风」这条声学路径的传递函数,从而抵消。参考信号拿不准,AEC 就失效。

自适应滤波(Adaptive Filter)

声学路径会随人走动、房间变化而改变,所以 AEC 用自适应滤波器(如 NLMS)实时估计这条路径的冲激响应,滤波器长度决定了能消除多大延迟范围内的回音。

双讲(Double-Talk)

当主播和粉丝同时说话时,麦克风里既有主播声又有回音,算法很难区分,容易误伤主播声音或残留回音。双讲检测(Double-Talk Detection)会临时冻结滤波器更新,保证主播声音不被削弱。

ERLE 与非线性处理

ERLE(Echo Return Loss Enhancement)衡量 AEC 把回音压掉了多少 dB。线性滤波之后通常还会接一个非线性处理器(NLP / Residual Echo Suppressor)处理残余回音。

AEC(回声消除)
用参考信号抵消麦克风中的扬声器回音。
AES / AGC(自动增益控制)
把音量自动调到合适范围,避免忽大忽小。
参考信号(Reference)
送给 AEC 的「已播放音频」,是 AEC 生效的前提。
ERLE
回声抑制量,单位 dB,越大越干净。
双讲(Double-Talk)
双方同时说话的状态,是 AEC 最难的场景。

3.2 NS / AGC / VAD / Jitter Buffer

算法全称作用与回音的关系
NSNoise Suppression抑制稳态背景噪声(风扇、空调)不消回音,但能掩盖残余
AGCAutomatic Gain Control自动调整音量到目标电平增益过大可能放大回音
VADVoice Activity Detection判断当前是否有语音辅助 AEC 在静音期更新滤波器
Jitter Buffer抖动缓冲平滑网络抖动,抗丢包增加延迟,让回音更明显
为什么手机不戴耳机也不回音?因为手机的通话 AEC 是「免提级」的:系统能拿到精确的播放参考、延迟稳定、麦克风与扬声器位置固定,AEC 效果极好。桌面软件(尤其外接麦克风 + 虚拟声卡)这些条件很难同时满足,AEC 就压不住了。

4. 行为图(系统做什么)

4.1 用例图 — 系统功能全景

PlantUML diagram
图 4.1:直播连麦音频系统用例图

4.2 序列图 — 连麦一次音频往返

PlantUML diagram
图 4.2:一次连麦往返音频流与 AEC 参考信号

4.3 活动图 — 回音排查流程

PlantUML diagram
图 4.3:回音排查决策活动图

4.4 状态机图 — 音频流生命周期

PlantUML diagram
图 4.4:音频流处理状态机图

5. 结构图(系统由什么组成)

5.1 数据流图 — 回音的两条路径

PlantUML diagram
图 5.1:回音的两条路径(声学回音 + 电气回环)

5.2 部署图 — Mac 音频部署拓扑

PlantUML diagram
图 5.2:Mac 直播音频部署拓扑(物理设备 / 系统音频层 / 应用层)

5.3 组件图 — 音频子系统

PlantUML diagram
图 5.3:音频处理子系统组件图

5.4 类图 — 音频对象模型

PlantUML diagram
图 5.4:音频对象抽象类图

6. 场景机理对照

把前面的原理落到具体场景,就能解释「为什么别人可以、我不可以」。

场景为什么能/不能消回音结论
手机连麦,不戴耳机 系统级免提 AEC,参考信号精确、延迟稳定、麦克风与扬声器固定 可以,几乎无回音
Mac 桌面 + 内置麦 + 外放 桌面 AEC 弱,但参考信号来自同一系统,若关闭监听/回环,勉强可用 有条件可以,音量要小
Mac 桌面 + 外接麦(DJI Mic)+ 外放 外接麦经过 USB 与独立增益,AEC 参考与实际回音路径对不齐,且麦克风在空气中直接拾取扬声器声 容易回音,必须戴耳机
带硬件 AEC 的会议麦/USB 音箱 设备内置 DSP 做回声消除,不依赖主机软件 可以,但设备成本高
用虚拟声卡抓系统声 + 监听 系统输出被当作输入再采一遍,电气回环 必然回音,必须改路由
看似没戴耳机的主播 多半戴了隐藏式耳返(IEM),或用了带 DSP 的设备,或其实在手机上播 不是真的「无耳机」
结论:「不戴耳机也能连麦」在手机上或硬件 AEC 设备上成立,在「Mac + 外接麦 + 软件混音」这套架构上很难成立。对绝大多数主播,戴耳机是最稳、最便宜的解法。

7. 实战操作手册(Mac 原生)

目标架构:视频走 OBS 虚拟摄像头 → 直播伴侣;音频只保留一条链路,粉丝声只进耳机。两种音频架构二选一,绝不能两边同时采麦克风。

铁律:麦克风只能有一路在采;粉丝的连麦声只能进耳机,不能进扬声器,也不能被虚拟声卡二次采集。

7.1 方案 A:音频统一走 OBS(适合需要 OBS 混音/滤镜)

  1. 安装虚拟声卡:安装 BlackHole 2ch(免费)。
  2. 创建多输出设备:打开 macOS「音频 MIDI 设置」→ 左下「+」→「创建多输出设备」→ 勾选耳机与 BlackHole 2ch;把系统输出切到这个多输出设备。这样你听得见,同时系统声也进 BlackHole 给 OBS。
  3. OBS 添加音源:
    • 「音频输入采集」→ 设备选大疆 Mic(主播声)。
    • 「音频输入采集」→ 设备选 BlackHole 2ch(系统/粉丝声)。
  4. 关闭监听:对每个音源点齿轮 →「高级音频属性」→ 把「音频监视」设为关闭(最多设为「仅监视(输出静音)」)。绝不选「监视并输出」。
  5. 统一采样率:OBS → 设置 → 音频,采样率设为 48 kHz;BlackHole 在「音频 MIDI 设置」里也设为 48 kHz。
  6. OBS 监视设备:OBS → 设置 → 音频 → 监视设备选耳机。
  7. 直播伴侣:关闭它自身的麦克风与系统声音采集;麦克风输入选 BlackHole 2ch(接收 OBS 混好的音频)。

7.2 方案 B:OBS 只传画面,音频交给直播伴侣(更简单、更不易回音)

  1. OBS:只放画面源,不添加任何音频源、不做音频混合;点「启动虚拟摄像头」。
  2. 直播伴侣:视频源选 OBS Virtual Camera;麦克风选大疆 Mic;关闭系统声音采集;如有「回声消除」选项则打开。
  3. macOS 声音设置:输出选耳机(不要选扬声器,也不要选 BlackHole/多输出设备)。
  4. 关闭直播伴侣的监听/耳返。
推荐:只需要直播伴侣连麦、不需要 OBS 音频特效时,选方案 B。链路最短,回音点最少。

7.3 大疆 DJI Mic 的注意事项

7.4 戴耳机的正确接法

「戴耳机」不只是插上耳机,而是所有会发声的路径都指向耳机:

8. 参数速查手册

8.1 OBS 关键设置

位置项推荐值
设置 → 音频采样率48 kHz
设置 → 音频监视设备耳机
音源 → 高级音频属性音频监视关闭 / 仅监视(输出静音)
音源 → 高级音频属性轨道只勾推流需要的轨道
输出 → 推流音频比特率128–160 kbps

8.2 macOS 音频 MIDI 设置

对象用途要点
多输出设备同时输出到耳机 + BlackHole勾选「漂移校正」,主设备选耳机
聚合设备合并多个输入时钟源选稳定的物理设备
BlackHole 2ch虚拟声卡采样率与 OBS 一致(48 kHz)

8.3 常见回音源速查

回音源检查项处理
声学回音是否外放戴耳机 / 调小音量 / 麦远离音箱
监听/耳返OBS、直播伴侣的监听开关关闭监听
虚拟声卡回环输入里是否有 BlackHole/立体声混音取消回环采集,只留物理麦
多输出设备回灌输出是否同时指向虚拟声卡输出只留耳机
采样率不一致OBS / 系统 / BlackHole统一 48 kHz
平台侧 AEC直播伴侣回声消除开关打开

9. 排查决策树与清单

9.1 三步定位

  1. 戴耳机后是否还有回音?
    • 消失 → 是声学回音,保持耳机即可。
    • 仍有 → 进入第 2 步。
  2. 关掉所有监听、移除虚拟声卡回环后是否还有?
    • 消失 → 是电气回环,按方案 A/B 重排路由。
    • 仍有 → 进入第 3 步。
  3. 换内置麦 + 关系统声采集是否还有?
    • 消失 → 是外接麦 + AEC 参考失配,改用内置麦或硬件 AEC 设备。
    • 仍有 → 平台侧问题,联系平台/更换连麦方案。

9.2 上线前检查清单