4、Qwen-omni
Qwen2.5-Omni:统一多模态大模型的架构、时序对齐与流式语音生成
Qwen2.5-Omni 是一个“统一”的多模态模型:它能够同时感知 文本 / 音频 / 图像 / 视频(含音轨),并在交互时以 流式(streaming) 方式同步生成 文本 与 自然语音。与“视觉模型 + ASR + LLM + TTS”的级联式系统不同,它将多模态理解与语音生成作为一个整体端到端协同,使得系统在实时性、跨模态对齐以及误差传递方面具有明显优势。
下文围绕四个核心创新展开:统一架构、TMRoPE 时序编码、Thinker–Talker 双模块、以及多模态性能,并在关键处用具体案例说明它为何能更好地“边听边看边说”。
1. 核心创新一:统一架构与“边输入边输出”的流式交互
1.1 统一输入:text / audio / video 的共同语义空间
统一架构的关键不是“把不同模态都喂进 Transformer”,而是让模型能在同一上下文中:
- 同时利用文本的离散语义、音频的连续时序、视觉的空间结构
- 在同一个注意力机制里建立跨模态依赖(例如:某段语音指代视频里正在发生的动作)
- 支持 实时输入(音频/视频持续到来)与 实时输出(文本和语音持续产出)
这使得模型可以执行更自然的人机交互:用户边说、视频边播,模型边理解边回应,不需要等“输入完全结束”再开始生成。
1.2 统一输出:文本与自然语音的同步流式生成
与许多系统“先出完整文本再做 TTS”不同,Qwen2.5-Omni 的目标是:
- 文本 token 与 语音 token 可以同步流式生成
- 语音输出可以在文本输出尚未完全结束时提前开始(降低首包延迟)
- 语音语调、停顿、情绪等不仅依赖字面文本,也可利用多模态上下文(画面、语气、环境声)
2. 核心创新二:TMRoPE 时序编码——让音视频在 Transformer 里“对齐到同一时间轴”
多模态 Transformer 最难的点之一是:不同模态的 token 不是同一“坐标系”。
- 文本 token 有天然的 1D 顺序位置
- 图像 token 是 2D 空间位置(height/width)
- 视频 token 既有 2D 空间位置,也有 1D 时间位置
- 音频 token 是高密度时间序列(且采样频率往往远高于视频帧率)
如果仍用传统 RoPE(Rotary Position Embedding)那种“只有 1D 序号”的位置编码,多模态注意力就很难稳定学习“这一帧画面对应这一段声音”。
2.1 TMRoPE:将 RoPE 显式解耦为三维坐标
TMRoPE 的思想可以概括为:为每个 token 分配一个三元组位置坐标:
- Temporal:时间位置(绝对时间)
- Height:垂直空间位置
- Width:水平空间位置
也就是说,每个 token 不再只有一个“序号”,而是拥有“时间 + 空间”坐标。这样注意力在计算相关性时,能够显式感知“是否同一时间片、是否相邻空间区域”。
直观理解:文本像一条线;图像像一张网格;视频像“时间堆叠的网格”;音频像高采样率时间线。TMRoPE 的目标是把它们统一到“同一时间轴 + 对应空间”的坐标体系中。
2.2 不同模态的 ID 规则:让每类 token 拥有合适的“坐标定义”
一种可理解的规则表(概念层面)如下:
| 输入类型 | Temporal ID 规则 | 空间 ID 规则 |
|---|---|---|
| 文本 | 所有 token 共享同一 Temporal 设定(等价于 1D) | 等价于 1D-RoPE |
| 音频 | 按固定时间片递增(例如每 40ms 一个 ID) | 不适用 |
| 图像 | Temporal 固定(或统一) | 按像素/patch 的 height/width 分配 |
| 视频(含音频) | video 帧按真实时间戳映射到 Temporal;音频按固定间隔递增 | 同图像:每帧内按 height/width 分配 |
这样做的结果是:音频与视频帧能够映射到同一 Temporal 网格上,模型可以通过注意力学习跨模态对齐。
2.3 跨模态位置初始化:拼接输入时保持“坐标连续性”
多模态输入往往被拼接为一个序列送入 Transformer。为了避免不同模态位置冲突,常见做法是让后续模态的位置 ID 从前序模态的最大 ID 继续递增。这样整体位置在数值上是连续的,模型更容易学习“先看到画面,再听到声音,再读到文本”。
3. 核心创新三:Thinker–Talker 双模块——把“理解”和“发声”解耦但又保持实时同步
Qwen2.5-Omni 的架构可抽象为两个协同模块:
- Thinker:负责理解与推理,输出高层语义表征与文本
- Talker:负责语音流式生成,输出离散语音 token 并最终解码为波形
这是一种“类人”的分工:大脑负责理解与组织语言,发声器官负责把语言转换为声音。但关键是:它不是松耦合的级联,而是共享上下文状态、保持实时同步。
3.1 Thinker:多模态理解与文本生成的主干
Thinker 可以理解为一个基于 Transformer decoder 的多模态大模型主干:
- 接收文本 token(离散)
- 接收音频 encoder 输出的序列特征(时序)
- 接收 vision encoder 输出的视觉 token(空间/时空)
Thinker 的输出包括两类信息:
- 高层语义表征(high-level representations):浓缩多模态语义、包含推理结果、以及潜在的语气/情绪线索
- 文本 token:按常规自回归语言模型方式生成
3.2 Talker:双轨自回归的流式语音 token 生成器
Talker 的核心目标是:在不等待完整文本的情况下,尽早产出语音 token,形成自然的实时对话体验。
它以流式方式接收 Thinker 的两类输入:
- 高层语义表征(包含语义 + 韵律暗示)
- 已生成文本 token 的 embedding(提供明确的离散语义锚点)
为什么需要“双输入”?
如果只用高层语义表征:
- 表征空间可能把同义词、近义句压得很近
- 语音生成可能在同音词、同义异音词上产生歧义(尤其在多语言/专名场景)
如果只用文本 token:
- 语音韵律与情绪可能不自然
- 对多模态上下文(画面情绪、语气、环境声)的利用不足
因此 Talker 同时吃两者:既保持“语义确定性”,又保留“说话风格与预判能力”。
4. 输入模态处理:文本、音频、视觉、视频如何进入同一个模型
4.1 文本:byte-level BPE tokenizer 与序列表征
文本输入通过 Qwen tokenizer 编码(byte-level BPE),得到 token 序列,再映射为 hidden representations 送入 Thinker。
4.2 音频:从波形到时序特征(40ms 级别对齐)
典型流程可概括为:
- 重采样到 16kHz
- 25ms 窗口、10ms 步长提取 128 维 mel-spectrogram
- 通过 audio encoder 得到时序特征序列
- 将音频帧表征聚合到一个更粗的时间粒度(例如每个表征对应 40ms)
这里“40ms/帧”很关键:它为后续的 Temporal ID 提供稳定单位,使音频能够与视频帧时间戳对齐(至少在一个可学习的粒度上)。
4.3 视觉:ViT 风格 vision encoder 与图像/视频统一处理
视觉信号(图像/视频)由 vision encoder 提取为视觉 token。对于视频,除了每帧的空间 token,还需要额外的时间组织方式,使其能与音频一起被 Thinker 融合。
4.4 视频:动态帧率采样与“图像视作两帧”的统一策略
为了让视频 token 的时间分辨率更贴合音频,视频可采用动态帧率采样,使帧时间戳映射到 Temporal ID 时更加稳定。
“单张图像视为两帧相同画面”是一种工程上很实用的统一技巧:
- 让图像也能套用“视频输入接口”
- 保持架构一致性,减少分支逻辑
- 让模型在训练时更容易复用视频相关能力
5. 音视频交织策略:把多模态 token 排成“可对齐的单序列”
即便有了 TMRoPE,如果把音频 token 全放在序列末尾、视频 token 全放在序列开头,模型仍然需要跨越很长距离才能建立对齐关系,注意力成本与学习难度都会增大。
因此一种有效策略是:按时间分块,把同一时间段的视觉 token 与音频 token 放到更近的位置。
5.1 时间分块:以 2 秒为一个处理单元
可以把输入按真实时间分成多个块,每块对应 2 秒左右的音视频:
- 块前端放该时间段的视频视觉 token
- 块后端放该时间段的音频 token
形成一种“同一时间段相邻排列”的序列结构。
5.2 Temporal ID 的动态计算:让不同采样率映射到同一时间轴
关键在于把真实时间 ttt 映射到 Temporal ID。一个直观的映射方式是:
- 设时间单位为 Δ\DeltaΔ(例如 Δ=40ms\Delta = 40\text{ms}Δ=40ms)
- 则时间 ttt 对应的 Temporal ID 为:
tid(t)=⌊tΔ⌋ \text{tid}(t) = \left\lfloor \frac{t}{\Delta} \right\rfloor tid(t)=⌊Δt⌋
- 音频帧按固定 Δ\DeltaΔ 递增
- 视频帧按真实时间戳 tft_ftf 映射到对应 tid(tf)\text{tid}(t_f)tid(tf)
这样即使视频帧率变化,只要时间戳正确,Temporal ID 就能保持与音频一致的“时间网格”。
5.3 一个直观案例:视频里“敲桌子”的声音与动作对齐
假设视频里有人在 3.2 秒处敲桌子,同时出现清晰敲击声。
- 该帧时间戳 tf=3.2st_f = 3.2\text{s}tf=3.2s
- 若 Δ=0.04s\Delta = 0.04\text{s}Δ=0.04s,则
tid(3.2)=⌊3.20.04⌋=⌊80⌋=80 \text{tid}(3.2) = \left\lfloor \frac{3.2}{0.04} \right\rfloor = \left\lfloor 80 \right\rfloor = 80 tid(3.2)=⌊0.043.2⌋=⌊80⌋=80
敲击声对应的音频表征也会落在 tid 约为 80 的附近。
当视觉 token 与音频 token 在序列中按时间块交织排列时,注意力更容易学习到“tid 相近 = 同一事件”的对齐规律,从而提升诸如:
- “声音来自哪个动作?”
- “说话人是谁?是否正在出现在画面里?”
- “刚刚那句话是在回应画面中的哪个物体?”
6. 输出模态处理:文本怎么生成、语音怎么生成
6.1 文本生成:Thinker 的自回归语言建模
Thinker 的文本生成遵循标准自回归:
- 对词表分布采样生成下一个 token
- 配合 top-p、repetition penalty 等常用采样策略控制多样性与重复
其本质是最大化条件概率:
P(y∣x)=∏t=1TP(yt∣x,y<t) P(y \mid x) = \prod_{t=1}^{T} P(y_t \mid x, y_{<t}) P(y∣x)=t=1∏TP(yt∣x,y<t)
其中 xxx 包含多模态输入(文本/音频/视觉/视频),yyy 是输出文本 token 序列。
6.2 语音生成:Talker 输出离散语音 token,再解码为波形
语音生成通常分两步:
- Talker 自回归生成离散语音 token 序列 z1:Kz_{1:K}z1:K
- 语音解码器把 z1:Kz_{1:K}z1:K 还原为连续波形 s^(t)\hat{s}(t)s^(t)
自回归形式可表示为:
P(z∣h,e)=∏k=1KP(zk∣h,e,z<k) P(z \mid h, e) = \prod_{k=1}^{K} P(z_k \mid h, e, z_{<k}) P(z∣h,e)=k=1∏KP(zk∣h,e,z<k)
- hhh:Thinker 输出的高层语义表征
- eee:文本 token 的 embedding(或其函数)
- zzz:离散语音 token
这种离散 token 方案的好处是:
- 不需要文本与语音的逐词时间戳对齐(弱化对齐数据要求)
- 更利于流式生成(token 级别逐步产出)
- 语音质量可由后端解码器持续优化
7. 流式交互优化:延迟从哪里来,如何降低
流式系统的体验很大程度取决于“首包延迟”和“持续输出的稳定性”。延迟可拆成四部分:
- 多模态预处理延迟(音频特征、视觉帧、tokenization)
- 首文本输入到首语音 token 输出的推理延迟
- 首语音 token 到音频波形的解码延迟
- 模型架构固有延迟(参数量、注意力窗口、并行效率)
7.1 chunked-prefill:让长输入也能“分块预填充”
在长音频/长视频场景,若一次性 prefill 全上下文,首包会非常慢。chunked-prefill 的目标是:把输入切成小块,边填充边生成。
为此可以做两类改造:
- 音频编码器:把全局注意力改为按 2 秒分块的时序注意力
- 视觉编码器:
- 使用高效注意力实现加速
- 合并相邻视觉 token(例如 2×22 \times 22×2 合并)降低序列长度
- 固定 patch size 并支持多分辨率序列化
其核心收益是降低注意力计算的二次成本,因为注意力复杂度与序列长度 LLL 相关:
Costattn∝L2 \text{Cost}_\text{attn} \propto L^2 Costattn∝L2
当通过 token 合并或分块将有效 LLL 降低时,推理延迟与显存压力都会显著下降。
7.2 滑动窗口注意力:让生成时只看“必要上下文”
流式生成不可能无限制回看全部历史,否则计算会线性累积直至不可用。滑动窗口机制通常限制每一步只关注最近的若干块上下文。
可将上下文分为块(blocks),并限制注意力范围为:
- lookback:回看历史块数量
- lookahead:允许少量前瞻块(用于平滑)
若窗口包含 BBB 个块、每块长度近似为 mmm,则有效注意力长度约为 L≈BmL \approx BmL≈Bm,计算保持可控。
8. 预训练与微调:三阶段渐进式训练如何让“统一模型”真正统一
统一多模态模型的难点在于:不同模态的数据规模、噪声水平、分布差异都非常大。如果一开始就全参数、全模态混合训练,往往出现不稳定或单模态能力退化。
因此采用分阶段策略更合理。
8.1 三阶段预训练策略
阶段 1:冻结 LLM,训练视觉/音频侧(或其适配器)
目标:先把视觉/音频信息“对齐到语言空间”,让 LLM 能读懂多模态。
阶段 2:解冻全部参数,进行更广泛的多模态训练
目标:让模型形成统一的跨模态表征与推理能力。
阶段 3:使用长序列数据扩展上下文能力(例如 32k)
目标:支持长音频、长视频、长对话历史。
序列长度扩展的意义在于:许多真实音视频任务需要跨越很长时间段做理解与对齐,例如:
- 一段 10 分钟会议中定位“刚才那句提案对应哪张幻灯片”
- 长视频中追踪人物身份与对话指代
8.2 初始化:让各模态从强基座起步
统一模型往往会选用成熟组件初始化:
- LLM:用强文本模型参数初始化
- vision encoder:用强视觉-语言模型的视觉侧初始化
- audio encoder:用强语音模型初始化(例如 ASR/音频理解 backbone)
这种初始化降低了“从零学多模态”的数据与算力压力,使训练更像“统一与融合”,而不是“从头发明各模态能力”。
9. Talker 微调:从能说到说得稳、说得像、说得可控
Talker 的训练通常要解决三类问题:
- 能生成:语音连续、可懂、无明显断裂
- 生成稳定:少发音错误、少异常停顿、少乱码式音素
- 自然与可控:韵律、情绪、音色、口音等更符合交互预期
一种合理的训练路径是三段式:
- 上下文延续训练:学会在给定上下文条件下持续生成语音 token
- 偏好优化(例如 DPO 类):把“更自然/更准确”的语音偏好蒸入生成分布
- 多说话人微调:增强音色与说话风格的可控性与自然度
在偏好优化中,常见形式是让模型提升对优质样本 ywy_wyw 的相对偏好、降低对劣质样本 yly_lyl 的偏好。用一个简化的偏好目标表示为:
max logσ(β[logPθ(yw∣x)−logPθ(yl∣x)]) \max \; \log \sigma\left(\beta \left[\log P_\theta(y_w \mid x) - \log P_\theta(y_l \mid x)\right]\right) maxlogσ(β[logPθ(yw∣x)−logPθ(yl∣x)])
- xxx:输入上下文(多模态 + 历史)
- PθP_\thetaPθ:当前模型分布
- β\betaβ:温度/强度系数
- σ(⋅)\sigma(\cdot)σ(⋅):sigmoid
直观理解:如果模型让好语音更可能、坏语音更不可能,则目标值增大。
10. 端到端系统为何优于级联:一个“实时视频指令跟随”的案例
考虑一个真实场景:用户打开一个做菜视频并口头提问:
“他刚刚加的是盐还是糖?你听一下他怎么说的,并看他拿的是什么罐子。”
在级联系统中,流程可能是:
- ASR 把语音转文字(可能受环境声影响出错)
- 视频理解模型识别物体(盐/糖罐子相似时易混)
- LLM 读两路结果再推理
- TTS 把最终文本读出来(无法充分利用“说话语气/犹豫”线索)
在 Qwen2.5-Omni 的统一系统里:
- 音频与视频按时间块交织,TMRoPE 对齐时间轴
- Thinker 可直接用跨模态注意力捕捉“说到 salt 时镜头对准盐罐”
- Talker 还能把不确定性用语气表达出来,例如:
- “我更倾向于是盐,因为……不过画面有点模糊”
- 停顿与强调可以更自然,降低“机器播报感”
这类任务尤其依赖“音视频同步对齐”,因此统一架构与时序编码的收益会非常显著。
11. 多模态性能:为什么它在语音指令跟随上能接近纯文本精度
语音指令跟随往往比文本更难,原因包括:
- ASR 错误引入不可逆噪声
- 口音、语速、环境声导致语义缺失
- 语音中的指代、停顿、重音携带额外信息,级联系统通常丢失
统一模型的优势在于:
- 不必强制先转文本再理解,可直接在语音特征上做语义建模
- Thinker 的语言能力与音频理解在同一模型内融合,减少中间表示损失
- Talker 可利用高层语义表征提前规划语音输出,使响应更自然、延迟更低
当这些因素叠加时,语音输入的“有效语义可达性”会更接近文本输入,从而使语音指令跟随精度更接近纯文本场景。
12. 总结:Qwen2.5-Omni 的整体方法论脉络
Qwen2.5-Omni 可以视为把三件事做成一个整体:
- 统一多模态理解:文本 + 音频 + 视觉/视频进入同一 Transformer 上下文
- 显式时序对齐:TMRoPE 把多模态 token 放到同一时间轴坐标系里
- 流式语音生成:Thinker 负责理解与文本,Talker 负责实时发声,并共享上下文保持同步
更多推荐



所有评论(0)