全双工语音。
一个能边听边说的语音智能体,不只是感觉更自然——它不再产出你系统其余部分赖以建立的那唯一一个事件。半双工智能体等待静音、判定人类说完了、然后动手;全双工模型从不作那个判定,于是你原本掌握的那个调节旋钮,变成了一种你只能诱导出来的行为。把全双工当作单位的更换,而不是速度的提升。
轮次是流水线的产物,不是言语的属性。
人类对话并不严格按轮次进行。人们不断重叠:附和(「嗯哼」「对」)盖在说话人之上却并不抢占话语权,听者会在一个短语说完之前就咬住它的尾巴,而一次更正恰恰在句中抵达——因为等下去才是失礼。语言学家测得轮次之间的间隔平均在 200 毫秒上下,远短于组织一个句子所需的时间,这意味着听者在说话人停下之前就已开始组织。
机器语音流水线做不到这些,原因很机械:它一次只处理一个方向。音频进来、宣告一个边界、生成一段回应、音频出去。半双工就是这个模式,它借自无线电——一方发射,另一方接收。语音智能体里的「轮次」就是那次切换发生的地方,它之所以存在,是因为架构需要一次切换,而不是因为对话本身有这么一下。
- 半双工。一次一个方向。需要一个判定——人类说完了吗?——这个判定机器必须显式作出,而人类根本从不作。
- 打断(barge-in)。那块补丁:检测到人类开口了,就停掉外放音频、丢弃其余部分。它给出重叠的表象,底下仍是半双工——这正是打断一个语音智能体常常感觉像是把它电话挂断的原因。
- 全双工。两个方向同时、连续承载,没有切换。既没有什么要检测,也没有什么要停下,因为这个智能体从来就不曾被「人类说完」这件事阻塞。
判断你是否仍是半双工的标志:代码里某处有一个以毫秒计的超时。端点检测就是挑那个数的艺术,而它之所以是艺术,是因为没有哪一个取值能同时做到灵敏与耐心。全双工不会给你一个更好的数——它把这个问题取消了。
全双工到底要求什么。
「同时听与说」说起来容易、建起来昂贵,因为有两件事会同时成立,而半双工系统从来不必去调和它们。
- 模型会听见自己。如果智能体的音频正在播放而麦克风是开着的,那么它自己的声音就在输入流里。声学回声消除不再是音质上的锦上添花,而成为一项正确性要求:没有它,模型会把自己那句话转写成用户的回答,然后去回答它。这正是为什么全双工在免提或点餐车道上,要比在耳机上难得多。
- 模型必须持续地决定要不要开口。在半双工循环里,「我现在该说话吗?」由端点检测器替模型回答了。在全双工循环里,这是模型在每一帧上都要作的决定,与「说什么」并行。这个决定在半双工的词汇表里没有名字,因为从来没有人去作它。
- 重叠必须有含义。一个盖过智能体说话的用户,可能是在打断、在赞同,也可能是在自言自语。一遇重叠就停下的模型,比半双工还糟;无视重叠的模型则是一台推土机。把这件事做好才是真正的产品,而它是学出来的,不是配出来的。
正因为这些又难又对延迟敏感,落地架构通常会把活儿拆开:一个小而快的全双工模型掌管音频以及「要不要开口」的决定,而它背后另有一个更慢的文本模型去做推理与工具调用。在你读任何基准之前,先理解这道拆分是值得的——因为一个公布的分数属于这一对:语音模型、后端模型,以及后端被要求想得多狠——而不属于其中任何一半。
一个你调过的阈值,变成一种你只能诱导的行为。
这就是那笔交易,而这个领域在更高的层上已经做过两次同样的交易。规则式对话变成了 LLM 对话;手写的工具选择变成了模型的工具选择。每一次,一个你能读、能比对、能回滚的东西,都变成了一个你只能去度量的东西。
一个端点检测阈值,是配置文件里的 800。你可以改它、复审这次改动、把它与某个指标关联起来,并在周五把它回滚掉。而一个全双工模型的打断策略,分布在它的权重之中。你可以在边缘上用提示词绕一绕,你可以换一个模型,而你的控制力仅止于此。
- 回退不再可归因。当来电者开始反映智能体总盖着他们说话,没有哪一行可以去怪。候选项是模型版本、提示词、音频通路与来电者人群——正因如此,钉住版本并留一组冻结场景在这里更重要,而不是更不重要。
- 逐轮评估不再成立。几乎每一套语音评测打的都是「在这个用户轮次下,这个智能体轮次对不对?」。没有轮次,就没有切分单位。打分要挪到区间与结果上:智能体有没有盖着来电者说话、来电者等了多久、任务完成了没有。参见评估语音智能体。
- 提前动手成为常态。没有了轮次结束这道闸,智能体可能在来电者还在修改请求时就提交了一次工具调用。只读查询没问题;任何会产生变更的动作都需要一个补偿动作,因为「不对,是周二」在订单已下之后才到,如今是常态而非边角情形。
这种失败模式是安静的。不会有任何异常抛出。一个工具对着半句话触发、一道护栏对着空缓冲求值、一条追踪把两件重叠的事记成了一件——而这三者在你的看板上,浮现出来的样子都是一次模型回退,而不是一个缺失的边界。
表的形状也变了。
半双工语音通常按音频 token 计量,为说了什么定价。全双工语音层则按经过的分钟数定价,为这条线开了多久定价——而这两者根本不是同一张账单。
静音是最清楚的例子。一位正在翻找账号的来电者不产生任何 token,而在按分钟计价之下,他花的钱和一位正说到一半的来电者一模一样。等待工具返回的停顿、一个慢的后端模型、以及一套本可一问却问了三问的对话设计,同样如此。延迟不再只是一个体验问题,而成为一条直接成本项,这会改变哪些优化值得做:把对话变短胜过把模型变快,如今比过去更常成立。
与此同时,后端模型仍按 token 计量,且与时长无关。你于是有了两块形状相反的表,被一个不出现在任何一张发票上的「推理力度」旋钮耦合在一起。唯一能把它们对上的数字,是每完成一次任务的成本,并拆解为分钟数与 token 数——这正是智能体成本控制所要求的那套纪律,被用在了一个"墙上时钟本身有价钱"的系统上。