全双工语音 Agent 如何评测:从首音延迟到事件级验收

全双工语音 Agent 如何评测:从首音延迟到事件级验收

元信息

  • 文章类型:Voice Agent 评测方法与验收合同
  • 目标读者:正在开发实时语音、客服、车载、机器人或工具型 Voice Agent 的工程团队
  • 读者问题:除了首音延迟,怎样判断系统真的会倾听、会打断、能恢复并正确完成任务?
  • 核心结论:评测最小单位应从一次请求的平均耗时,升级为"场景 + 事件时间线 + 期望动作 + 业务结果 + 证据包";速度、话权、任务和副作用必须分别计量。
  • 可带走产物:场景集、事件账本、指标定义、证据梯度、验收矩阵和单次报告模板

开头:300ms 开口,可能只是更快地犯错

图 1:把"快"拆成事件,把"好用"拆成行为、任务与副作用。

语音 Agent 很容易把首音延迟当作总成绩。模型在 300ms 内开口,图表很好看,演示也显得流畅。但如果用户只是在句中停顿,它就抢话;用户说"嗯"表示继续听,它却把当前回答取消;用户已经改口,它仍执行旧工具;后台任务结束后,它把过期结果插进新话题------那么更快的首音只是让错误更早发生。

反过来,一个首音稍慢、却能稳定识别停顿、附和、有效打断和旁人语音的系统,往往更接近真实可用。对机器人、客服和车载场景尤其如此:错误不只表现为一句话不自然,还可能变成重复下单、取消失败、设备继续动作或旧结果污染当前会话。

因此,全双工评测不能问一个问题:"平均延迟是多少?"它至少要分别回答四个问题:

  1. 系统多久开始响应、多久真正停止播放?
  2. 它在重叠语音出现时选择了正确动作吗?
  3. 工具、后台任务和物理动作最终完成了吗?
  4. 一次失败能否根据音频、事件与业务状态被重放和归因?

本文给出的不是某个模型的排行榜,也不是 GPT-Live 私有评测方法。OpenAI 公共文档可以证明 Realtime 会话、VAD、WebRTC、响应和工具路径存在,S1-S5 Full-Duplex-Bench 与 τ-Voice 可以提供公开任务设计参考,S6-S10 但场景、阈值、业务真值和发布门禁必须由应用团队建立。

一、把评测单位从"请求"改成"场景时间线"

图 2:公开基准把重叠语音拆成四类;它证明场景必须分类,不替代业务阈值。

图 3:场景、时间线、预期动作、业务真值和证据包共同组成最小评测单位。

传统请求评测通常只有输入、输出和耗时。连续语音中的一次交互却可能同时包含用户语音、系统播放、重叠片段、工具调用、后台任务和网络切换。若只保留最终文本,就无法知道系统为何打断、旧音频是否真的停止、工具结果是否已经过期。

更完整的样本应包含五部分:

yaml 复制代码
case_id: overlap-interrupt-0042
scenario:
  foreground_user: "停一下,改成明天"
  overlap_at_ms: 1850
  background_audio: none
  network_route: turn
expected:
  turn_action: interrupt
  old_playback: stopped
  old_task: cancel_or_stale
  new_intent: update_date
observed:
  trace_id: trace-0042
  utterance_id: utt-0042
  response_id: resp-17
  playback_id: pb-17
  task_id: task-9
business_truth:
  final_date: 2026-08-10
  duplicate_side_effects: 0
evidence:
  - input.wav
  - mixed_output.wav
  - events.jsonl
  - tool-audit.json
  - final-state.json

这里最重要的变化,是把"期望输出文本"改成"期望动作与最终状态"。同一句"嗯",在不同上下文里可能是附和、犹豫、确认或否定前缀;同样检测到语音重叠,期望动作可能是继续听、简短附和、暂停输出、完全打断或忽略背景声。

所以评测标签不能只有 speech_detected=true,至少需要:

  • 输入角色:当前用户、旁人、媒体背景、回声或未知;
  • 交互意图:开始发言、附和、纠错、打断、继续、取消或无关;
  • 期望话权动作:listen / continue / backchannel / pause / interrupt / ignore
  • 任务动作:保持、修改、取消、补偿或拒绝;
  • 历史动作:保留、截断、澄清或标记不确定。

