OmniHuman-1.5: Instilling an Active Mind in Avatars via Cognitive Simulation

ByteDance Intelligent Creation Lab · Jianwen Jiang et al. · 2025-08-27 · arXiv:2508.19209
关键词: video avatar · MMDiT · MLLM agent · System 1/2 · pseudo last frame · audio-driven animation

速读卡片 (TL;DR)

一句话:把 audio-driven 数字人生成从"音节级 lip-sync + 抖动手势"升级为"先用 MLLM agent 想清楚要做什么动作,再用 MMDiT 渲染",并用 Pseudo Last Frame 一招化解参考图与动态运动之间的固有冲突。

System 1+2
反应式 + 思虑式双系统
3 branches
video / audio / text 对称融合
33% Top-1
用户偏好 vs 5 个开源 baseline

立场:这不是又一个 talking-head DiT。论文的真正贡献是把"高层意图规划"显式从生成模型里剥离出去交给 MLLM,然后通过架构设计避免文本计划被密集音频信号淹没。这两件事单独做都不难,合起来做对才是创新。


1 · 动机:为什么"对得上嘴型"远远不够

1.1 历史脉络:从嘴型同步到全身动画的二十年

Video avatar 这条线大约可以划成三个阶段:

但作者犀利地指出:所有这三代,本质上都只是 System 1。它们学到的是"输入信号(音频频谱、人脸 keypoint) → 输出 token"的反射弧,从来没建模"这个角色在这一秒应该想什么、想做什么"。结果就是:嘴形对得上、节拍卡得准、但动作高度同质化(双手举到胸前小幅摆动 ≈ 99% 的 video 都长这样),没有"contextual coherence"。

1.2 别的方案为什么不够 — 横向比较

