MIO 与任意到任意流式多模态模型


文档摘要

MIO 与任意到任意流式多模态模型 本节摘要:GPT-4o 交付了一个大多数开源模型复刻不了的产品:一个能听语音、看视频、实时说回去的 agent。开源生态到 2024 年底的回答是 MIO(Wang 等人,2024 年 9 月)。MIO 把文本、图像、语音、音乐都分词,在交错序列上训一个因果 Transformer,实现任意模态到任意模态的生成。AnyGPT(Zhan 等人,2024 年 2 月)是概念验证,MIO 是规模化,Unified-IO 2(Allen AI,2023 年 12 月)是带视觉 + 动作定位的表亲。本节读任意到任意模式——四个分词器、一个 Transformer、流式友好的解码。

MIO 与任意到任意流式多模态模型

本节摘要:GPT-4o 交付了一个大多数开源模型复刻不了的产品:一个能听语音、看视频、实时说回去的 agent。开源生态到 2024 年底的回答是 MIO(Wang 等人,2024 年 9 月)。MIO 把文本、图像、语音、音乐都分词,在交错序列上训一个因果 Transformer,实现任意模态到任意模态的生成。AnyGPT(Zhan 等人,2024 年 2 月)是概念验证,MIO 是规模化,Unified-IO 2(Allen AI,2023 年 12 月)是带视觉 + 动作定位的表亲。本节读任意到任意模式——四个分词器、一个 Transformer、流式友好的解码。

学习目标

阅读完本节,你应当能够:

  1. 设计一个不冲突地容纳文本、图像、语音、音乐 token 的共享词表。
  2. 在压缩与重建权衡上,对比 SEED-Tokenizer(图像)与 SpeechTokenizer 残差 VQ(语音)。
  3. 解释构建任意到任意生成的四阶段课程。
  4. 说出三种开源任意到任意配方及主要权衡:MIO、AnyGPT、Unified-IO 2。

一、问题与直觉

统一多模态模型,声称容易,大规模构建难。到 2024 年,大多数「任意到任意」系统是流水线式的:视觉模型 → 文本表示 → 语音模型 → 音频。每一跳都丢信息、加延迟、复杂化训练。GPT-4o 的演示视频展示了单模型、亚秒响应的替代方案;开源系统落后数月。

工程挑战:

  • 每种模态都必须存在分词器,压缩到足够无损以重建,且产 token 的速率 Transformer 能消费。
  • 单一词表要为文本(32k+)、图像(16k+)、语音(4k+)、音乐(8k+)分配空间,至少四万多项。
  • 训练数据要覆盖每对输入-输出(文→图、图→语音、语音→图等),否则模型得能组合。
  • 推理要流式输出 token,快到满足对话延迟(首音频字节 < 500ms)。

四个分词器对应四种模态

MIO 的分词器栈:

  • 文本:标准 BPE,词表约 32000。
  • 图像:SEED-Tokenizer(2023)——带离散码本的量化 VAE,4096 项,每图 32×32 token。
  • 语音:SpeechTokenizer 残差 VQ(2023)——把 16kHz 波形编进 8 层层级码本;第一层是粗内容,后续层加韵律与说话人身份。
  • 音乐:类似残差 VQ(Meta 的 MusicGen / Encodec 家族),4~8 个码本。

每种模态产出整数 token,在共享词表里拿互不重叠的 ID 段:

text: 0..31999 image: 32000..36095 (4096 个图像 token) speech: 36096..40191 (4096 个语音基础 token, 加残差层) music: 40192..48383 (8192 个音乐 token) sep: 48384..48390 (<image>, <speech>, <music>, </...> 等)

总计约 48k 词表,输入嵌入与输出投影覆盖全部。

流式解码

语音生成用残差 VQ。Transformer 预测基础(第 0 层)语音 token;一个并行解码的残差量化器预测后续层。每个第 0 层 token 大约是 16kHz 下 50ms 音频。