一个样本可以是多标签的。例如用户在系统播报时说"嗯,明天不行,换后天",前半段可能是附和,后半段却构成修正。强迫整段音频只对应一个标签,会把真实困难藏进标注噪声。

二、场景集必须覆盖八类冲突,而不是只测安静房间

图 4:先覆盖话权、任务、网络和副作用冲突,再谈平均延迟。

公开 Full-Duplex-Bench v1.5 把重叠场景拆成 interruption、user backchannel、talking to others 和 ambient/background speech。S7 这给出一个关键提醒:重叠语音不是单一故障。内部场景集还需要连接任务与系统状态。

1. 正常轮替与不同长度停顿

录制句中 300ms、600ms、1200ms 停顿,以及思考词、拉长音和自我修正。检查系统是否把停顿误判为轮次结束,也检查为了避免抢话而过度沉默。

2. 有效打断

在系统播放 0.5 秒、2 秒和 5 秒时插入"停一下""不是这个""先别执行"。分别检查模型停止生成、网络停止传输、播放器清空旧队列、历史按实际播放修复,以及旧工具或动作是否失效。

3. 附和与继续倾听

"嗯""对""然后呢"可能只表示继续。系统可以简短反馈,也可以保持沉默,但不应每次都取消主回答或创建新的业务任务。

4. 旁人语音与环境声

加入电视人声、旁人聊天、咳嗽、键盘、音乐和 AEC 残余回声。测的不是"有没有声音",而是系统是否把非目标输入升级成话权或工具动作。

5. 纠错、改口与实体跟踪

用户先说错日期、联系人或地点,再在同一段或下一段修正。检查最终意图、参数版本和播报是否一致,旧参数是否仍可能触发副作用。

6. 多步工具与后台任务

在查询、下单、日程、导航或机器人动作过程中插入补充、取消和新话题。检查任务是否继续、取消或转为过期,完成结果是否仍有资格交付当前会话。

7. 网络与媒体故障

覆盖直连、TURN、抖动、丢包、短断线、重连和客户端播放队列积压。延迟必须按路线分别统计,不能把直连和中继混成一个平均数。

8. 恢复与降级

让 STT、模型、工具、TTS 或设备回执单点失败。检查系统是明确澄清、切到按键/回合式流程,还是悄悄继续并制造错误状态。

场景数量不应靠排列组合无限膨胀。更合理的做法是先按风险与真实流量建立基础集,再对高失败率和高副作用路径增加参数化样本。

三、延迟指标必须绑定事件对,而不是只有一个计时器

图 5:没有明确起点与终点的"首音延迟"不可比较。

图 6:官方文档证明开始/停止说话事件存在;评测体系仍由应用团队建立。

"首音延迟"至少有多个起点:用户真正停止发声、客户端 VAD 停止、服务端收到音频、ASR 稳定、模型开始生成、TTS 产生首块、网关收到首块、播放器开始播放。不同团队若使用不同起点,两个 300ms 根本不可比较。

建议把每个指标写成事件对:

指标 起点 终点 回答的问题
输入结束检测延迟 声学标注结束 speech_stopped 系统多久认为用户说完
响应首音延迟 期望可响应时点 客户端 playback_started 用户何时真正开始听见软件播放
打断停止延迟 有效打断声学起点 playback_stopped 旧声音多久真正停下
新响应恢复延迟 打断意图稳定 playback_started 系统多久开始回应新意图
工具完成播报延迟 业务结果可用 结果播报开始 后台结果交付是否及时
重连恢复延迟 连接失效 新会话可交互 故障后多久恢复

这里的 playback_started/stopped 通常仍是播放器软件代理,不是麦克风回采证明。声学测试需要另外保存混合输出或回采音频。服务端 chunk_sent 不能代替播放停止,客户端 received 也不能代替用户听到。

