前置知识: 多模态AI

全能模型:Qwen2.5-Omni与Thinker-Talker分离架构

12 minAdvanced

理解Thinker-Talker分离架构如何实现流式实时语音对话

全能模型:Qwen2.5-Omni与Thinker-Talker分离架构

GPT-4o在2024年5月的产品演示之所以具有颠覆性,不是因为底层模型,而是因为产品形态——一个语音界面,你说话,模型看到摄像头看到的内容,并在250ms内语音回复。开放生态系统在2024年和2025年的剩余时间里竞相达到那个产品界面。Qwen2.5-Omni (2025年3月)是参考开放设计:一个Thinker(大型文本生成Transformer)加一个Talker(并行语音生成Transformer),通过流式语音token链接。Mini-Omni简化了它,Moshi匹配了其延迟,GLM-4-Voice将其扩展到中文。本课程阅读Thinker-Talker架构和使流式实时对话工作的延迟预算。

类型: 构建 语言: Python (stdlib, 流式管道延迟模拟器 + VAD循环) 前置知识: Phase 12 · 19 (音频LLM), Phase 12 · 16 (任意到任意) 时间: ~180分钟

学习目标

  • 将推理管道拆分为Thinker(文本推理)和Talker(语音合成)并解释为什么并行流式有效。
  • 逐组件计算对话交互的首音频字节时间(TTFAB)预算。
  • 描述TMRoPE在Thinker内跨视觉、音频和文本的时间对齐位置编码。
  • 说出三种实时对话模式:半双工、轮流、全双工。

问题

实时语音助手必须快速完成很多事:

  1. 听用户说话。实时语音分词,语音活动检测(VAD)判断用户何时说完。
  2. 可选地看。2-4 FPS摄像头输入,与音频一起流式送入Thinker。
  3. 思考。基于对话历史组织响应。
  4. 说话。合成音频token,解码为波形,流式传到用户扬声器。

每步增加延迟。对话感要求总往返<500ms——低于此,用户不再注意到延迟。GPT-4o声称约250ms。Moshi约160ms。Qwen2.5-Omni约350-500ms。

每个组件都需要流式。不能”批量处理所有再解码”。

概念

Thinker和Talker

Qwen2.5-Omni的分解:

  • Thinker:7B-80B文本生成Transformer。消费交错的文本+像+音频token。输出代表要说什么的文本token。
  • Talker:更小的语音生成Transformer(200M-1B)。消费Thinker的文本输出token加最近的语音上下文token。输出离散语音token(残差VQ索引)。
  • 语音解码器:流式波形解码器(SNAC, MoVQGAN家族),将语音token实时转为音频样本。

分离很重要。Thinker必须大才能推理好。Talker可以小,因为它的任务是局部的——将文本转为语音token。更大的Talker不是更有表现力;而是更慢。

并行运行两者:

  1. Thinker发出文本token t_i。
  2. Talker消费ti(通过流式)并发出语音token s_i, s{i+1}, …, s_{i+k}。
  3. 语音解码器在语音token到达时消费并发出音频样本。
  4. 当Thinker在文本token t*{i+3}时,Talker已经流式输出了t_0..t*{i+2}的音频。

TMRoPE — 时间对齐多模态位置

Thinker需要整合像帧(以4 FPS到达)、音频帧(以50帧/秒到达)和对话历史文本。朴素序列顺序(所有像,然后所有音频,然后文本)丢失时间对齐。

TMRoPE为每个token分配绝对时间戳。视觉token在t=2.3s。音频token在t=2.32s。用户文本token”停”在t=2.35s。RoPE按时间戳旋转注意力;模型将它们视为时间上并发的。

这是”他边说你好边挥手”工作的基础设施——模型在同一概念时刻看到视频帧和音频。

流式语音合成

语音token必须流式。Mini-Omni (Xie & Wu, 2024)引入了”语言模型可以在流式中听、说、思考”:Thinker输出token和Talker输出token在同一序列中交错。Talker在Thinker提交下一个文本token时立即触发。无批量边界。

Moshi (Defossez等人, 2024年10月)是最快的开放实现。单A100上160ms TTFAB。架构:单一7B Transformer在交替位置发出文本和语音token,带”内心独白”将思考流与说话流分离。这实际上是Thinker + Talker融合为一个模型,带精心训练。

VAD和轮流

语音活动检测在输入侧运行。两种模式:

  • 半双工:用户说话,模型听。模型说话,用户听。通过VAD静默检测(约200ms)清晰切换。
  • 全双工:两者可以同时说话。模型可以后通道(“嗯哼”)或打断。更难。Moshi支持此模式。

Qwen2.5-Omni默认支持半双工,通过静默阈值轮流。全双工需要应用层处理。

Qwen3-Omni (2025年11月)

继任者。Qwen3-80B Thinker,更大Talker,改进TMRoPE-v2。延迟接近GPT-4o的250ms。开放权重。OmniBench基准与Gemini 2.0 Live竞争。

生产延迟预算

典型流式交互:

  • 麦克风 → 音频token:40-80ms。
  • 预填充(prompt + 历史):7B上100-200ms,70B上更多。
  • 首个Thinker文本token:40ms。
  • Talker处理首个文本token:20ms。
  • 首个语音token提交:40ms。
  • 残差VQ解码:30ms。
  • 语音波形解码:50-80ms。

总TTFAB:7B上320-510ms,70B上600-900ms。前沿质量通常意味着70B+;因此前沿延迟差距。

Token速率数学

16kHz语音50 Hz基础语音token下,你需要每秒输出50个语音token。Talker必须发出>=50 tok/s才能跟上。在H100上典型LLM吞吐量30-80 tok/s下,小型(200-300M)Talker足够快;7B Talker会落后。

这就是为什么存在专用小型Talker模型而非”就用主模型”。

实践

code/main.py

  • 模拟带mock token发射率的Thinker-Talker管道。
  • 为可配置模型大小和麦克风采样率计算TTFAB。
  • 演示带VAD静默阈值的半双工轮流。

输出

本课程产生outputs/skill-omni-streaming-budget.md。给定实时语音产品的目标TTFAB和功能集(视觉输入、双语、全双工),选择Qwen2.5-Omni、Qwen3-Omni、Moshi或Mini-Omni并确定Thinker/Talker大小。

练习

  1. 你的目标TTFAB是300ms。在7B Thinker和300M Talker上,写出每个组件的延迟。

  2. Qwen2.5-Omni使用TMRoPE。描述用户在t=1s开始说话且摄像头在t=1.2s捕捉到手势的prompt下模型看到什么。

  3. 全双工支持要求模型在听的同时发出音频。提出教授此能力的训练数据格式。

  4. 阅读Moshi论文第4节。描述”内心独白”分离以及为什么它避免了Thinker-Talker拆分。

  5. 计算吞吐量预算:Talker必须多快发出token才能跟上16kHz语音50基础层token/秒?

关键术语

术语常见说法实际含义
Thinker”推理大脑”产生要说什么内容的大型文本生成Transformer
Talker”语音生成嘴巴”从Thinker文本产生离散语音token的小型Transformer
TTFAB”延迟预算”首音频字节时间:从用户语音结束到首个音频样本输出
TMRoPE”时间对齐RoPE”使用跨视觉、音频、文本的绝对时间戳的位置编码
半双工”轮流”用户和模型交替;VAD静默检测用户说完
全双工”同时”模型可以同时说话和听;支持后通道
内心独白”Moshi分离”思考流和说话流交错的单模型设计

延伸阅读