MiraEcho
全部文章

端到端语音模型并没有杀死 ASR–LLM–TTS 级联

约 8 分钟
  • 架构
  • ASR
  • TTS
  • 智能体

这两年做语音智能体的标准姿势是三个盒子串起来:ASR 把语音转文本,LLM 决定说什么,TTS 再把文本变回语音。然后语音原生模型来了——音频进、音频出、一张网络——叙事随即变成「级联是老架构了」。demo 确实好看:模型会笑、会犹豫、会在句子中间换语气、允许你打断它。

但为「替换级联」给出的理由大多是延迟,而它们大多搞错了延迟在哪儿;与此同时,真正成立的那条理由很少被讲清楚,替换的代价则普遍被低估。这几件事值得拆开说。

延迟这笔账,大头其实在断句

反对级联的直觉是:三个模型串行,怎么可能比一个快。把 ASR、LLM、TTS 的耗时加一加,就得出一个数。

但去看一个做得像样的级联里时间实际花在哪,这个加法根本不是问题所在。流式 ASR 在音频到达后两三百毫秒内就能给出稳定转写;LLM 可以拿部分转写先跑,prefill 与用户还在说话的时间重叠;TTS 只要是流式的,首包一百毫秒以内就回来了。这几跳是流水线,不是叠加。

真正的大头是另一件完全不同的事:判定用户说完了没有。 传统语音链路靠静音检测——安静满 N 毫秒就宣布这一轮结束。N 调小,用户每次停下来想事情都会被打断;N 调大,每一轮对话都背着这段延迟。团队通常落在半秒上下,而这一个参数在感知响应时间里的占比,往往超过三个模型加起来。

这才是语音原生模型真正改善的东西,而且值得说清楚为什么:人类对话里的轮次交替根本不是靠静音标记的,是靠语调、句法完整度、小句末尾的音高下降。一个能看见原始音频的模型可以用上这些线索,在人类会接话的那个点上接话——包括「短句说完立刻接」和「句中停顿耐心等」。

但请注意,这是轮次检测的性质,不是端到端生成的性质。你完全可以单做一个语义断句模型——吃声学特征加部分转写,预测「这一轮结束了」——然后把它塞进级联里。已经有不少团队这么干了。它在不动其余架构的前提下,把对话体感找回来了绝大部分。如果你的抱怨是延迟,这才是那个便宜的修法,而且比换掉三级要小得多。

真正成立的理由:文本是一个有损瓶颈

下面这条才站得住。在级联里,用户传达的一切必须先被压扁成文本才能活下来,系统要传达的一切又必须从文本重建出来。两次穿过这个瓶颈,掉在外面的,是关于**「怎么说的」**的全部信息。

文本不承载用户听起来很烦躁、很犹豫,不承载他其实半开玩笑,不承载他说到一半心里没底地拖了尾音;不承载说话的是个孩子、房间里还有第二个人、他正在车上。回程方向同样:TTS 得替一句「LLM 在不知道它会怎样被听见的情况下写出来的话」猜情绪。反讽被读平了。一句安慰和一句确认被读成同一个样子。

对相当大一类产品来说,这个损失无所谓。有人在查订单状态,情绪色彩不改变什么才是正确行为。而对另一类产品来说,它就是产品本身:陪伴、语言陪练、教练、以及一切「系统的职责是回应一个人、而不是回应一个请求」的场景。在那里,级联不是差一点——它在结构上就做不了这件事,在三个盒子上做多少工程都补不回来。

所以诚实的分界线在这儿,不在延迟:你产品的价值,是落在「说了什么」上,还是落在「怎么说的」上?

你要交出去的东西

替换级联的代价比 demo 暗示的大,而且大部分代价是运维层面的,不是听感层面的。

文本是你唯一能审计的介质。 级联天然产出一份「用户说了什么、系统说了什么」的转写。你可以存它、搜它、从里面抹掉个人信息、跑合规检查、抽样做质检、丢给分析师看。端到端系统的中间态是一串音频 token。你当然可以事后把音频转写一遍拿到类似的东西,但那是事后重建,并不是模型当时真正条件化的内容。

你失去了按级替换的能力。 级联里每个盒子都是一次独立的采购决策:某个语种换更好的 ASR、TTS 不动、下个季度出了更强的 LLM 就换 LLM——而在这个领域,「下个季度出更强的」基本等于「一直」。端到端模型意味着三种能力同时绑在一家供应商身上,要升一起升,要不升都不升。

推理能力的差距是真实存在的。 到目前为止,语音原生模型在指令遵循、工具调用和多步推理上仍明显落后于前沿文本模型。如果你的智能体必须稳定地调函数、遵守一份很长的业务规则文档、在领域事实上不出错,级联让你能把当下最强的文本模型放在正中间。这个差距会缩小,但还没有合上。

对措辞的精确控制。 受监管的产品经常需要某些句子一字不差地说出来、某些句子永远不能说。文本这一级就是执行这件事的地方——话被说出去之前,你能把那个字符串拿出来检查。在音频 token 上没有等价的检查点。

可调试性。 级联出问题时你能定位到是哪个盒子:是转写错了,还是转写对了但回复错了,还是两个都对但听起来怪。这种分诊几分钟就能做完。端到端只有音频进、音频出,一个糟糕的回复没有任何中间证据可查。

打断这件事,两种架构都是传输层问题

有一点值得单独拎出来说,因为两种架构在这里错得一模一样:打断不会因为换了模型就被解决。

用户压着智能体说话时,你必须立刻停播,并且把客户端上已经缓冲的音频全部丢掉。这一步大家都知道。微妙的是之后模型认为发生了什么:如果你生成了三句话的回答,用户在第四个字就插了进来,模型的上下文现在声称它说了三句,而用户只听见四个字。之后的每一轮都建立在一个关于「共享状态」的错误前提上,对话就这样悄悄失同步——智能体开始引用用户根本没听到的内容。

修法是把模型自己的历史截断到实际播出去的那部分,这要求客户端在打断的那一刻上报播放位置,也要求你的会话状态有能力回过头改写上一轮。这件事在级联里麻烦,在端到端里同样麻烦。它也是「demo 很好、连着用一会儿就觉得不对劲」最常见的单一原因。

怎么选

如果产品是事务型的——客服、预约、下单、查数据,凡是带工具和业务规则的——就做级联。把轮次交替交给语义断句模型而不是静音计时器,两端都做流式,你会得到体感即时的响应时间,外加审计能力和按级换供应商的自由,而这些东西否则都是要在以后补票的。

如果产品是关系型的——重点就在于让用户觉得「被听见了」——那么级联的文本瓶颈是一道你工程上过不去的天花板,即便有运维代价,端到端也是对的架构。

如果你在中间地带,有用的混合形态不是「半个模型」,而是带声学旁路的级联:在输入音频上跑一个轻量分类器,判出情绪、能量和说话人特征,把它们作为结构化上下文交给 LLM,再让 LLM 为 TTS 选择表达提示。你能捞回相当一部分副语言回路,同时把文本留在中间那个你看得见的位置。今天大多数生产系统应该落在这里——这个结论确实比 demo 暗示的要平淡得多。

用 MiraEcho 把它做出来

流式 TTS、实时 ASR、声音克隆,一个 API Key 全都有,免费开始。

免费开始使用