统计时至少报告 P50、P95、P99、样本数与失败样本,不应只报平均值。还要按设备、网络路线、场景、语言和模型版本分组。一个整体 P95 可能掩盖 TURN 路径或某类手机设备的长尾。

四、行为指标的核心是"该不该打断",不是"打断成功率"

图 7:速度、行为、任务和副作用必须独立计量,不能互相抵消。

如果系统对所有重叠语音都停止播放,它的"停止成功率"可能很高,但附和、旁人语音和环境声全部处理错误。因此行为层需要混淆矩阵。

设期望动作与观察动作都来自:

text 复制代码
listen / continue / backchannel / pause / interrupt / ignore

每个类别分别统计 precision、recall 和关键混淆。产品还应关注:

  • 错误抢话率:用户仍在完成同一意图,系统却开始输出;
  • 漏打断率:明确有效打断未停止旧播放或旧任务;
  • 错误打断率:附和、旁人语音或背景声导致旧响应取消;
  • 错误静默率:用户已结束且需要回应,系统长时间无动作;
  • 恢复正确率:暂停或澄清后是否回到正确上下文;
  • 历史一致率:模型后续记忆是否只包含用户实际获得的语义;
  • 旁人误响应率与环境声误激活率。

分母必须公开。例如"错误打断率"可以定义为:在期望不是 interrupt 的重叠样本中,观察为 interrupt 的比例。若用所有样本做分母,数据会被大量安静样本稀释。

对持续运行设备,还可报告每小时 false interruption、每小时误工具调用和每小时无法恢复会话。时间归一化指标更适合比较不同测试时长,但仍要附样本构成。

五、任务层必须以业务状态和副作用为真值

图 8:公开研究把可核验任务完成、全双工交互和真实音频条件放在同一评测问题中。

语音回答听起来合理,不代表任务完成。工具返回 200,也不代表用户目标达成。τ-Voice 将真实领域任务、数据库和现实音频条件放在一起评测,说明语音交互质量与 grounded task completion 必须同时检查。S9-S10

任务层至少包括:

  • 目标完成率:最终业务状态是否满足用户目标;
  • 参数一致率:日期、联系人、金额、位置等是否使用最新版本;
  • 工具选择和参数正确率;
  • 重复副作用数:同一意图是否产生重复下单、消息或设备动作;
  • 取消成功率:取消是否在可取消阶段真正生效;
  • 补偿正确率:不可逆副作用发生后是否进入明确补偿,而非伪造回滚;
  • 过期结果拦截率:旧 task_version 的结果是否被阻止进入当前会话;
  • 交付正确率:有效后台结果是否在合适时机、对正确用户和正确会话交付;
  • 恢复后任务一致率:断线或重启后是否重复执行或丢失状态。

"工具调用成功"只能作为中间证据。真正的业务真值可能来自订单库、日程、设备控制器、传感器或人工确认。高风险机器人动作还要区分 acknowledgedcompleted:收到命令并不等于物理完成。

六、每次测试都应生成可重放的事件账本

一句"听起来有点怪"无法支持根因定位。最小事件账本可包含:

json 复制代码
{
  "event_id": "evt-1048",
  "trace_id": "trace-0042",
  "session_id": "sess-7",
  "utterance_id": "utt-12",
  "response_id": "resp-17",
  "playback_id": "pb-17",
  "task_id": "task-9",
  "event_type": "playback.interrupted",
  "producer": "rust-client",
  "monotonic_ns": 938472993822,
  "wall_time": "2026-08-09T10:42:31.421+08:00",
  "reason": "user_interrupt",
  "played_until_ms": 1840,
  "route": "turn",
  "schema_version": 1
}

完整证据包通常还应保存:

  • 原始或经过合规处理的输入音频;
  • 系统输出和必要的声学回采;
  • ASR partial/final 与稳定前缀;
  • VAD/turn action 决策及置信和理由;
  • 模型 response 与 TTS chunk 时间线;
  • 播放开始、进度、完成和中断回报;
  • 工具请求、权限、幂等键、结果与最终业务状态;
  • 网络路线、丢包、抖动和重连信息;
  • 模型、提示词、代码、配置与数据集版本。

