轮次结束检测

A50
概念 · 智能体 AI 详解

轮次结束检测。

语音智能体响应延迟里最大的那一项,通常不是模型——而是它用来判定「人类说完了没有」的那段时间;而一个固定的静音定时器,会把这段延迟加到每一个轮次上,无论来电者是不是真的说完了。轮次结束检测,就是那个放行智能体开口的判定。2026 年,它不再是一个你去调的阈值,而成了一个你去买的分类器——于是问题从「我们该等多久」,变成了「我们能接受多高的打断率」。

步骤 1它是对「说完了」的预测,不是对静音的测量。

语音栈里有三样东西经常被混为一谈,而把它们分开,就是这个术语的大半价值。

  • 语音活动检测(VAD)回答的是「这一帧里有没有语音?」它便宜、是声学的、持续运行。它对「一句话有没有说完」一无所知。
  • 端点检测是把 VAD 输出变成判定的策略层:典型形式是「语音停了,并且持续停了 N 毫秒,所以这个轮次结束了」。
  • 轮次结束检测是对这句话已经完整的预测——说话人已经说完他想说的,正在让出发言权。「完整」是内容与韵律的属性,不是能量水平的属性。

这个区分有一个经典例子。来电者说「我的账号是四、七」,然后停顿。VAD 正确地报告了静音。一个 500 ms 定时器的端点检测器正确地报告静音已持续 500 ms。两者都没错,而在这里插话的智能体错了——因为对任何听见了那些词的人来说,这句话显然还没说完。

语音智能体打断人,几乎从来不是 VAD 的 bug。VAD 通常把自己的活干完了。缺陷在于:一个没有「完整性」模型的系统,被要求从时长里推断完整性。

步骤 2没有哪条静音阈值能把两个分布分开。

定时器调不到正确,理由是统计上的,而非工程上的。轮次内部的停顿与轮次末尾的间隔,来自两个重叠严重的分布。你挑的任何一条阈值都会同时切过两者,于是每一档设置,都是用一种错误的减少去换另一种错误的增加。

# The timer's two errors, and why they trade
threshold too low    # fires inside a mid-turn pause  -> false cutoff
threshold too high   # waits out a finished utterance -> dead air, every turn

# And the second cost is unconditional:
added_latency = threshold          # paid on EVERY turn, not just the ambiguous ones
cutoff_rate   = P(pause > threshold | mid-turn)

这个重叠还会随说话人移动,而这正是「按部署逐一调参」这件事失败的地方。第二语言使用者、年长的来电者、照着屏幕念号码的人,以及任何边想边说的人,在停顿分布上都比一个说完一句话的流利母语者更靠右。一份厂商文章把普通话—英语双语者的平均停顿放在约 686 ms,而母语英语者约 546 ms——这个数字我们没能追到原始数据集,但方向上是大家熟悉的那个。一条在你自己团队身上调出来的阈值,是一条在你最快、最流利的那十分之一来电者身上调出来的阈值。

这对多语种智能体的后果比看上去更锋利:一条全局超时为你服务的每一个语言群体编码了不同的打断率,而你的仪表盘里没有任何东西会按那个维度把它拆开。

步骤 32026 年的形态:最大的那一项如今是一个模型。

市场给出的答案是:直接从信号里预测「说完了」,而不是从时长里推断。一个基于模型的轮次结束检测器吃进音频、部分转写文本,或两者,并吐出一个「说话人已让出发言权」的概率——在一句听上去已完整的话上,它可以早于静音定时器触发;而在一句听上去没完的话上,它可以穿过一段长停顿把发言权继续留着。

2026 年的架构动作,是把这件事收进识别模型本身。Deepgram 当年发布的 Flux,在一个模型里同时做转写与轮次检测,因此不需要单独的「VAD 加端点检测」环节;Deepgram 文档给出的轮次结束判定约为 260 ms,其多语种变体在十种语言上低于 400 ms。这些是厂商在自家链路上测出的厂商数字,照例要打折扣,但底下那个结构性主张更可核查、也更要紧:把两者融合消掉了一个串行跳,而串行跳正是延迟预算的构成材料。

有两点实践注记能熬过厂商的更替。基于模型的检测通常与声学 VAD 并行运行,而不是取代它——VAD 近乎免费,而且仍是知道「来电者开口了」的最快办法,这正是抢话所需要的。另外,检测器会暴露一条判定阈值,所以采用它并不消掉下面那个工作点的选择;它只是给了你一条更好的曲线去挑点。

步骤 4挑一个工作点,并且绝不只报告它的一面。

可接受的误打断率没有标准,所以这个数字由你来定、也由你来辩护。按用例去定:一个在收银行卡号或预订编号的智能体,应该穿过长停顿把发言权留住、并接受多出来的延迟,因为在那里打断一次的代价是整个取值要从头来过;而一个处理简短确认的智能体可以早触发,因为切错一次的代价只是一个词再说一遍。

团队跳过的是报告纪律那一半。一项靠调低阈值买来的延迟改进不是改进,是一次转移;而它会在几周后以「被挂断的通话」的形式出现,而没人会把它和那次改动连起来。

响应延迟与误打断率是同一次测量的两张脸。单独公布其中一个——在厂商对比里、在冲刺评审里,或在一份基准里——正是这笔交易被不知不觉做掉的标准方式。要么一起记录,要么等于什么都没记录。

最后,要知道这个事件消失时会发生什么。一个边说边听的全双工模型根本不发出轮次结束事件,而每一个默默订阅着它的下游消费者——工具派发、追踪 span、护栏检查点、转接逻辑——都会失去自己的触发器。那是架构的改变,而非延迟的改变,也是全双工语音所讨论的主题。

先从测量你手上已有的东西开始:记录每个轮次里「最后一次检测到语音」到「首段音频输出」的间隔,以及智能体开口的头几个词与来电者重叠的比率。如果第一个数字由一个常数主导,那你就是在每个轮次上付一个固定定时器,而换一个基于模型的检测器,是整条栈里回报最高的改动。正确性那一半见轮次切换与抢话;这些秒数要付多少钱,见一分钟语音的成本。