方案核心思路它在哪里栽跟头
Wav2Lip / SadTalker音素 → 嘴部 patch只动嘴,身体冻结;无任何语义理解
EMO / Hallo / LoopyU-Net + audio cross-attention反射式动作模板化;长视频走形
OmniHuman-1DiT + 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 不就行了?"——直觉上对,但实际上有三个陷阱:

  1. 模态冲突 (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
  2. Reference image 的 paradox:为了 identity 一致性,所有 baseline 都要给一张人脸参考图作 condition。但这张图通常是从训练 video clip 里采样的,模型很容易学到"reference 图本身的姿态就是输出姿态"——结果输出动作幅度被钉死。从 clip 外采样又会让模型学到"输出应该和 reference 长得不一样",照样 broken。
  3. 规划与渲染之间的接口:MLLM 输出的是文字。一段视频跨 5–10 秒,planner 要把它切成多少个动作?每个动作怎么编码?直接 dump JSON 给 DiT 它能读懂吗?这是个细致的工程问题。

OmniHuman-1.5 的整篇论文其实就是在回答上面这三件事——分别由 MM-Branch + Warm-upPseudo Last FrameAnalyzer/Planner 双 agent对应解决。三件事缺一不可,这也是为什么"加个 MLLM"这种听起来很简单的事,前人没做对。

读法提示:整篇 paper 的真正硬核是 §3.3(架构),§3.2(agent)更多是工程组装。但 §3.2 是论文的"故事",作者用 Kahneman 的 dual-process theory 把整件事包装得很 sexy。读的时候记得拆开看。


2 · 背景速查

术语含义
DiTDiffusion Transformer。把 U-Net 换成 Transformer,视频/图像被 patchify 成 token 序列后 denoise。代表作: Sora / Stable Diffusion 3 / Wan。
MMDiTMultimodal DiT。SD3 引入,把 text 和 image token 拼在同一个 self-attention 里,而不是 cross-attention。本文进一步加入 audio,变成"video + text + audio"三条对称分支。
Flow Matching替代 DDPM 的训练目标。用一条直线 ODE 从噪声映到数据,loss 是 vector field 的 MSE。比 DDPM 更稳、采样步数更少。本文用作训练 loss。
RoPERotary 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-DSyncNet 衍生指标。Sync-C(置信度)越高越好,Sync-D(距离)越低越好。多人场景下沉默的人会拉高 Sync-C 噪声,所以多人用 Sync-D。
HKC / HKVHand Keypoint Confidence / Variance。HKC 衡量手画得清不清楚,HKV 衡量手有没有动。两者要同时高才说明"动作大且稳"。
GSBGood/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 把人的认知分成两套:

作者把这套类比直接搬到 avatar 生成:lip-sync 和节拍同步是 System 1(audio → motion 的反射弧);而"我现在该 angry 还是 calm,该指着 crystal ball 还是该撩头发"是 System 2(需要语义理解和长程规划)。

Reference Image Audio Clip Optional Text System 2 (Agentic Reasoning) Analyzer Planner 输出: shot-level 动作 schedule (persona, emotion, intent, actions) 慢、deliberative、文本中介 System 1 (Reactive Rendering · MMDiT) video branch audio branch text branch joint MM-Attention deliberative plan (text) Video (>1 min)
OmniHuman-1.5 的 Sys1/Sys2 双轨。System 2(蓝色)完全在文本空间里规划,产出一个 shot-level schedule;System 1(橙色)是 MMDiT,把 schedule 当作 text condition,与 audio、reference 一起渲染最终视频。System 2 慢但只算几次,System 1 快但 per-frame 都跑。

4 · Agentic Reasoning: Analyzer + Planner

4.1 双 MLLM 流水线在做什么

Agentic Reasoning 模块用两个 MLLM串联,而不是一个。理由是单个 MLLM 一次推断 persona / intent / shot-level action 这么多东西容易混乱;分开后每个 agent 任务更聚焦。

reference image image caption (aux) audio clip user prompt (opt.) Analyzer MLLM CoT prompt → JSON {persona, emotion, intent, env, content} Planner MLLM + ref image → shot list: [{expr, action, dur}, {expr, action, dur}, …] MMDiT (text branch input) Reflection: 拿最后几帧重新规划下一段
Analyzer 把多模态原始输入压成结构化 JSON;Planner 把 JSON 解码成 shot 序列(每个 shot 长度刚好等于 DiT 一次生成的视频片段)。Reflection 是可选的"拿生成结果回看再调整"loop,用来防长视频走偏。

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"。

video branch audio branch text branch video tokens (T·H·W) audio tokens (T) text tokens (~32) branch SA + FFN branch SA + FFN branch SA + FFN Joint Multimodal Self-Attention 所有模态 token 拼接后一起 attend (peer 关系,无主次) ↓ 此结构每层重复(整 DiT 深度) 关键: audio 与 text 是 sibling,而不是 audio 用 cross-attn 注入到 video 里 → 文本指令不再被密集音频淹没
三模态对称 MMDiT。每层有"分支内 SA"和"跨模态联合 SA"两步;每个模态都能"看到"其它模态的所有 token。Audio token 数量约等于 T(每帧 1 个),text 约 32 个,video 是 T·H·W,但在 joint attention 里所有 token 平等参与 softmax。

5.2 训练难题:即使结构对称,优化也不对称

实操中作者发现:naive 训出来的模型仍然以 audio 为主导(audio 信号每帧都强,梯度大)。为此设计 两阶段 warm-up:

核心 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"的由来。

训练阶段: GT first denoising target (中间帧 — 用 flow matching 训) GT last first/last 都从训练 video 真实首末帧采样,概率性 dropout(也可只给 first、不给 last 等组合) 推理阶段: first (0) 需要生成的视频(120 帧) [gap] REF (远未来) user-provided reference RoPE 位置 = T_far 渲染后丢弃 first 通常拿 reference 的复制 / 上一段最后帧(autoregressive 续生成时)
Pseudo Last Frame 的 train/inference 不对称设计。训练时模型只见过"真实视频的首末帧"作为 condition,从未见过"reference image"这种概念;推理时把用户图丢到"远未来"的位置——模型把它当作"我应该最终走向的样子",但因为距离很远,不会被强制复制到当前帧。

6.3 为什么这招能 work:carrot on a stick

这个比喻是论文原文用的。把 reference 放在真实生成区域之外且 RoPE 距离调远后:

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

从单人扩展到多人,作者只动了两处:

  1. 引入一个speaker mask(每人一张 binary mask,by InterActHuman 的 plug-and-play predictor 预测,可跟随人物移动/被遮挡)。在 MM-attention 里,audio token 只能 attend 到对应说话人 mask 区域内的 video token。等于"audio 只灌进对应的人"。
  2. 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",视频连贯了。

Trade-off:Reflection 增加推理开销(每段都要回跑一次 Planner),所以论文的定量评测里默认关闭 reflection。这是一个用户可选 feature,部署时按 latency 预算决定。

8 · 端到端 worked example

把上面所有零件串起来。假设输入:

步骤 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):

