← 调研中心 生产验证专题 · 04 / 08

Render reference · Double-talk · Playback truth

全双工打断、AEC
与回声自触发

传输层允许双向同时发包,还不等于用户能自然插话。本专题把播放参考、残余回声、真人双讲、打断确认和扬声器实际停声拆开,先审计本地链路,再用无需密钥的确定性故障注入验证策略取舍。

2026-08-3116 SCENARIOS32 RUNS22 TESTSNO VENDOR KEY
证据边界

本地代码审计与合成信号实验已经完成。没有真实电话、真人双讲、终端扬声器/麦克风或 WebRTC AEC dump;本文不形成设备、AEC 产品、VAD 模型或厂商排名。

01 · Decision

可用的全双工,是一条跨层闭环

系统既要阻止机器人自己的声音触发 VAD,也要在双讲时保住用户插话;触发之后还要停止真实播放、拒绝旧 generation,并让状态可以恢复和审计。

6 / 6Naive 在纯回声场景全部误打断
0 / 6Guarded 在同一纯回声集合无误打断
5 / 7Guarded 对要求打断场景的有效检出
40ms清晰双讲下用户起点到模拟停声
最重要的反例:Guarded 会漏掉低声插话,也会在播放参考缺失时 fail-closed 而漏掉真人双讲。0 次误打断并不代表策略已经可上线;precision 和 recall 必须同时报告。

02 · Evidence boundary

哪些已证实,哪些仍然未知

本地代码已确认

Go/Java 网关使用 generation 清理旧 TTS;Go 测试本轮通过。现有 Go、Java、media-core 路径均未发现 AEC、render reference、残余回声或 double-talk 判定。

合成实验已确认

参考感知门控能在固定声学路径里抑制回声自触发,并以 20ms 检测代价换取更好的有效插话识别;晚 ACK 和 ACK 缺失需要本地先静音。

真实环境仍未知

手机、免提、蓝牙、PSTN、房间混响、真人低声、电视人声、真实 ASR 和声卡缓冲均未测试;ERLE、MOS 与实际停声分位数不能从本实验推断。

03 · Measurement contract

取消事件不等于扬声器已经停声

现有 Duplex Trace 的 120ms 来自固定脚本。生产测量必须把声学起点、检测、控制、播放和确认放到同一 turn 与 generation 中。

T0 · 用户起声声学真值或外部刺激时间
T1 · AEC 后 VAD不能用麦克风原始能量代替
T2 · 有效打断排除回声、噪声与短附和
T3 · 本地停播播放器静音或清队列
T4 · 实际停声loopback / 测量麦克风确认
T5 · 远端 ACK状态确认,不决定用户听感
T6 · 拒绝旧结果旧音频、文本与模型输出

现有演示:speech_start 13460ms → barge_in 13560ms → tts_cancel 13580ms。这三个值是 simulate_call.py 的剧本,不是真实电话采样。

04 · Local audit

当前链路解决了“打断后”,还没解决“为何打断”

资产已具备缺口证据判断
Speech Gateway · Go上下行独立循环;AdvanceGeneration 清旧队列、拒绝旧帧无播放参考、AEC、ERLE、double-talk测试本轮通过
Speech Gateway · Javageneration 推进、provider/Agent 通知入站 PCM 原样送 ASR/EOU;无 AEC历史 8 / 8
media-coreRTP、G.711、jitter、VAD 插件接口echo cancellation 仅为 MGCP 参数枚举,没有实现代码可见
duplex-tracespeech_start / barge_in / cancel 事件轨道演示硬编码;首事件配对;无声学停声与 correlation ID不是实测
smart-turn / Soniox孤立语音 VAD/EOU 或 endpointing 管线无同时 TTS、回声、双讲;Soniox 还需要密钥本轮跳过

05 · Deterministic lab

固定 8kHz、20ms 帧的故障注入

所有信号、噪声和场景参数都确定;实验可逐字节重跑。它验证控制策略,不模拟真实音素、说话人或房间。

Naive energy gate

  • 不使用 AEC,直接看麦克风 RMS
  • 一帧过阈值即触发 barge-in
  • 等待远端 ACK 后才停止播放
  • 不区分回声、真人、噪声和短附和
1 / 16业务不变量通过
11全矩阵误打断总数

Reference-aware guarded

  • 配置路径的两抽头线性抵消
  • 参考相干度 veto + 残余 RMS
  • 连续两帧才确认打断
  • 本地立即静音,远端 ACK 单独确认
14 / 16业务不变量通过
2明确保留的漏检
Guarded 只是确定性策略模型,不是 WebRTC AEC3、NLMS、自适应滤波器或神经 AEC。参考错位 40ms 时 ERLE 为 −4.4419dB,策略仍能靠相干度避免误触发;这不能替代修复参考或 AEC。
Echo-only × 6正常、长延迟、高增益多路径、路径估计偏差、参考错位、参考缺失。FALSE BARGE
Double-talk × 3清晰真人、低声真人、参考缺失时真人插话。RECALL / LATENCY
Transient × 2单帧宽带噪声与 20ms 短附和。PRECISION
Stop truth × 2远端 ACK 延迟 120ms 与 ACK 永久缺失。PLAYBACK TRUTH
EOU / idle × 2有效打断后的尾静音;TTS 结束后普通用户发言。TURN STATE
No echo × 1去掉声学回声,单独观察停止确认期间的泄漏。CONTROL

06 · Results

速度只有和正确性一起看才有意义

策略总览

