和语音助手聊过天的人都体会过那种尴尬:你说完一句话,它沉默两三秒,再用一成不变的播音腔回答你。而新一代的端到端语音模型(GPT-4o、Qwen-Omni、MiniCPM-o……)几乎是你话音刚落就接上,语气还会跟着内容走。

这背后的关键设计之一,就是 Qwen2.5-Omni 提出、后续版本一路沿用的 Thinker-Talker 架构。这篇文章把它拆开讲清楚:为什么需要它、它怎么工作、以及它是怎么把「开口延迟」压到 0.2 秒量级的。

一、先看老办法:三段流水线

在端到端模型出现之前,语音对话系统几乎都是三段式级联:

  1. ASR(语音识别):把你的话转成文字;
  2. LLM:读文字,写出文字回复;
  3. TTS(语音合成):把回复念出来。
传统级联方案:文字是唯一的接口🎤 用户语音ASR 转文字LLM 想回复TTS 念出来🔊 回复语音✕ 语气、情绪、背景音在第一步就被丢掉✕ 三段串行等待,延迟累加;一步错,步步错端到端方案:一个模型,边想边说语音 / 图像 / 文本原始输入直接进模型Omni 模型Thinker(想)+ Talker(说)📄 文字回复(同步给出)🔊 语音回复(流式播出)✓ 语气随语境,文字语音同时出,首包毫秒级
级联方案 vs 端到端方案

这条管线工程上很省心,每一段都有成熟组件,但毛病是结构性的:

  1. 信息漏斗。语音转成文字的那一刻,语气、情绪、停顿、背景音全被扔掉了。同一句「你可真行啊」,是夸你还是阴阳你,文字上根本看不出来;到了 TTS 那一端也一样,它只拿到干巴巴的文字,用什么语气念全靠猜。
  2. 延迟累加。三段串行,每段都要等上一段出完整结果,首包延迟动辄好几秒。
  3. 错误传递。ASR 听错一个词,后面两段只能将错就错。

问题的根源不是某一段做得不好,而是模块之间只用文字这一根细管子传信息。

二、那让一个模型直接输出语音呢?

级联不行,那走另一个极端:让一个 LLM 直接生成语音,行不行?也不太行,至少有三个麻烦:

  • 两种能力互相干扰。 语音 token 序列长、「语义密度」低——一秒钟的声音要几十个 token,信息量却抵不上几个字。把它和文字混在同一个输出流里训练,容易把模型的文本智商拉下水。
  • 没法同时给两种输出。 很多场景需要文字和语音双输出(屏幕上显示文字,扬声器同时播语音),单一输出流只能二选一或者串行。
  • 优化目标不同。 生成文字追求的是「说什么」(语义正确),生成语音追求的是「怎么说」(音色、韵律、自然度)。让一个脑袋同时精通两件事,不如让两个模块各干各的。

所以理想的结构浮出水面:分工,但不分家。级联的教训是「分家」——模块之间信息断流;单流的教训是「不分工」——两种能力互相拖累。

三、Thinker-Talker:大脑和嘴的分工

Qwen2.5-Omni 技术报告用了一个很形象的比喻:Thinker 是大脑,Talker 是嘴

📄 文本🎙️ 音频🖼️ 图像 / 视频Audio EncoderVision EncoderThinker(大脑)多模态 LLM · 理解一切输入,决定「说什么」📄 文字回复Talker(嘴)自回归生成语音 token,决定「怎么说」流式解码器(token → 波形)🔊 语音① 隐层表征:连续语义,带语气线索,选词前就可用  ② 文本 token:最终落定的词,同一路就是屏幕上的文字Thinker 与 Talker 共享全部对话上下文,端到端联合训练(Qwen2.5-Omni 设计)
Thinker-Talker 整体架构(以 Qwen2.5-Omni 为例)
  • Thinker(大脑):一个多模态 LLM。音频编码器、视觉编码器把声音和画面变成向量序列,和文字一起送进 LLM 主干。它负责全部的「理解」和「思考」,产出文字回复——决定说什么
  • Talker(嘴):一个小得多的自回归 Transformer。它不做理解,只负责把 Thinker 的「想法」变成一串语音 token——决定怎么说

两个设计细节,让它和级联方案有了本质区别。

第一,Talker 共享 Thinker 的全部上下文。 嘴不需要重新听一遍大脑在想什么——Talker 直接读取 Thinker 的内部状态和完整对话历史,两者端到端联合训练,是一个模型,而不是两个模块的拼接。用户语音里的情绪、前几轮聊过的内容,Talker 都「知道」,所以语气能贴合语境。

第二,Talker 同时接收两条通道的信息,这是整个架构里最巧、也最容易看糊涂的一处。