步骤 3: Shot 1 generation。MMDiT 输入:

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.85157.6少了 Analyzer/Planner 分工
w/o Analyzer4.28148.4少了 persona/emotion 抽取
w/o Reasoning(纯 System 1)3.51122.4HKV 暴跌 30% — 动作变僵
w/ Cross-Attention(替换 MM-Attn)3.26116.3对比组里最低 — text 被淹没
w/o MM-Warmup3.99164.1单步训练 → audio 抢戏
w/ Ref. Image(传统参考图)3.98160.9动作受限
w/o Ref. & Pseudo Frame(都不要)4.14161.0identity 飘
Full Model4.09168.9HKV 最高,Sync 接近最佳

读法:HKV(手部动作幅度)是最 telling 的指标——所有"少一个组件"的变体 HKV 都低于 full model。说明每个设计都为"让动作更大、更有语义"做出了实际贡献。Sync-C 在所有 DiT 类方法里都已经接近天花板,所以差异不大,但 ablation (b) 的 LSI(主观 lip-sync 错误率)从 0.21 降到 0.03 才是真的差异。

9.2 主对比

MethodSync-C ↑HKC ↑HKV ↑FVD ↓
Skyreel-A12.980.7928.870.7
FantasyTalking3.550.8418.847.1
OmniAvatar6.590.8056.644.0
MultiTalk6.870.8262.832.8
OmniHuman-17.440.9047.627.0
Ours7.240.8872.127.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
SadTalker3DMM + 渲染固定头像原则上是
EMOSD U-Net + audio cross-attnreference attn有限
Hallo / LoopySD U-Net + temporalreference frame有限
OmniHuman-1DiT + reference attn + audio cross-attnreference image inside clipautoregressive 拼接
MultiTalkDiTreference image是(本身)有限
InterActHumanDiT + speaker maskreference有限
纯 video DiT (Sora 类)DiT无(text-only)
OmniHuman-1.5MMDiT 三分支双 MLLM agent + reflectionPseudo Last Frame是 (mask 扩展)是 (reflection)

差异最大的是语义规划列——这是同类工作普遍缺的。OmniHuman-1.5 是第一个把 MLLM-based planning 显式塞进 audio-driven avatar 流水线、并把"不被 audio 信号淹没"作为架构设计目标的工作。


11 · 局限 / 个人 take / 待验证问题

待验证问题:

  1. 把 Pseudo Last Frame 移植到 OmniHuman-1 里(不动其它部分),HKV 能涨多少?这能隔离这一招的实际贡献。
  2. Reasoning Latent 方案在"小动作高表情"场景(portrait)下是否反而更好?论文有此暗示但没量化。
  3. Reflection 频率(每段都 reflect vs 每 5 段 reflect)对 quality 和 latency 的 trade-off 曲线长什么样?
  4. 三模态 joint attention 的 sequence 长度 ~144k,FlashAttention/sparse-attn 实现细节论文没说,真实训练吞吐和 H100 利用率是多少?
  5. 多人 mask 是 hard mask 还是 soft mask?occlusion 场景下 audio 是否会"漏"到旁观者身上?
  6. Audio dropout(70% 数据无对齐音频)的具体 dropout schedule 与 baseline OmniHuman-1 一致吗?这影响 lip-sync 学习强度。

12 · 记忆点 (Memory Points)

立场 把生成模型从 System 1 升级成 System 1+2:用 MLLM 在文本空间做意图规划,DiT 只负责执行。这是 audio-driven avatar 第一次显式建模"思考"。
核心 trick Pseudo Last Frame:训练用 video 自身首末帧,推理把 user reference 摆到"远未来"的 RoPE 位置 — 模型把 reference 当 attractor 而不是 copy template,既保 identity 又放开运动幅度。
架构 三模态对称 MMDiT(video / audio / text 同等地位 + 共享 self-attn)+ 两阶段 warm-up — 让 text 不被密集 audio 信号淹没。
Agent 流水线 Analyzer (CoT, 输出 JSON) → Planner (输出 shot list),可选 Reflection 防长视频走偏。
关键 number HKV 168.9(full)vs 122.4(no reasoning),动作幅度暴涨 38%;LSI 从 0.21 降到 0.03,lip-sync 主观错误率降 7×;用户 Top-1 选择 33%,领先所有 baseline 11+ 点。
核心限制 portrait 小动作场景优势不显著;Reflection 推理慢不实时;MLLM 选型 + prompt 细节论文未公开。
为什么非平凡 "加 MLLM 做规划"听起来 trivial,实际同时遭遇三个 trap:(1) modality conflict,(2) reference image paradox,(3) plan→video 接口设计。论文逐一对应解决。