根据论文内容,让我详细解释视频和音频是如何输入模型并转换为 token 的:
展开代码原始视频 → 视觉帧提取 + 音频提取 → 分别编码 → 时间对齐 → 输入 LLM
视觉编码器:
帧采样策略:
处理过程:
展开代码视频帧 → Vision Encoder → 视觉 token 序列
与独立音频输入的处理方式相同(见下文)
这是关键创新!论文提出了 Time-aligned Multimodal Rotary Position Embedding (TM-RoPE):
TM-RoPE 的三维分解:
对于视频的具体应用:
python展开代码# 伪代码示例
for 视频中的每一帧:
temporal_id = 帧的实际时间戳 / 80ms # 每 80ms 一个时间 ID
height_ids = 帧内各像素的行位置
width_ids = 帧内各像素的列位置
position_embedding = TM_RoPE(temporal_id, height_ids, width_ids)
关键点:
与 Qwen2.5-Omni 的区别:
展开代码原始音频 → 重采样 → Mel频谱图 → AuT编码器 → 音频token序列
python展开代码# 伪代码
原始音频 → 重采样到 16kHz
↓
转换为 128 通道 Mel 频谱图
- 窗口大小: 25ms
- 跳跃步长: 10ms
架构: Attention-Encoder-Decoder 自回归模型
降采样:
展开代码Mel频谱图 → Conv2D 模块(8倍降采样) → 12.5Hz token 率
计算:
python展开代码# 支持实时预填充缓存
attention_window_sizes = [1秒, 2秒, ..., 8秒]
# 平衡实时性能和离线任务效果
展开代码[文本tokens] + [音频tokens] + [视觉tokens] → 连续的位置编码
位置编码的连续性:
python展开代码# 防止多模态位置冲突
当前模态起始位置 = 前一模态最大位置ID + 1
示例:
文本: position_ids [0, 1, 2, ..., 100]
音频: position_ids [101, 102, ..., 200]
视觉: position_ids [201, 202, ..., 300]
| 模态 | Temporal ID | Height ID | Width ID |
|---|---|---|---|
| 文本 | 共享 | 共享 | 共享 (等效1D RoPE) |
| 音频 | 每80ms递增 | 共享 | 共享 |
| 图像 | 常量 | 行位置 | 列位置 |
| 视频 | 每80ms递增 | 行位置 | 列位置 |
展开代码1秒音频: - 采样率: 16kHz - Mel特征: 10ms hop → 100帧/秒 - 8倍降采样 → 12.5帧/秒 - 结果: 1秒音频 ≈ 12-13个tokens 40分钟音频: - 40 × 60 × 12.5 = 30,000 tokens
展开代码假设视频: - 分辨率: 224×224 - 帧率: 动态采样(与音频对齐) - Vision Encoder输出: 每帧约256-512 tokens 1分钟视频(含音频): - 音频: 60 × 12.5 = 750 tokens - 视觉: 帧数 × 每帧tokens (取决于采样率)
这种设计使得模型能够自然地处理音视频的时序对应关系,为后续的跨模态推理提供了坚实的基础。


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!