不同设备的单调时钟不能直接比较。跨端分析要记录时钟偏移估计或使用事件因果关系,避免把墙上时钟误差解释成网络延迟。

七、错误归因要沿链路定位,而不是默认怪模型

同一个"打断慢"至少有四层原因:

  1. 感知层晚发现:AEC、噪声或 VAD 没有及时识别有效输入;
  2. 决策层判断慢:系统等待更多语义才决定 interrupt;
  3. 控制层取消传播慢:response、TTS、网关或队列没有及时停止;
  4. 播放层仍有旧音频:客户端缓冲或设备输出没有清空。

同样,"工具结果错"也可能来自 ASR 实体、模型参数、版本竞态、工具幂等、数据库状态或交付时机。只有音频、事件和业务状态共存,才能把失败放到正确责任层。

建议每个失败自动生成因果切片:从异常业务结果向前追到 task、response、utterance 和原始音频,列出最后一个通过的门与第一个失败的门。无法定位的样本也要计数;"unknown root cause"长期过高本身就是可观测性失败。

八、证据要分四级,自动测试不能冒充真实 E2E

图 9:从静态合同到生产影子逐级升级,自动化通过不能直接冒充真实 E2E。

L1:静态合同

Schema、枚举、状态机、配置和代码路径存在。它证明设计已写入系统,不证明运行时行为。

L2:确定性自动测试

用合成事件或固定音频验证取消传播、身份隔离、幂等和报告生成。它适合快速回归,但不能证明真实声学环境。

L3:软件集成与声学回路

真实进程、真实网络路径、真实播放器,并通过扬声器---麦克风回路或录制混音验证打断和回声。它仍可能缺少真实设备、业务系统或用户分布。

L4:真实设备与生产影子

真实机器人/手机/车机、真实 TURN、真实工具环境和受控影子流量,具备隐私、回滚与人工复核。只有到这一层,才可以讨论上线验收。

当前 dify_stream_test 代码已经有逐轮 trace_idutterance_idplayback_id、播放完成/中断回报、首音到播放开始的字段、TURN 路径识别,以及若干中断和旧播放隔离测试。这可以标为 IMPLEMENTED 与局部 VERIFIED。本轮没有运行真实服务器、真实 TURN、声学回路或机器人动作,因此不能写成端到端通过,相关结论仍为 UNKNOWN

九、验收矩阵要同时设质量门和证据门

下面是一个示例模板,数值仅用于展示结构,不是 OpenAI 官方建议,也不是本项目实测:

能力 示例指标 示例门槛 最低证据 失败动作
正常响应 response first audio P95 < 900ms L3 检查分段长尾
有效打断 old playback stop P95 < 350ms L3 阻止连续模式上线
附和 错误取消率 < 2% L3 回退到保守策略
背景语音 每小时误响应 < 0.2 L3 强化目标说话人门
工具任务 grounded completion > 90% L3/L4 禁止自动副作用
取消 重复副作用 0 L4 保留人工确认
后台结果 过期结果错误交付 0 L3/L4 关闭主动插播
网络恢复 恢复成功率 > 99% L4 保留回合式降级

门槛应来自产品风险、当前基线和用户研究。陪伴场景可以更重自然度,车载控制应更重错误动作与确认,客服要兼顾任务完成和合规。没有通用阈值能同时适配这些场景。

发布门还应满足:关键失败为 0;目标路线样本足够;P95/P99 不被少量样本伪造;高风险副作用通过真实环境;所有失败可回放;版本与配置可复现。

十、一次评测报告必须能回答"变好在哪里,代价是什么"

建议报告包含:

  1. 变更对象:模型、提示词、VAD、控制器、播放器、网络或工具;
  2. 数据集版本与场景分布;
  3. 与上一基线的配对比较;
  4. 延迟、行为、任务、副作用和主观体验五组结果;
  5. P50/P95/P99、分母、置信区间或重复实验;
  6. 直连/TURN、设备和语言分层;
  7. 关键失败样本及可重放证据;
  8. 回归、收益与成本;
  9. IMPLEMENTED / VERIFIED / UNKNOWN 证据边界;
  10. 上线、继续影子、回退或补数据的唯一建议。

