语音 Agent 为什么听起来像机器人:延迟预算怎么分配

📅 2026/4/26 ✍️ 小文 📖 约 1 分钟

语音对话的「像不像人」,一半取决于音色,一半取决于节奏。本文给出一个完整语音 Agent 的延迟预算表:从 VAD 到首字节到播放,每一段该花多少毫秒,以及超预算时该砍哪一环。

语音 AI 的效果评测常常只看音色像不像人、识别准不准。但真正让人产生”这是机器”的感觉,往往不是声音,而是节奏:停顿太长、抢话、反应慢半拍。

人对语音对话的容忍阈值非常明确:响应延迟超过 700-800ms,就会开始察觉”对面在等”;超过 1.5 秒,会觉得卡;超过 2.5 秒,会认为断线并重复提问。 而人对”抢话”的容忍度更低——如果在对方话没说完时出声,体验会立刻崩掉。

所以语音 Agent 的核心工程问题是:在 800ms 的预算里,把每一毫秒放在正确的地方。

一份延迟预算表

一次完整的语音回合,时间花在七段:

环节典型耗时预算目标超支后果
麦克风采集与缓冲20-80ms≤ 50ms无感
VAD 断句判定100-600ms250ms反应迟钝/抢话
语音识别(ASR)100-800ms200ms明显等待
意图处理 / 工具调用50-2000ms≤ 300ms卡顿感强
LLM 首 token200-1200ms≤ 400ms最大变量
TTS 首字节100-600ms≤ 150ms出声延迟
网络与播放缓冲30-150ms≤ 80ms抖动

加起来,一个体验良好的系统首字出声在 700-900ms 之间。注意这里有明显的”跷跷板”:VAD 判太短会抢话,判太长会迟钝。

第一个变量:VAD 断句,别用固定静音时长

最朴素的做法是”静音超过 500ms 就认为说完了”。这在真实对话里表现很差,因为:

  • 用户思考时会停顿,600ms 的思考间隙会被当成说完了
  • 用户拉长音、咳嗽、环境噪音会被误判
  • 语速快的人 300ms 就该断,语速慢的人需要 700ms

有效做法是自适应断句:根据近几轮用户语速动态调整阈值,同时结合语义判断——如果已识别的文本在语法上明显未完成(“我想问一下关于那个……”),即使静音超过阈值也再多等 200ms。

一个实用技巧:断句前先做”预识别确认”。在静音 200ms 时跑一次轻量 ASR,如果识别出的文本以连词、介词结尾,就判定为未说完。这个判断成本低,但能消掉大量抢话。

第二个变量:流式处理,把串行改成并行

默认实现是串行的:等 ASR 完整结果 → 调 LLM → 等完整回复 → 调 TTS → 播放。这个链路的总延迟是各段之和,很难压到 800ms 以内。

改成流水线后,各段可以重叠:

  1. ASR 流式输出:识别出第一批稳定 token 就往下传,不等整句。
  2. LLM 流式输出 + 按句切分:不等整段回复完成,攒够一个完整的句子(或到标点且有 8 个以上字)就送给 TTS。
  3. TTS 流式合成 + 边合成边播放:首包到达就开始播,后续音频流式追加。

这样首字出声的时间 = ASR 部分结果 + LLM 首句 + TTS 首包,而不是四段之和。实测能把 1.8 秒压到 0.85 秒左右。

风险是断句不当导致语气错误:模型说”好的,我查一下”之后的停顿被切开,TTS 会用句末语调。缓解办法是让 LLM 输出带标记的文本(比如用标点强弱控制),或者对第一句单独处理得更完整一些。

第三个变量:工具调用,绝对不能等

语音场景里最破坏体验的是”中间静默”:Agent 说”我帮您查一下”,然后沉默三秒查数据库。

三条规则:

  1. 先说话,再调用。 永远先输出一句垫场话(“稍等我查一下”,约 0.4 秒),再发起工具调用。人不会在等待时保持沉默。
  2. 垫场话要真实。 与其说”马上为您处理”然后等 3 秒,不如说”这个我需要查一下订单,大概几秒钟”。预期一致比速度快更重要。
  3. 慢调用要拆。 如果一个查询必然超过 1.5 秒,把它拆成”快速返回部分结果 + 异步补充”。哪怕先说”您的订单是上周三下单的”,用户也不会觉得卡。

第四个变量:允许被打断(barge-in)

真人对话里,被打断是常态。语音 Agent 必须支持用户中途插话,否则会有强烈的”在对机器说话”的感觉。

实现要点:播放音频时持续监听,检测到人声立刻停止播放并把已播内容计为”已听到”;同时把打断点的上下文(用户听到了哪一句)一并交给 LLM,否则它会重复已经说过的内容。

一个反直觉的细节:不要立刻完全静音。用 100-200ms 的淡出更自然,硬切会让人以为设备故障。

怎么测

别只看平均延迟。要测三个数:

  • 首字出声的 P50 与 P95(P95 更重要,卡顿感来自尾部)
  • 抢话率:Agent 在用户未说完时出声的比例,目标 < 3%
  • 打断响应时间:用户插话到 Agent 停止出声的间隔,目标 < 250ms

用真实用户录音回放跑,而不是用合成的标准语音。合成语音没有犹豫、没有口音、没有背景噪音,会把所有问题藏起来。

语音 Agent 的”拟人感”不是音色问题,是时序问题。把预算表贴在墙上,每一毫秒都清楚花在哪里,它自然就不像机器人了。

📤 分享到