纯回声场景误打断Naive 6 / 6Guarded 0 / 6
需要打断场景有效检出Naive 4 / 7Guarded 5 / 7
有效触发平均延迟Naive 0msGuarded 20ms
停止请求后的播放泄漏Naive 1520msGuarded 0ms
Harness expectation match16 / 1616 / 16

停止 ACK 的反例

900ms ACK 永久缺失时,Naive 从用户起声到原 TTS 自然结束

Guarded 在同一场景 40ms 后模拟停声,同时把状态保留为 pending_confirmation。本地静音解决用户听感,远端 ACK 解决状态确认,两者不能合并成一个事件。

代表场景NaiveGuarded解释
正常 echo-only40ms 被自身回声误触发不打断;ERLE 40.8387dB直接能量门无法区分来源
参考错位 40ms误打断无误打断;ERLE −4.4419dB控制通过不等于 AEC 质量好
清晰 double-talk真人前已被回声误触发20ms 确认;40ms 模拟停声必须用声学真值判断有效触发
低声 double-talk真人前误触发漏检固定残余阈值的 recall 边界
参考缺失 + double-talk真人前误触发fail-closed 漏检参考健康度必须可观测
ACK 延迟 120ms120ms 模拟停声40ms 模拟停声本地先静音隔离远端延迟
ACK 永久缺失900ms40ms + pending听感和确认状态分开

07 · Metric semantics

ERLE 只在远端单讲段计算

Echo-only

报告 ERL、ERLE、残余回声、收敛和回声自触发。双讲段不混入 ERLE。

AEC

Double-talk

报告近端语音衰减、CER/WER、失真、插话 precision/recall 与首字损失。

USER SPEECH

Control

报告声学起点→打断、打断→停播请求、用户起点→实际停声、ACK。

LATENCY

State

报告旧音频泄漏、未播放内容截断、迟到结果拒绝和假打断恢复。

CONSISTENCY
ERLE = 10 × log10(echo_energy / residual_energy) 只使用真值为“没有近端用户且存在回声”的样本。 双讲 residual 含真实用户语音,不能直接解释为残余回声。

08 · Architecture actions

本地链路需要补的最小闭环

01 · MEDIA

拿到同源参考

render reference 与实际播放共享采样时钟,保存 pre/post AEC 和设备 route。

02 · DETECT

分开声学事件

activity、near speech、confirmed barge-in 不再用同一布尔量。

03 · STOP

本地先停声

播放器立即静音;远端 cancel 与 ACK 继续异步完成。

04 · CORRELATE

绑定 ID 与时钟

turn_id + generation_id + playback_id 配对多次打断和迟到结果。

Duplex Trace 改造重点:增加 correlation ID、render reference 健康度、AEC 前后级别、double-talk 标注、playback stop 时间与 false interruption;不能继续取整场会话的第一条事件做配对。

09 · Real-world gate

升级成“真实全双工结论”还差什么

工况组合必须采集指标
远端单讲音量、房间、route、回声路径变化render、pre/post AEC、实际出声ERL/ERLE、残余、收敛、自触发
近端单讲口音、低声、距离、噪声干净刺激、post-AEC、ASR语音保持、CER/WER、VAD 延迟
双讲100/300/800/1500ms 插话、纠正、附和双通道真值、事件、实际停声precision/recall、p50/p95/p99、首字损失
路径变化移动、遮挡、免提/听筒/USB/蓝牙切换route、参考健康度、设备时钟重收敛时间与最差分位
故障参考丢帧、漂移、CPU、抖动、双重 AECbuffer、乱序、旧 generation降级、恢复、旧结果拒绝

本轮已完成

  • 无密钥确定性基准
  • 本地网关代码审计
  • 指标口径与反例
  • 可复算 raw/summary

下一阶段需授权

  • 麦克风与 loopback 录制
  • 真实免提 DUT
  • 真人双讲语料同意
  • SIP/PSTN 与播放器日志

本轮没有声称

  • 真实设备 ERLE
  • 真人误/漏打断率
  • 真实电话停声时延
  • AEC/VAD 厂商排名
Reproduce: cd ./duplex-aec-bench PYTHONPYCACHEPREFIX=/private/tmp/duplex-aec-pycache python3 -m duplex_aec_bench run --output-dir results PYTHONPYCACHEPREFIX=/private/tmp/duplex-aec-pycache python3 -m unittest discover -s tests -v records_sha256 = e4c53483ed752d3074678aedffd12f0619c78809d893c8c7673229df99a6708d

10 · Sources

标准、官方资料与本地证据

W3C WebRTC Statistics

ERL · ERLE · 字段语义及实现差异边界。

ITU-T P.831 / P.832

P.831 · P.832 · 回声消除器与免提终端主观评价。

3GPP TS 26.131 / 26.132

26.131 · 26.132 · 电话终端声学要求与测试。

AECMOS

论文 · echo impairment 的主观质量代理及适用限制。

Pipecat Frames / Smart Turn

Frames · Smart Turn · 中断系统事件与 EOU 的边界。

Speech Gateway · Go / Java

本地 session、pipeline、generation 与相关测试;核对日期 2026-08-31。

media-core

本地 MGCP Local Connection Option、VAD 接口与媒体路径代码审计;未发现 AEC 实现。

Duplex Trace

本地 README、simulate_call.py 与 app.js;确认当前延迟为脚本演示且首事件配对。

Duplex AEC Bench

本轮 16 场景、32 次运行、22 项测试、raw/summary 复算与确定性哈希。