如果新策略让首音快 150ms,却令附和误打断增加、任务完成下降,报告不能只展示最漂亮的折线。评测的目标不是证明新模型更强,而是判断整个系统是否更适合当前产品。

十一、主观自然度有价值,但不能替代事件真值

自然度、节奏、被倾听感、打断舒适度和恢复质量需要人类评价。可以采用成对盲测,让评审在同一场景中比较两个版本;也可以在真实任务后收集"是否需要重复""是否感到被抢话""是否信任任务结果"。

但主观分数不能解释副作用,也不能确认后台结果是否过期。评审可能觉得回答自然,却不知道系统重复创建了订单。因此主观层必须与事件和业务层并列,不能覆盖它们。

隐私同样是硬边界。真实语音、旁人对话和业务状态可能包含敏感信息,应限定采集目的、保留周期、访问范围和脱敏方式。无法安全保存原音频时,至少保留合规派生特征与事件账本,并明确证据缺口。

十二、什么时候不该追求全双工

全双工不是所有产品的默认答案。高风险命令、嘈杂工业环境、网络极不稳定、缺少设备回执,或团队无法建立事件账本时,按键、明确确认和回合式交互可能更可靠。

一个简单替代方案是:保留 WebRTC 低延迟媒体,但业务动作仍要求明确轮次与二次确认;允许用户随时停止播放,却不允许未经确认的语音片段直接改变不可逆任务。只有当行为、任务和证据门都通过,再逐步开放连续交互能力。

这不是保守,而是让交互复杂度与证明能力匹配。

结语:真正的验收对象是系统行为,不是模型演示

全双工语音 Agent 的质量不能被一个平均首音概括。真正的评测对象是:在特定场景里,系统是否选择了正确话权动作,旧输出是否真正停止,任务是否使用最新意图,副作用是否可控,失败是否可重放。

因此最小评测合同应固定五件事:场景、事件时间线、期望动作、业务真值和证据包。延迟回答"多快",行为回答"该不该",任务回答"做没做对",证据回答"能不能证明"。四者同时成立,才有资格说系统更自然、更可靠。

参考资料

事实、设计与未知项

  • 已确认事实:公开文档提供 Voice Agents、Realtime VAD/WebRTC/conversation/tools 接口;公开基准覆盖重叠语音和真实任务。
  • 作者设计:本文场景分类、事件账本、指标合同、证据梯度和验收矩阵。
  • 当前项目证据:代码与自动测试支持若干身份、播放回报、中断与网络路径能力,属于实现和局部验证。
  • 未知项:真实生产环境的阈值、声学回路、真实 TURN 长尾、真实机器人动作和用户主观结果,均需后续实测。
相关推荐
孙启超1 小时前
Token太贵自己写了一个mac版开源AI编程工具
人工智能·macos·开源·llm·agent·ai编程·ai应用开发
cxr8281 小时前
本体论转向:作为实验世界形式化模型的Ontology
人工智能·知识图谱
jarvisuni1 小时前
翻车了!GPT5.6接手Opus4.8的项目之后!
前端·人工智能·ai编程
AmyLin_20011 小时前
AI 如何做出数学发现【5】- AI 数学证明怎样做单元测试:从“看起来顺”到可否证工作流
人工智能·单元测试·openai·数学推理·符号计算·ai推理·反例生成
giszz1 小时前
【WorkBuddy专栏72】AI 有了自己的邮箱——WorkBuddy Agent Mail 从开通到自动化完全指南
人工智能·企业微信
@Mr_LiuYang1 小时前
《深入理解 AI Agent:设计原理与工程实践 》实验2-2 2-7 大模型注意力权重分布可视化
人工智能·大模型·agent·注意力机制
weixin_471383031 小时前
07 LangGraph 集成 RAG
python·langchain·agent·langgraph
Seven971 小时前
AI杂谈:别再问AI会不会替代你,先看你是不是驾驶员
人工智能·后端