要看懂它,先看清一个事实:Thinker 每生成一个词,其实分前后两个半拍——

  1. 前半拍:上下文过完所有网络层,得到一个隐层向量 h。它是 Thinker 此刻「全部想法」的浓缩——想表达的意思、带着的情绪、这句话往下走的趋势,都在里面。再由 h 算出下一个词的概率分布,比如「开心 45%、高兴 33%、愉快 22%」;
  2. 后半拍:从这个分布里抽签,落定一个具体的词,比如「高兴」——这就是文本 token,也是屏幕上显示的字。

所以 ① 和 ② 不是两个信息源,而是同一次选词的前半拍与后半拍:② 是从 ① 里抽出来的结果,① 是 ② 的来源。关键在于,这层母子关系在两个方向上都是「有损」的,谁也替代不了谁:

  • 从 ① 推不出 ②——分布不等于结果,落定哪个词是随机抽的。只看隐层的话,Talker 多半会照概率最高的「开心」发音,而这一次偏偏抽中的是「高兴」,语音和屏幕文字就对不上了;
  • 从 ② 推不回 ①——token 只是词表里的一个编号,「兴奋、上扬、带点调侃」这些潜台词全不在里面。只看 token 的话,Talker 就得像级联 TTS 一样自己从头猜语气。
① 隐层表征(前半拍 · 采样前)对下一个词的「倾向」+ 语气线索开心高兴愉快45%33%22%还带着「兴奋、上扬」的情绪信号采样(随机抽签)✕ 反推不回:语气信息已丢失② 文本 token(后半拍 · 采样后)「高兴」—— 最终说出口的词只有 ②:丢了语气 —— 念得字正腔圆,但平平无奇只有 ①:不知道最终选了哪个词 —— 可能念成「开心」所以 Talker 两个都要:token 定词,隐层定调
同一次选词的前后两个半拍:② 从 ① 中抽出,且两个方向都有信息损失

打个比方:Talker 是配音演员,Thinker 每说一个词都递给它两样东西——台词本(token:一个字都不能念错)和情绪批注(隐层:「这句念得雀跃些,句尾上扬」)。只有批注没有台词,演员会自由发挥、念错词;只有台词没有批注,念得字正腔圆却毫无感情。token 定词,隐层定调,说的就是这个。

至于图里说隐层「采样前就可用」:h 在抽签前的一瞬就已经算好,而且 Talker 是逐 token 跟着 Thinker 走的,不必等整句话想完——这也是下一节那条流式流水线能转起来的前提。

四、从语音 token 到真正的声音

Talker 输出的还不是波形,而是离散的语音 token——可以理解成「声音的拼音」,其词表由一个语音 codec(Qwen 用的是自家的 qwen-tts-tokenizer)定义。所以还差最后一步:把 token 解码成波形。

这一步最怕「等」。传统合成要拿到完整语句才开始,流式体验就毁了。Qwen2.5-Omni 用的是滑动窗口 DiT:解码当前块时只看少数几个相邻块(回看两块、前瞻一块),感受野被刻意限制住,于是不必等全句——第一小块 token 一到就能出声(DiT 先生成梅尔频谱,再由 BigVGAN 声码器还原成波形)。

时间Thinker:文字Talker:语音 token解码播放首包延迟 ≈ 几个 token(Qwen3-Omni:234 ms)对比:级联方案要等整段文字生成完才开始 TTS,首包动辄数秒。
流式生成时间线:三级流水线同时在跑

把整条链路串起来看:Thinker 吐出第一个文字 token 的同时,隐层表征已经流向 Talker;Talker 落后几个 token 开始产语音 token;解码器攒够一小块就开始出声。三级流水线同时在跑,首包延迟从「一整句话的时间」缩到了「几个 token 的时间」。

顺带一提,输入侧同样是流式的:音频、视频按 2 秒一块送进编码器,再由专门设计的位置编码 TMRoPE 把画面和声音在时间轴上对齐——那是输入侧的另一个故事,这里不展开。

五、架构的进化,与殊途同归

Thinker-Talker 不是一锤子买卖,这两年一直在迭代——分工从没变过,变的是接口和实现。

Qwen3-Omni(2025.09),在生成侧做了三处升级:

  • Thinker 和 Talker 都换成 MoE,高并发下吞吐更好;
  • Talker 从单码本改成多码本:主干每步预测当前帧的第 0 层码本,再由一个超轻量的 MTP 模块补齐其余码本层——一步出一帧;
  • 波形解码抛弃扩散模型,换成轻量因果卷积网络 Code2Wav,逐帧出声。

三管齐下,端到端首包延迟做到了 234 ms(音频、单并发)——已经落在人类对话自然停顿的范围里。