流式模式:

  1. 用户对麦克风说话,实时音频分词器每 50ms 发语音 token。
  2. MIO 边到边消费 token(prompt 预填 + 增量前向)。
  3. 输出 token 边生成边流出;并行语音解码器以约 50~150ms 延迟转成音频样本。
  4. 首音频字节延迟(TTFAB):MIO 论文约 300~500ms,逼近 GPT-4o 的约 250ms。

Mini-Omni(arXiv:2408.16725)、GLM-4-Voice(arXiv:2412.02612)、Moshi(arXiv:2410.00037)是互补的流式语音-LLM 设计。Moshi 单 GPU 上实现 160ms 往返。

四阶段课程

MIO 的训练课程:

  1. 阶段 1——对齐:大规模模态对语料(文-图、文-语音、文-音乐),每对用自己的词表段,训练共享词表。
  2. 阶段 2——交错:多模态交错文档(带图+视频的博客、带文字稿的播客等),训练跨模态上下文。
  3. 阶段 3——语音增强:额外音频数据,在不丢文本能力的前提下提语音质量。
  4. 阶段 4——SFT:跨模态指令微调(VQA、caption、旁白、语音到语音对话)。

漏一个阶段会损害特定能力:跳阶段 2 丢跨模态上下文,跳阶段 3 语音差。

视觉思维链

MIO 引入视觉思维链:模型把中间图像 token 作为推理步发出。对「猫在爬树吗?」这类问题,模型:

  1. <image> token 渲染场景(从输入图或草图)。
  2. 发文本分析草图。
  3. 发最终答案。

渲染的中间图充当草稿纸,空间推理任务基准提升。这个想法镜像文本推理的思维链。

任意到任意的竞争者

  • AnyGPT(arXiv:2402.12226):4 模态(文本、图、语音、音乐),设计类似。
  • Unified-IO 2(arXiv:2312.17172):加视觉动作输出、深度、法线,任务多样性更多,规模更小。
  • NExT-GPT(arXiv:2309.05519):LLM + 模态专属扩散解码器,不是单模型路线。
  • CoDi(arXiv:2305.11846):可组合扩散,经共享潜空间实现任意到任意。

MIO 最接近纯 token 任意到任意;AnyGPT 是它的概念祖先。

延迟预算

对话产品里,每个组件的延迟都重要:

  • 麦克风到音频 token:约 50ms。
  • 预填(音频 token + 历史):8B 模型上约 100ms。
  • 首输出 token:约 50ms。
  • 并行残差 VQ + 语音解码器:约 100~150ms。

首音频字节总延迟最低约 300ms;GPT-4o 称约 250ms;Moshi 称 160ms;MIO/AnyGPT 按公开基准在 400~600ms。

为什么任意到任意仍难

即便到 2026 年,开源任意到任意模型在两轴上落后闭源:

  • 语音质量:残差 VQ 分词器有损,对话语音听起来机械,不如 ElevenLabs 级的声音。
  • 跨模态推理:让模型「唱出你看到的」仍比纯视觉任务更常失败。

这些是开放研究问题。Qwen3-Omni(第 20 节)是 2025 年最先进的开源尝试。

二、从零实现

code/main.py:

  • 定义四模态词表分配并打印。
  • 把一组多模态输入(文本、图像、音频片段、音乐)经分词器路由器路由。
  • 模拟一个文生语音响应的流式解码并计延迟。
  • 给定编码器、预填、解码器延迟,算预期首音频字节延迟。

词表分配的伪代码

