MIO 与任意到任意流式多模态模型 本节摘要:GPT-4o 交付了一个大多数开源模型复刻不了的产品:一个能听语音、看视频、实时说回去的 agent。开源生态到 2024 年底的回答是 MIO(Wang 等人,2024 年 9 月)。MIO 把文本、图像、语音、音乐都分词,在交错序列上训一个因果 Transformer,实现任意模态到任意模态的生成。AnyGPT(Zhan 等人,2024 年 2 月)是概念验证,MIO 是规模化,Unified-IO 2(Allen AI,2023 年 12 月)是带视觉 + 动作定位的表亲。本节读任意到任意模式——四个分词器、一个 Transformer、流式友好的解码。
本节摘要:GPT-4o 交付了一个大多数开源模型复刻不了的产品:一个能听语音、看视频、实时说回去的 agent。开源生态到 2024 年底的回答是 MIO(Wang 等人,2024 年 9 月)。MIO 把文本、图像、语音、音乐都分词,在交错序列上训一个因果 Transformer,实现任意模态到任意模态的生成。AnyGPT(Zhan 等人,2024 年 2 月)是概念验证,MIO 是规模化,Unified-IO 2(Allen AI,2023 年 12 月)是带视觉 + 动作定位的表亲。本节读任意到任意模式——四个分词器、一个 Transformer、流式友好的解码。
阅读完本节,你应当能够:
统一多模态模型,声称容易,大规模构建难。到 2024 年,大多数「任意到任意」系统是流水线式的:视觉模型 → 文本表示 → 语音模型 → 音频。每一跳都丢信息、加延迟、复杂化训练。GPT-4o 的演示视频展示了单模型、亚秒响应的替代方案;开源系统落后数月。
工程挑战:
MIO 的分词器栈:
每种模态产出整数 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 音频。
流式模式:
Mini-Omni(arXiv:2408.16725)、GLM-4-Voice(arXiv:2412.02612)、Moshi(arXiv:2410.00037)是互补的流式语音-LLM 设计。Moshi 单 GPU 上实现 160ms 往返。
MIO 的训练课程:
漏一个阶段会损害特定能力:跳阶段 2 丢跨模态上下文,跳阶段 3 语音差。
MIO 引入视觉思维链:模型把中间图像 token 作为推理步发出。对「猫在爬树吗?」这类问题,模型:
<image> token 渲染场景(从输入图或草图)。渲染的中间图充当草稿纸,空间推理任务基准提升。这个想法镜像文本推理的思维链。
MIO 最接近纯 token 任意到任意;AnyGPT 是它的概念祖先。
对话产品里,每个组件的延迟都重要:
首音频字节总延迟最低约 300ms;GPT-4o 称约 250ms;Moshi 称 160ms;MIO/AnyGPT 按公开基准在 400~600ms。
即便到 2026 年,开源任意到任意模型在两轴上落后闭源:
这些是开放研究问题。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 # 草图作为草稿纸, 提升空间推理
工程取舍:要纯 token 任意到任意用 MIO/AnyGPT;要带动作输出用 Unified-IO 2;要最低语音延迟用 Moshi;要模块化用 NExT-GPT。
本节产出 outputs/skill-any-to-any-pipeline-auditor.md。给定对话产品规格(输入模态、输出模态、延迟目标),它审计 MIO 系设计选择并算延迟预算。
延迟预算:你的产品接受语音输入、返回语音输出。端到端延迟预算目标是多少?列出花时间的组件。
并行残差:SpeechTokenizer 残差 VQ 用 8 个码本。提出为什么残差层必须并行解码(而非串行),带来什么延迟节省。
嵌入成本:词表 32k 文本 + 4k 图像 + 4k 语音,再加 8k 音乐与约 10 个分隔符。隐藏维 4096 下嵌入矩阵参数成本多少?
视觉思维链:视觉思维链发中间图。哪类问题受益?哪类被多出来的 token 拖累?
读 Moshi:读 Moshi(arXiv:2410.00037),描述其「内心独白」技术,与 MIO 的视觉思维链对比。
下一节,我们将进入视频语言模型——把视觉 token 沿时间轴堆叠,做时序定位(在视频里找到「猫在第几秒跳」),这是从单图理解走向动态场景理解的关键一跃。