OmniHuman-1.5: Instilling an Active Mind in Avatars via Cognitive Simulation
速读卡片 (TL;DR)
一句话:把 audio-driven 数字人生成从"音节级 lip-sync + 抖动手势"升级为"先用 MLLM agent 想清楚要做什么动作,再用 MMDiT 渲染",并用 Pseudo Last Frame 一招化解参考图与动态运动之间的固有冲突。
立场:这不是又一个 talking-head DiT。论文的真正贡献是把"高层意图规划"显式从生成模型里剥离出去交给 MLLM,然后通过架构设计避免文本计划被密集音频信号淹没。这两件事单独做都不难,合起来做对才是创新。
1 · 动机:为什么"对得上嘴型"远远不够
1.1 历史脉络:从嘴型同步到全身动画的二十年
Video avatar 这条线大约可以划成三个阶段:
- 2017–2022 唇动合成时代(Wav2Lip / SadTalker 等):核心问题是"音素 → 嘴型"的映射,通常 freeze 一张人脸,把嘴部 region 重画。技术上属于 image translation。
- 2023 portrait animation 时代(EMO / Hallo / Loopy):基于 Stable Diffusion U-Net 加 temporal module,把"动"扩展到整张脸甚至上半身。但这一代仍是音频特征 → motion的直映射。
- 2024–2025 DiT 全身时代(OmniHuman-1, MultiTalk, OmniAvatar, FantasyTalking):背骨升级到 video Diffusion Transformer,参数量与训练数据双双爆炸,可生成全身、多种 aspect ratio、多分钟。
但作者犀利地指出:所有这三代,本质上都只是 System 1。它们学到的是"输入信号(音频频谱、人脸 keypoint) → 输出 token"的反射弧,从来没建模"这个角色在这一秒应该想什么、想做什么"。结果就是:嘴形对得上、节拍卡得准、但动作高度同质化(双手举到胸前小幅摆动 ≈ 99% 的 video 都长这样),没有"contextual coherence"。
1.2 别的方案为什么不够 — 横向比较
| 方案 | 核心思路 | 它在哪里栽跟头 |
|---|---|---|
| Wav2Lip / SadTalker | 音素 → 嘴部 patch | 只动嘴,身体冻结;无任何语义理解 |
| EMO / Hallo / Loopy | U-Net + audio cross-attention | 反射式动作模板化;长视频走形 |
| OmniHuman-1 | DiT + reference attention + 多条件 dropout | 动作幅度大但语义浅,"说到 crystal ball 时 crystal ball 不会发光" |
| 纯 video DiT (Sora / Wan) | text-to-video | 没有 lip-sync、没有 identity preservation |
| Pose-driven (Animate Anyone) | 显式 skeleton 条件 | 需要驱动姿态序列;不能从 audio 推断动作 |
关键观察:所有 audio-driven 方法都把 motion generation 当成 deterministic mapping,没有人在 audio → motion 之间插入"思考"这一步。这就好比让人完全凭反射说话:你可以发出准确音节,但说不出有意义的肢体语言。
1.3 为什么 MLLM-as-planner 是非平凡的
"那就插一个 MLLM 进去做 planner 不就行了?"——直觉上对,但实际上有三个陷阱:
- 模态冲突 (modality conflict):audio token 在时间维上极其密集(50–100 Hz),text token 是稀疏 high-level 描述。如果直接把 text condition 和 audio condition 一起塞进同一个 cross-attention,模型会发现"听 audio 就够了" → text 信号被冲淡到几乎不起作用。这是 multi-modal generative model 里 well-known 的shortcut learning。
- Reference image 的 paradox:为了 identity 一致性,所有 baseline 都要给一张人脸参考图作 condition。但这张图通常是从训练 video clip 里采样的,模型很容易学到"reference 图本身的姿态就是输出姿态"——结果输出动作幅度被钉死。从 clip 外采样又会让模型学到"输出应该和 reference 长得不一样",照样 broken。
- 规划与渲染之间的接口:MLLM 输出的是文字。一段视频跨 5–10 秒,planner 要把它切成多少个动作?每个动作怎么编码?直接 dump JSON 给 DiT 它能读懂吗?这是个细致的工程问题。
OmniHuman-1.5 的整篇论文其实就是在回答上面这三件事——分别由 MM-Branch + Warm-up、Pseudo Last Frame、Analyzer/Planner 双 agent对应解决。三件事缺一不可,这也是为什么"加个 MLLM"这种听起来很简单的事,前人没做对。
2 · 背景速查
| 术语 | 含义 |
|---|---|
| DiT | Diffusion Transformer。把 U-Net 换成 Transformer,视频/图像被 patchify 成 token 序列后 denoise。代表作: Sora / Stable Diffusion 3 / Wan。 |
| MMDiT | Multimodal DiT。SD3 引入,把 text 和 image token 拼在同一个 self-attention 里,而不是 cross-attention。本文进一步加入 audio,变成"video + text + audio"三条对称分支。 |
| Flow Matching | 替代 DDPM 的训练目标。用一条直线 ODE 从噪声映到数据,loss 是 vector field 的 MSE。比 DDPM 更稳、采样步数更少。本文用作训练 loss。 |
| RoPE | Rotary Positional Embedding。把位置信息以旋转矩阵形式注入 Q/K。Pseudo Last Frame 利用 RoPE 的可平移性,把参考图"放在远未来"。 |
| 3D VAE | 把视频 (T, H, W, 3) 压缩到 latent (T/4, H/8, W/8, C),DiT 在 latent 空间训。 |
| Sync-C / Sync-D | SyncNet 衍生指标。Sync-C(置信度)越高越好,Sync-D(距离)越低越好。多人场景下沉默的人会拉高 Sync-C 噪声,所以多人用 Sync-D。 |
| HKC / HKV | Hand Keypoint Confidence / Variance。HKC 衡量手画得清不清楚,HKV 衡量手有没有动。两者要同时高才说明"动作大且稳"。 |
| GSB | Good/Same/Bad。pairwise 用户研究里 (Wins − Loses) / (Wins + Loses + Ties)。范围 [−1, +1]。 |
| Chain-of-Thought (CoT) | 让 LLM 把推理过程写出来。本文用作 Analyzer 的 prompt 模板。 |
3 · 总体框架:System 1 / System 2 双轨
Kahneman 的 Thinking, Fast and Slow 把人的认知分成两套:
- System 1:快、自动、反射性。看到红灯踩刹车、听到自己名字回头。
- System 2:慢、需要意识努力、用于规划/推理。算 17×24、计划下周行程。
作者把这套类比直接搬到 avatar 生成:lip-sync 和节拍同步是 System 1(audio → motion 的反射弧);而"我现在该 angry 还是 calm,该指着 crystal ball 还是该撩头发"是 System 2(需要语义理解和长程规划)。
4 · Agentic Reasoning: Analyzer + Planner
4.1 双 MLLM 流水线在做什么
Agentic Reasoning 模块用两个 MLLM串联,而不是一个。理由是单个 MLLM 一次推断 persona / intent / shot-level action 这么多东西容易混乱;分开后每个 agent 任务更聚焦。
- Analyzer:输入 = reference image + image caption(辅助模型生成,弥补 MLLM 看图能力不足)+ audio clip + optional 用户 prompt。输出 = 一个 JSON 结构,字段包括 persona, language style, speech content, emotion, intent, environmental context。这一步是"理解场景"。
- Planner:输入 = Analyzer 的 JSON + 原始角色图。输出 = 一个 shot 序列,每个 shot 对应 DiT 一次生成 pass(论文里是 120 帧 / 5 秒),内容是"该 shot 的表情 + 动作描述"。这一步是"把场景翻译成可执行的拍摄脚本"。
4.2 为什么用文本而不是 latent
论文也实验了 Reasoning Latent 方案:从 Analyzer 最后一层抽 audio token 的 hidden state,直接 concat 到 raw audio feature 后送给 DiT。结果是"表情更细腻、动作更小"——也就是 latent 方案带来更多 fine-grained,但反而抑制了大动作。考虑到大动作恰恰是这篇论文要解决的核心问题(以前 baseline 都太静),作者最终选 Reasoning Text 方案,latent 当成 ablation 备份。
4.3 Worked example: Analyzer/Planner 输出长什么样
论文没给 prompt 模板原文,但根据 §3.2 描述可以重建一个典型场景:
// 输入: 一个戴礼帽的魔法师角色图 + 一段念咒语的男声音频(8 秒)
// Analyzer 的 JSON 输出(示意)
{
"persona": "elderly wizard, theatrical, mysterious",
"language_style": "incantatory English with archaic vocabulary",
"speech_content": "summoning a vision in the crystal ball",
"emotion": "focused, slightly menacing",
"intent": "casting a divination spell",
"environment": "dim chamber with a crystal ball on the table"
}
// Planner 把它解码成 shot 序列(每 shot ≈ 5 秒 / 120 frames @ 24 fps)
[
{"shot": 1, "expression": "narrowed eyes, slight grin",
"action": "raises both hands above the crystal ball, fingers spread",
"duration_frames": 120},
{"shot": 2, "expression": "concentrated, mouth chanting",
"action": "leans forward, crystal ball begins to glow",
"duration_frames": 120}
]
这段 shot list 的纯文本会被喂给 MMDiT 的 text branch(经过 T5 / CLIP 编码,具体 paper 没说但是 standard practice),作为每 shot 的 text condition。注意:audio 全段 + 当前 shot 的 text → 当前 shot 的 video,这是 per-shot 的 conditioning。
反向论证:如果不分两个 MLLM 会怎样?
把 persona 推断、shot 规划塞给同一个 prompt,会出现两类问题:(1) MLLM 在长 prompt 下容易丢字段,JSON schema 不稳定;(2) shot 数量取决于音频长度,模型一次性输出 N 个 shot 时容易 N 写错或重复。分两步后,Analyzer 输出固定 schema,Planner 拿到的是已规整化的 input,生成 shot list 的可靠性显著提升。
5 · Multimodal Branches: 三模态对称 + Warm-up
5.1 为什么不能用 cross-attention
Baseline(包括 OmniHuman-1)的做法:在 DiT 主干上加 cross-attention,K/V 来自 audio feature。问题:audio feature 是每帧一个 token(或者更密集),而 text 是稀疏的全局描述,两者直接竞争 query attention 时,密集信号天然占优,text 几乎被忽略。
本文方案:抛弃 audio cross-attention,改成对称三分支。video / audio / text 各有一条独立的 transformer 路径,但每层结束后,三路的 token 拼在一起做共享 multi-head self-attention。这样 text token 和 audio token 是 peer 关系,不再是"text 当 query 去问 audio"。
5.2 训练难题:即使结构对称,优化也不对称
实操中作者发现:naive 训出来的模型仍然以 audio 为主导(audio 信号每帧都强,梯度大)。为此设计 两阶段 warm-up:
- Stage 1 (audio 分支冷启动):全部三个分支 joint train,目的不是出最终模型,而是逼模型在 video/text 已经训好的情况下,把分工学清楚——audio 分支负责 lip-sync 和 speech mannerism,video/text 负责高层语义。这一阶段持续 ~3 天。
- Stage 2 (主训练):从头初始化:video/text 分支用原始预训练权重(没被 audio 污染),audio 分支用 Stage 1 学到的权重。然后整体 fine-tune 7 天 + 1 天高质量数据。
核心 insight:Stage 1 不是为了输出好模型,而是为了得到一个"专精 audio 而不会去抢 video/text 工作"的 audio 分支初始化。这是个非常细致的训练学问题。
5.3 Worked example: tensor 形状
视频: 120 帧 × 480p (短边), 24 fps 经 3D VAE 压缩 → latent 形状 ≈ (30, 60, 80, C),约 144,000 video token audio: 8 秒 ≈ 200 audio token (按 25Hz 取) text: shot 描述经 encoder → ~32 token Joint attention 序列长度 ≈ 144000 + 200 + 32 ≈ 144,232 注意 audio + text 占比 < 0.2% → 朴素 cross-attn 必然被 video 主导 对称 self-attn 下,audio/text token 仍能 attend 全部 video,反向 video 也 attend 它们 → 信号双向流动,而不是单向"video 拿 audio 当 K/V"
6 · Pseudo Last Frame: 化解参考图困境
6.1 问题:reference image 是个"伪造的 condition"
论文最锐利的一句话:The reference image is an artificial construct, not a condition native to the video data itself.
传统做法是从训练 clip 内随机抽一帧当 reference,然后让模型学 "given reference + audio → reconstruct clip"。模型很容易作弊:既然 reference 来自这个 clip 内,直接把 reference 的姿态复制到输出就可以。结果训出来的模型在推理时动作幅度极小——它学到的是"输出 ≈ reference"。
partial fix:从 clip 外抽 reference image。但这又走向另一个极端——模型会学到"输出应该跟 reference 不太一样",于是身份保不住。两边都不对,这是 reference conditioning 的 dilemma。
6.2 解法:训练用 first/last frame,推理把 reference 摆成 pseudo last frame
作者的策略是训练时根本不用 reference image。改用什么?用视频片段自身的 GT 第一帧和最后一帧,概率性地拼到生成区域之前和之后。这两个都是"video data 内生的、合法的 condition"——它们就是同一段视频的真实首尾。
推理时,用户给的 reference image 被放在"last frame"位置,但故意把它的 RoPE 位置编码平移到很远的未来(比如真实生成长度之外),然后渲染完成后丢弃这一帧。这就是名字"Pseudo Last Frame"的由来。
6.3 为什么这招能 work:carrot on a stick
这个比喻是论文原文用的。把 reference 放在真实生成区域之外且 RoPE 距离调远后:
- 模型仍然能从 reference 推断出 identity(face shape、肤色、衣着风格);
- 但它不被强制要求 verbatim 复制 reference 的姿态,因为按 RoPE 来说 reference 离当前帧"很远",模型有空间允许中间产生剧烈运动;
- 训练时这个 slot 装的是 GT last frame(真实视频最后一帧),所以模型学到的是"我得朝着这个目标 frame 自然演化过去"——一种 long-range identity attractor,而不是 short-range copy。
6.4 Worked example: 数字
训练 clip 长 5 秒(120 帧),latent T = 30。
训练时:first slot at T=0, last slot at T=29,denoise T=1..28
推理时:first slot at T=0(可以拷贝 reference,或来自上段视频的最后帧)
ref slot at T=44 (远超过 30) ← Pseudo Last Frame
denoise T=1..29 → 最终输出 T=0..29 共 30 latent → 120 帧
渲染完成后丢弃 T=44 的 ref slot
论文 Table 1/2 (b) 的 ablation 显示:用 reference image 做 condition 的版本 (LSI 0.21, MU 0.39, ID 0.17) 全面输给 Pseudo Last Frame 版本 (LSI 0.03, MU 0.25, ID 0.07)。Lip-sync 误差直接降 7 倍,是 ablation 里最 dramatic 的一项。
7 · 多人扩展 + Reflective Re-planning
7.1 多人:speaker-specific mask
从单人扩展到多人,作者只动了两处:
- 引入一个speaker mask(每人一张 binary mask,by InterActHuman 的 plug-and-play predictor 预测,可跟随人物移动/被遮挡)。在 MM-attention 里,audio token 只能 attend 到对应说话人 mask 区域内的 video token。等于"audio 只灌进对应的人"。
- Planner 也接收这个 mask,负责告诉 schedule 里"现在哪个人在说话、哪个人在听"。其余 reasoning 流水线一字不变。
结果(Table 3):多人场景下 OmniHuman-1.5 的 Driving Accuracy 0.94(说话/沉默状态正确率),vs InterActHuman baseline 显著领先,Sync-D 也降到 6.9。这说明 agentic reasoning 是真的让模型"知道现在该说话/该听"。
7.2 长视频:Reflective Re-planning
autoregressive 生成长视频(>1 分钟)时,误差累积是经典问题——某个 shot 道具拿错了,接下来全乱。Reflection 的做法:每生成一个 segment,Planner 拿到这段视频的最后几帧 + 原 reference 重新评估,改写后续 schedule。
论文 Figure 6 给的例子:第一 shot "拿出信件",原计划下一动作是 "Rubs the surface"(摩擦表面),没 reflection 时模型生成的画面里信件凭空消失。开 reflection 后,Planner 看到"哎,人物现在拿着信",把后续动作改成 "Reads the letter",视频连贯了。
8 · 端到端 worked example
把上面所有零件串起来。假设输入:
- Image: 一位戴尖顶帽的女巫坐在桌前,桌上有水晶球(720×1280 PNG)
- Audio: 8 秒,内容 "I summon the visions of the future, show me the path"(英语,语调 incantatory)
- Text prompt(可选):"the wizard casts a divination spell"
步骤 1: Analyzer。aux model 先生成 image caption "an elderly female wizard at a wooden table with a crystal ball, candlelit room"。Analyzer 收到 image + caption + audio + user prompt,输出 JSON 描述 persona/emotion/intent/environment 等(参考 §4.3 例子)。
步骤 2: Planner。读 JSON + 原图,产出 2 个 shot(因为 audio 8 秒 ÷ 5 秒/shot ≈ 2):
- shot 1 (frame 0–119): expression "narrowed eyes, focused", action "raises both hands above the crystal ball"
- shot 2 (frame 120–239): expression "concentrated", action "leans forward, the crystal ball begins to glow"
步骤 3: Shot 1 generation。MMDiT 输入:
- video latent 噪声(30, 60, 80, C)
- audio feature: 整段 8 秒 audio 的前 5 秒,~125 token
- text token: shot 1 的 expression+action 描述,~32 token
- pseudo last frame: 原 reference image 放在 RoPE T=44 位置
- first frame: reference 复制到 T=0(因为是第一个 shot,没有"上一段")
Flow Matching denoise → 30 个 latent step → 3D VAE decode → 120 帧 480p,然后 SR 升到 720p/1080p。
步骤 4: Shot 2 generation(autoregressive 续上)。区别:first frame 不再是 reference,而是 shot 1 输出的最后一帧(保证连续性);audio 切到 5–8 秒段;text 切到 shot 2 描述;pseudo last frame 仍是原 reference。
步骤 5(可选): Reflection。shot 1 完成后,Planner 拿 shot 1 末尾 16 帧重新评估。如果发现 "raises both hands" 实际生成的是 "puts hand on crystal ball"(执行偏离),它会改写 shot 2 的 action 让 narrative 连贯。
步骤 6: Render Output。两个 shot 拼接,Pseudo Last Frame 槽位的图被 discard,最终输出 240 帧 ≈ 10 秒 1080p 视频。lip 跟 audio 一对一对齐,手部动作语义对应"召唤动作",水晶球在 shot 2 末尾确实开始亮光(因为 text 里说"glowing crystal ball")——这正是 baseline (OmniHuman-1) 经常做不到的语义视觉对齐。
9 · 实验关键结果
9.1 Ablation: 每个组件都不能少
| 变体 | Sync-C ↑ | HKV ↑ | 读法 |
|---|---|---|---|
| w/o multi-step reasoning(单 MLLM) | 3.85 | 157.6 | 少了 Analyzer/Planner 分工 |
| w/o Analyzer | 4.28 | 148.4 | 少了 persona/emotion 抽取 |
| w/o Reasoning(纯 System 1) | 3.51 | 122.4 | HKV 暴跌 30% — 动作变僵 |
| w/ Cross-Attention(替换 MM-Attn) | 3.26 | 116.3 | 对比组里最低 — text 被淹没 |
| w/o MM-Warmup | 3.99 | 164.1 | 单步训练 → audio 抢戏 |
| w/ Ref. Image(传统参考图) | 3.98 | 160.9 | 动作受限 |
| w/o Ref. & Pseudo Frame(都不要) | 4.14 | 161.0 | identity 飘 |
| Full Model | 4.09 | 168.9 | HKV 最高,Sync 接近最佳 |
读法:HKV(手部动作幅度)是最 telling 的指标——所有"少一个组件"的变体 HKV 都低于 full model。说明每个设计都为"让动作更大、更有语义"做出了实际贡献。Sync-C 在所有 DiT 类方法里都已经接近天花板,所以差异不大,但 ablation (b) 的 LSI(主观 lip-sync 错误率)从 0.21 降到 0.03 才是真的差异。
9.2 主对比
| Method | Sync-C ↑ | HKC ↑ | HKV ↑ | FVD ↓ |
|---|---|---|---|---|
| Skyreel-A1 | 2.98 | 0.79 | 28.8 | 70.7 |
| FantasyTalking | 3.55 | 0.84 | 18.8 | 47.1 |
| OmniAvatar | 6.59 | 0.80 | 56.6 | 44.0 |
| MultiTalk | 6.87 | 0.82 | 62.8 | 32.8 |
| OmniHuman-1 | 7.44 | 0.90 | 47.6 | 27.0 |
| Ours | 7.24 | 0.88 | 72.1 | 27.6 |
关键:OmniHuman-1.5 没有横扫所有指标。Sync-C/FVD/HKC 略低于 OmniHuman-1。但 HKV 高出 50%——这是"动作够不够大"的指标。配合用户研究里 33% Top-1(vs OmniHuman-1 的 22%),说明用户在看的是动作的丰富性和语义对齐,objective metrics 没完全 cover 这个维度。
9.3 一个反直觉的现象
portrait CelebV-HQ 测试集上,Ours 和 OmniHuman-1 几乎打平(IQA 3.82 vs 3.88,Sync 5.05 vs 5.20)。原因:portrait 视频本来就只能动脸,"思考性 System 2"没什么发挥空间。论文也坦承:这套方法的优势在 full-body 场景才显现。
10 · 与同类工作对比
| 系统 | 主干 | 语义规划 | identity 策略 | 能否多人 | 能否 >1 min |
|---|---|---|---|---|---|
| SadTalker | 3DMM + 渲染 | 无 | 固定头像 | 否 | 原则上是 |
| EMO | SD U-Net + audio cross-attn | 无 | reference attn | 否 | 有限 |
| Hallo / Loopy | SD U-Net + temporal | 无 | reference frame | 否 | 有限 |
| OmniHuman-1 | DiT + reference attn + audio cross-attn | 无 | reference image inside clip | 否 | autoregressive 拼接 |
| MultiTalk | DiT | 无 | reference image | 是(本身) | 有限 |
| InterActHuman | DiT + speaker mask | 无 | reference | 是 | 有限 |
| 纯 video DiT (Sora 类) | DiT | 无(text-only) | 无 | 是 | 是 |
| OmniHuman-1.5 | MMDiT 三分支 | 双 MLLM agent + reflection | Pseudo Last Frame | 是 (mask 扩展) | 是 (reflection) |
差异最大的是语义规划列——这是同类工作普遍缺的。OmniHuman-1.5 是第一个把 MLLM-based planning 显式塞进 audio-driven avatar 流水线、并把"不被 audio 信号淹没"作为架构设计目标的工作。
11 · 局限 / 个人 take / 待验证问题
- 局限 Reflection 推理慢,不能实时;论文默认评测时关闭。对实时数字人(直播、客服)而言,System 2 的延迟是硬伤。
- 局限 Analyzer/Planner 用了什么 MLLM、参数量多大、prompt 模板细节,论文都没给。不利于复现。
- 局限 portrait 场景下没显著优势,System 2 在小动作场景下投入产出比低。
- 个人 take Pseudo Last Frame 是这篇论文里最值得借鉴的 trick——它揭示了"reference image 是个伪 condition"这个被同行集体忽略的事实,并给出 RoPE-based 的优雅解决。这一招很可能被后续 video DiT 直接抄走。
- 个人 take Sys1/Sys2 框架虽然 marketing 性强,但底层其实就是"高层 text plan + 低层 audio condition"。不需要被这个 framing 唬住,可以直接评估每一块的工程价值。
- 个人 take MM-Warmup 的两阶段训练设计巧妙但脆弱——它实质是用一个被允许"过拟合到 audio"的废弃模型,去给主模型的 audio 分支一个好初始化。如果有人想 reproduce,warmup 时长、数据子集、loss weighting 都可能影响结果。
待验证问题:
- 把 Pseudo Last Frame 移植到 OmniHuman-1 里(不动其它部分),HKV 能涨多少?这能隔离这一招的实际贡献。
- Reasoning Latent 方案在"小动作高表情"场景(portrait)下是否反而更好?论文有此暗示但没量化。
- Reflection 频率(每段都 reflect vs 每 5 段 reflect)对 quality 和 latency 的 trade-off 曲线长什么样?
- 三模态 joint attention 的 sequence 长度 ~144k,FlashAttention/sparse-attn 实现细节论文没说,真实训练吞吐和 H100 利用率是多少?
- 多人 mask 是 hard mask 还是 soft mask?occlusion 场景下 audio 是否会"漏"到旁观者身上?
- Audio dropout(70% 数据无对齐音频)的具体 dropout schedule 与 baseline OmniHuman-1 一致吗?这影响 lip-sync 学习强度。