还有一个容易被忽略但很有味道的改动:Talker 不再读 Thinker 的隐层表征,改为直接接收流式的文本 token,外加来自编码器的原始多模态特征。官方给的理由有三层:就文本内容而言,token 和隐层向量的信息量其实等价;语气、音色线索改由多模态特征直接提供(比如语音翻译时保留原说话人的韵律);更重要的是解耦——大脑和嘴之间的接口变成了明文文本,RAG、函数调用、安全过滤这些外部模块都能插在中间、改写 Thinker 的输出之后再交给 Talker 念出来。

文本 / 音频 / 图像 / 视频编码器(音频 · 视觉 · 文本嵌入)多模态特征直达Thinker(大脑 · MoE)理解一切输入,产出文本 token文本 token 流📄 文字回复明文接口:外部模块可介入RAG · 函数调用 · 安全过滤Qwen2.5 的隐层通道,已移除Talker(嘴 · MoE)多码本一步一帧:主干出第 0 层,MTP 补齐其余层Code2Wav(轻量因果卷积)🔊 语音相对 Qwen2.5-Omni:隐层通道移除 · 多模态特征直达 · 多码本 + MTP · 卷积解码对话历史同样以明文 token 共享给 Talker;端到端首包 234 ms(音频、单并发)
Qwen3-Omni:隐层通道退场,明文 token 流成为大脑与嘴之间的接口

Qwen3.5-Omni(2026.04),继续沿用 Thinker-Talker:主干换成 Hybrid Attention + MoE,把上下文推到 256K;语音侧引入 ARIA 机制,动态对齐文本单元和语音单元,进一步改善流式合成的稳定性和韵律。

可以停下来品一下这条演化路径:从「共享隐层」到「明文接口」,恰好复刻了软件工程里从紧耦合走向松耦合的经典剧本。

MiniCPM-o 4.5(2026.04),则是另一家的印证。面壁智能这个主打端侧的模型没有用 Thinker-Talker 这个名字,但拆开一看,形状惊人地一致:

  • 大脑:Qwen3-8B 作 LLM 主干,负责全模态理解、产出文字和隐层状态;
  • :一个只有约 0.3B 的轻量语音 token 解码器,自回归产出语音 token;
  • 最后由流匹配解码器流式还原波形(还能按系统提示里给的参考音频克隆音色)。

连第三节那个双通道的小心思都在:每个文本 token 送进语音解码器时,会把对应的 LLM 隐层状态(过一层 MLP)直接加到 token 嵌入上——token 定词,隐层定调,殊途同归。有意思的是,它保留的是 Qwen2.5-Omni 式的「隐层」路线,而不是 Qwen3-Omni 的「明文」路线——两个流派都还活着,活下来的是那个分工本身。

MiniCPM-o 4.5 真正的差异化在全双工:它把连续的交互切成约一秒的时间片(时分复用,TDM),每片之内先消化新看到、听到的内容,再生成这一片的输出。于是模型能边说边听——被打断会停下,甚至会主动开口提醒你。加上 8B + 0.3B 的小身板,一张消费级显卡就能跑出 0.59 秒的首 token 延迟。

语音 / 视频流(持续进入,可打断)LLM 主干(Qwen3-8B)=大脑全模态理解 · 产出文本 token 与隐层状态📄 文字回复文本 token隐层状态(过一层 MLP)语音 token 解码器(0.3B)=嘴轻量自回归 · 逐帧产出语音 token流式声码器(流匹配 · 可克隆音色)🔊 语音同样的形状:大脑(8B)+嘴(0.3B)+声码器;双通道以「相加」实现——隐层过 MLP 后加到 token 嵌入上特色:时分复用(TDM)按 ~1s 时间片先听后说,边说边听、可打断;消费级显卡首 token 约 0.59 s
MiniCPM-o 4.5:同样的分工,另一种接法——双通道相加、时间片全双工

当两个团队在完全不同的约束下——一个卷云端能力上限,一个卷端侧实时全双工——收敛出同一个形状:大脑管想、小嘴管说、解码器管出声,这个模式基本就算站住了。

六、写在最后

Thinker-Talker 值得记住的不是名字,而是三条朴素的设计原则:

  1. 分工:「说什么」和「怎么说」是两种能力,让两个模块各自精进,互不拖累;
  2. 不分家:模块之间不要用有损的窄接口断流,该共享的上下文要共享;
  3. 为流式而设计:低延迟不是事后优化出来的,而是从自回归结构、滑动窗口感受野到卷积解码器,一层一层设计出来的。

下次语音助手秒回你、还听出了你话里的阴阳怪气,你就知道:那是一颗大脑和一张嘴,在三级流水线上的默契配合。

参考