语音 Agent 为什么听起来像机器人:延迟预算怎么分配
语音对话的「像不像人」,一半取决于音色,一半取决于节奏。本文给出一个完整语音 Agent 的延迟预算表:从 VAD 到首字节到播放,每一段该花多少毫秒,以及超预算时该砍哪一环。
语音 AI 的效果评测常常只看音色像不像人、识别准不准。但真正让人产生”这是机器”的感觉,往往不是声音,而是节奏:停顿太长、抢话、反应慢半拍。
人对语音对话的容忍阈值非常明确:响应延迟超过 700-800ms,就会开始察觉”对面在等”;超过 1.5 秒,会觉得卡;超过 2.5 秒,会认为断线并重复提问。 而人对”抢话”的容忍度更低——如果在对方话没说完时出声,体验会立刻崩掉。
所以语音 Agent 的核心工程问题是:在 800ms 的预算里,把每一毫秒放在正确的地方。
一份延迟预算表
一次完整的语音回合,时间花在七段:
| 环节 | 典型耗时 | 预算目标 | 超支后果 |
|---|---|---|---|
| 麦克风采集与缓冲 | 20-80ms | ≤ 50ms | 无感 |
| VAD 断句判定 | 100-600ms | 250ms | 反应迟钝/抢话 |
| 语音识别(ASR) | 100-800ms | 200ms | 明显等待 |
| 意图处理 / 工具调用 | 50-2000ms | ≤ 300ms | 卡顿感强 |
| LLM 首 token | 200-1200ms | ≤ 400ms | 最大变量 |
| TTS 首字节 | 100-600ms | ≤ 150ms | 出声延迟 |
| 网络与播放缓冲 | 30-150ms | ≤ 80ms | 抖动 |
加起来,一个体验良好的系统首字出声在 700-900ms 之间。注意这里有明显的”跷跷板”:VAD 判太短会抢话,判太长会迟钝。
第一个变量:VAD 断句,别用固定静音时长
最朴素的做法是”静音超过 500ms 就认为说完了”。这在真实对话里表现很差,因为:
- 用户思考时会停顿,600ms 的思考间隙会被当成说完了
- 用户拉长音、咳嗽、环境噪音会被误判
- 语速快的人 300ms 就该断,语速慢的人需要 700ms
有效做法是自适应断句:根据近几轮用户语速动态调整阈值,同时结合语义判断——如果已识别的文本在语法上明显未完成(“我想问一下关于那个……”),即使静音超过阈值也再多等 200ms。
一个实用技巧:断句前先做”预识别确认”。在静音 200ms 时跑一次轻量 ASR,如果识别出的文本以连词、介词结尾,就判定为未说完。这个判断成本低,但能消掉大量抢话。
第二个变量:流式处理,把串行改成并行
默认实现是串行的:等 ASR 完整结果 → 调 LLM → 等完整回复 → 调 TTS → 播放。这个链路的总延迟是各段之和,很难压到 800ms 以内。
改成流水线后,各段可以重叠:
- ASR 流式输出:识别出第一批稳定 token 就往下传,不等整句。
- LLM 流式输出 + 按句切分:不等整段回复完成,攒够一个完整的句子(或到标点且有 8 个以上字)就送给 TTS。
- TTS 流式合成 + 边合成边播放:首包到达就开始播,后续音频流式追加。
这样首字出声的时间 = ASR 部分结果 + LLM 首句 + TTS 首包,而不是四段之和。实测能把 1.8 秒压到 0.85 秒左右。
风险是断句不当导致语气错误:模型说”好的,我查一下”之后的停顿被切开,TTS 会用句末语调。缓解办法是让 LLM 输出带标记的文本(比如用标点强弱控制),或者对第一句单独处理得更完整一些。
第三个变量:工具调用,绝对不能等
语音场景里最破坏体验的是”中间静默”:Agent 说”我帮您查一下”,然后沉默三秒查数据库。
三条规则:
- 先说话,再调用。 永远先输出一句垫场话(“稍等我查一下”,约 0.4 秒),再发起工具调用。人不会在等待时保持沉默。
- 垫场话要真实。 与其说”马上为您处理”然后等 3 秒,不如说”这个我需要查一下订单,大概几秒钟”。预期一致比速度快更重要。
- 慢调用要拆。 如果一个查询必然超过 1.5 秒,把它拆成”快速返回部分结果 + 异步补充”。哪怕先说”您的订单是上周三下单的”,用户也不会觉得卡。
第四个变量:允许被打断(barge-in)
真人对话里,被打断是常态。语音 Agent 必须支持用户中途插话,否则会有强烈的”在对机器说话”的感觉。
实现要点:播放音频时持续监听,检测到人声立刻停止播放并把已播内容计为”已听到”;同时把打断点的上下文(用户听到了哪一句)一并交给 LLM,否则它会重复已经说过的内容。
一个反直觉的细节:不要立刻完全静音。用 100-200ms 的淡出更自然,硬切会让人以为设备故障。
怎么测
别只看平均延迟。要测三个数:
- 首字出声的 P50 与 P95(P95 更重要,卡顿感来自尾部)
- 抢话率:Agent 在用户未说完时出声的比例,目标 < 3%
- 打断响应时间:用户插话到 Agent 停止出声的间隔,目标 < 250ms
用真实用户录音回放跑,而不是用合成的标准语音。合成语音没有犹豫、没有口音、没有背景噪音,会把所有问题藏起来。
语音 Agent 的”拟人感”不是音色问题,是时序问题。把预算表贴在墙上,每一毫秒都清楚花在哪里,它自然就不像机器人了。