VOCAB = { "text": range(0, 32000), "image": range(32000, 36096), # SEED 4096 项 "speech": range(36096, 40192), # 残差 VQ 基础 4096 项 "music": range(40192, 48384), # 8192 项 "sep": range(48384, 48391), # <image> <speech> <music> </...> } def tokenize(modality, raw): if modality == "text": return bpe(raw) if modality == "image": return seed_tokenizer(raw) # 32x32 整数 if modality == "speech": return speech_rvq(raw) # 8 层码本 if modality == "music": return music_rvq(raw)

流式解码

def stream_decode(prompt_tokens, model): out = [] while True: logits = model(prompt_tokens + out) next_id = sample(logits[-1]) out.append(next_id) if next_id in SEP["speech_start"]: # 接下来是语音基础 token, 并行解码残差层 → 音频 audio_chunk = speech_decoder(out[speech_tokens:]) play(audio_chunk) # ~50-150ms 后出声 if next_id == EOS: break

💡 延迟拆解:首音频字节 = 麦克风(50ms)+ 预填(100ms)+ 首 token(50ms)+ 语音解码(100~150ms)≈ 300ms。每砍 50ms 都是对话体感的质变,这就是 Moshi 160ms 为何引人注目。

视觉思维链

def chain_of_visual_thought(question, image, model): sketch = model.generate(image_tokens=image, mode="image_out") # 草图 analysis = model.generate(prompt=question + sketch, mode="text_out") answer = model.generate(prompt=analysis, mode="text_out") return answer # 草图作为草稿纸, 提升空间推理

三、框架对比

  • MIO:四模态纯 token 任意到任意,SEED 图像 + 残差 VQ 语音,四阶段课程,流式解码。
  • AnyGPT:MIO 的概念祖先,4 模态同设计,规模更小。
  • Unified-IO 2:加视觉动作/深度/法线,任务多样性多,规模小。
  • NExT-GPT:LLM + 模态专属扩散解码器,非单模型。
  • Moshi / Mini-Omni / GLM-4-Voice:专注流式语音-LLM,Moshi 单 GPU 160ms 往返。

工程取舍:要纯 token 任意到任意用 MIO/AnyGPT;要带动作输出用 Unified-IO 2;要最低语音延迟用 Moshi;要模块化用 NExT-GPT。

四、可复用产物

本节产出 outputs/skill-any-to-any-pipeline-auditor.md。给定对话产品规格(输入模态、输出模态、延迟目标),它审计 MIO 系设计选择并算延迟预算。

五、练习

  1. 延迟预算:你的产品接受语音输入、返回语音输出。端到端延迟预算目标是多少?列出花时间的组件。

  2. 并行残差:SpeechTokenizer 残差 VQ 用 8 个码本。提出为什么残差层必须并行解码(而非串行),带来什么延迟节省。

  3. 嵌入成本:词表 32k 文本 + 4k 图像 + 4k 语音,再加 8k 音乐与约 10 个分隔符。隐藏维 4096 下嵌入矩阵参数成本多少?

  4. 视觉思维链:视觉思维链发中间图。哪类问题受益?哪类被多出来的 token 拖累?

  5. 读 Moshi:读 Moshi(arXiv:2410.00037),描述其「内心独白」技术,与 MIO 的视觉思维链对比。

本节要点回顾

  1. 任意到任意:单一模型接受并发出文本/图/语音/音乐,任意方向。
  2. 四个分词器:文本 BPE、图像 SEED、语音/音乐残差 VQ,产出整数 token。
  3. 共享词表约 48k:互不重叠的 ID 段,单一嵌入与输出投影覆盖全部。
  4. 流式解码:语音预测基础 token,并行残差层,每基础 token 约 50ms 音频。
  5. 四阶段课程:对齐 → 交错 → 语音增强 → SFT,漏一阶段损害对应能力。
  6. 视觉思维链:发中间图当草稿纸,提升空间推理,镜像文本思维链。
  7. 延迟预算:首音频字节 ≈ 麦克风 50 + 预填 100 + 首 token 50 + 解码 100~150 ≈ 300ms。
  8. Moshi 160ms:单 GPU 往返,流式语音-LLM 的延迟标杆。
  9. 仍难:语音残差 VQ 有损(机械感),跨模态推理(「唱你看到的」)失败率高。
  10. 竞争者:MIO(纯 token)、AnyGPT(祖先)、Unified-IO 2(带动作)、NExT-GPT(模块化)、Moshi(低延迟)。

下一节,我们将进入视频语言模型——把视觉 token 沿时间轴堆叠,做时序定位(在视频里找到「猫在第几秒跳」),这是从单图理解走向动态场景理解的关键一跃。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U