如何基于 WebRTC 实现双工语音对话并处理回声消除?

解读

在大模型语音对话产品中,双工(全双工)语音意味着用户与模型可同时说、同时听,体验接近打电话。国内面试场景下,面试官真正想确认的是:

  1. 你是否理解 WebRTC 媒体管线在浏览器与云端推理服务之间的角色;
  2. 能否把声学回声消除(AEC)降噪(NS)增益控制(AGC)大模型流式推理串成一条可落地的链路;
  3. 是否知道国内网络、机型碎片化、合规录音存储带来的额外约束。
    回答时要体现“端到端 LLMOps 视角”,而不是只讲 WebRTC API。

知识点

  1. WebRTC 三角形 vs. 梯形架构:浏览器←→云端媒体网关←→大模型推理服务。
  2. 媒体协商:SDP 中必须强制打开回声消除开关(googEchoCancellation: true),并禁用自动增益(googAutoGainControl: false)避免模型侧音量抖动。
  3. 国内合规:WebRTC 网关必须旁路生成双声道录音,用于 7 日存储与质检,同时把单声道 16 kHz/16 bit 流送给 ASR。
  4. AEC 原理:利用参考信号(远端回环)近端麦克风信号做自适应滤波,延迟窗口需 ≤ 120 ms;在云端混音场景下,需把 TTS 回环作为参考信号注入浏览器,否则浏览器 AEC 失效。
  5. 流式 VAD:国内常用WeNet 轻量 VAD自研 8 kHz CNN 模型,在浏览器端每 20 ms 输出语音概率,减少上行带宽 40 %。
  6. 推理加速:大模型采用** chunked streaming attention**(chunk=240 ms, stride=120 ms),与 WebRTC 帧长对齐,降低首包延迟至 600 ms 以内。
  7. 回声消除兜底:若用户机型为华为鸿蒙 3 以下或小米 12 以前,浏览器 AEC 失效,需在云端二次 AEC:将 ASR 识别文本与 TTS 文本做对齐,若检测到“自说自听”关键词,则丢弃该句并提示用户降低音量。
  8. LLMOps 监控:实时收集回声残留能量(ERLE)识别字错率(WER)用户打断率(Interruption Rate),低于阈值自动回滚模型或提示前端重协商。

答案

“我会把链路拆成三段:浏览器、媒体网关、大模型推理。
第一步,浏览器侧用adapter.js统一 getUserMedia,SDP 约束里强制开启 echoCancellation、noiseSuppression,同时把采样率锁到 48 kHz,后续在网关下采样到 16 kHz 喂给 ASR,避免重采样失真。
第二步,自建云原生 WebRTC 网关(基于开源 Pion,部署在阿里云 ACK 北京 region),开启TWCCRED抗 200 ms 突发抖动;网关收到音频后,先走GPU TensorRT 版 WeNet VAD,语音概率>0.6 的帧才打包发给 ASR,节省 30 % 流量。
第三步,ASR 输出 partial 结果经BPE 对齐后送大模型,模型用8-bit 量化 + paged attention,首 token 延迟 350 ms;TTS 侧用流式 neural vocoder,每 80 ms 吐一次音频,通过网关回包到浏览器。
关键回声消除:浏览器 AEC 参考信号必须包含网关回环的 TTS 音频,否则远端回环缺失导致残留回声;若检测到机型黑名单,则在网关用RNNoise 二次 AEC,并把 ERLE<15 dB 的会话标记为“高回声”,触发自动降级:关闭双工,改为按键说话
最后,所有会话的双声道录音实时上传到 OSS 北京合规 bucket,文件名带userId + sessionId + 时间戳,7 日后自动转冷存,满足《个人信息保护法》要求。”

拓展思考

  1. 如果大模型需要情感控制,TTS 会动态调节基频,导致参考信号与麦克风信号失配,AEC 残留变大。可引入情感标签作为附加特征,在网关侧对参考信号做预加重补偿,提升 ERLE 3–4 dB。
  2. 国内小程序环境不支持 WebRTC,需降级到微信私有 VOIP 组件,此时回声消除算法由微信内核托管,无法注入参考信号。解决方案是:在云端把 ASR 结果与 TTS 结果做文本级回声检测,若重合度>0.8,则丢弃 ASR 并下发“请稍后”提示,实现软件双工
  3. 未来做多语种实时翻译时,TTS 侧会同时输出中文+英文两条音轨,参考信号需混音后再回环,否则英文回声会泄露到中文识别。可尝试分轨 AEC:对每条语言轨道单独做自适应滤波,再混音下发,实验显示 ERLE 可再提升 2 dB。