Starchild-1:

把双向音视频扩散教成 24fps 流式世界模型

1. 出发点 (Motivation)

过去一年, 视频生成有三条平行的发展线: 双向 → 因果视频 → 音视频联合离线 → 交互。每条线都有代表作:

但这三条线 从未在一个模型里同时打通。已有的音视频联合模型都是双向、离线、固定时长的 (Veo 3、Ovi 都生成 5-10 秒固定 clip); 已有的交互世界模型都是纯视觉的 (Genie-3 没声音, GameCrafter 没音频对齐)。Starchild-1 的赌注是: 把三条线同时打通的工程难度, 不在架构, 而在训练管线本身。

具体说, 把双向音视频扩散变成因果交互模型, 会撞到三个新问题, 每一个都不是 video-only 工作能直接抄过来的:

  1. 多模态优化失衡。 视频是高维空间+时间信号, 音频是低维密集时序信号; 标准 DMD 蒸馏会让训练偏向视觉, 音频质量退化。
  2. 跨模态错误传播。 自回归 rollout 里, 任何一边 (视频抖动或音频漂移) 都会通过 cross-attention 喂回另一边, 形成正反馈, 把音画同步打散。这在 video-only 因果模型里不存在。
  3. 条件粒度不匹配。 视频天然有 "下一帧可预测性" 的强空间锚点 (场景大致不变); 音频如果取音素 (phoneme) 粒度, 下一个音素几乎独立于前一个, 让因果预测变得 ill-conditioned。

Starchild-1 的贡献清单(用我的话):

  1. 一套 音频感知的因果蒸馏管线: DMD 阶段拉高 audio params 学习率 + fake-critic 学习率, 平衡双模态优化。
  2. 一个 非对称音视频 KV-cache 设计: video 保留 sink tokens, audio 不保留; cross-attention 的 KV 也跨模态缓存。
  3. 一个 "提示词转换不重置 cache" 的发现: 与之前因果视频工作的常规操作相反, 这里强行 reset 反而会通过 cross-attention 让音视频协同 drift。
  4. 一个 外部编排层 (Campaign generator): 用一个 LLM 把用户输入翻译成 chunk-aligned 的 action 序列, 解决 "用户随便打字 → 模型每 2.5s 要消化一段语音/场景描述" 的工程衔接。
  5. 对 "在交互场景里, 哪些指标其实没意义" 的批判性反思: VBench / LSE / ImageBind 都是为离线 clip 设计的, 跑不出 30s 交互式 rollout 的真实能力。

注意: 这是一篇 技术报告而非学术论文。没有完整 ablation, 唯一的定量表只跟自家 base model Ovi 比, 全部交互能力都是 qualitative example。读的时候要把它当工程经验贴而非 method paper — 实操细节非常密, 但"为什么 work"基本停留在 "we hypothesize" / "we observe" 层面。

三阶段训练管线: 双向少步蒸馏 → 块因果适配 → KV-cache 自回滚
Fig. 1 — Starchild-1 训练管线 (paper Fig. 1)。左: 把 50 步双向教师 (Ovi) 蒸馏成少步双向学生, 强调音频和 real-critic 的更新。中: 通过 ODE 轨迹监督把双向学生转成块因果学生 (sample → MSE)。右: 在 KV-cache 自回滚下做最后阶段适配, 加入时间对齐的多模态缓存。注意中间阶段没有 fake critic (只有 ODE trajectory + MSE), 右阶段又把 fake critic 加回来 — 这是为什么 paper 多次强调 "real critic 的优势" 才是真正的训练信号。

2. 方法 (Method)

核心思想 (类比)

想象一个交响乐团:

把录音棚乐团教成现场即兴乐团, 最难的不是给乐手换乐器 (架构改造), 而是改训练方式: 整段 → 一段段, 全局 → 局部, 离线 → 流式。Starchild-1 三个阶段在做的事:

  1. 少步蒸馏: 让原来要排练 50 遍的乐团, 4 遍就能录好一段 (DMD)。但发现弦乐组 (audio) 老是被铜管组 (video) 盖过, 所以拉高了弦乐的练习强度。
  2. 因果适配: 把"整段录完再听"改成"一段一段录, 每段只能听前面录的"。用原乐团 (双向教师) 同步排练的录音当参考 (ODE 轨迹), 让现场乐团模仿。
  3. KV-cache 自回滚: 真上场了, 让乐团自己演自己评 (self-rollout) — 记住前面演过的 (KV-cache), 但 video 部分多留几个"基准音"(sink token) 防止跑调, audio 部分不留 (留了反而僵硬)。

关键洞察: 音画错误是会互相传染的。 现场即兴时, 弦乐走音 → 通过指挥的耳朵 (cross-attention) 影响铜管 → 铜管乱了又传回弦乐 → 整个崩盘。所以"防止任一边崩"比"把任一边做到极致"更重要 — 这也是为什么 paper 说"视觉感知质量更高的 ODE 轨迹反而蒸馏不出更稳的 rollout"。

2.1 问题形式化

把"下一状态预测"从纯视觉扩展到联合音视频。在时刻 \(t\), 状态是

其中 \(v_t\) 是视觉 latent frames 的一个 chunk, \(\omega_t\) 是音频 latent frames 的一个 chunk。注意两个 chunk 的"长度"是不同的: 因为采样率不同, 视频 chunk 用 15 latent frames, 音频 chunk 用 75 latent frames, 但它们覆盖 同样的物理时间 (≈2.5s @ 24fps)。

action \(a_t\) 是统一的 text 表示, 覆盖视觉控制信号 / 语音内容 / 环境音 / 音乐描述 (用类似 <S>...</S><AUDCAP>...</ENDAUDCAP> 这种 tag 切分)。world model 是:

—— 翻译: 给定上一个 action, 初始视觉状态 \(v_0\) (整个 rollout 的"起点帧"), 以及过去 \(L\) 个 chunk 的历史 \(O_{t-1} = \{o_i\}_{i=t-L}^{t-1}\), 预测下一个 chunk 的 (视觉 latent, 音频 latent)。\(L\) 是上下文窗口长度。

实际实现里, "history \(O_{t-1}\)" 不是把过去 chunk 重新喂一遍, 而是以 KV-cache 的形式存在: 视频自注意力 KV-cache + 视频跨注意力 KV-cache + 音频自注意力 KV-cache + 音频跨注意力 KV-cache, 一共四组 cache。这是为什么 paper 反复强调 "cache 设计" 是核心 — 因为它就是 world state 的实际载体。

2.2 基础: Ovi 双塔架构

Starchild-1 的 base model 是 Ovi (Low et al. 2025), 一个 对称双塔扩散 transformer: 音频塔和视频塔各一个 WanModel 实例 (Wan2.2 video DiT 改的), 每一层之间通过 双向 cross-attention 连接。Cross-attention 还专门为 fusion 注入了独立的 K/V projection。

repo/ovi/modules/fusion.py:L9-L53 — FusionModel 构造: 两个 WanModel 实例 + 每个 block 注入 fusion 用的 K/V projection

class FusionModel(nn.Module):
    def __init__(self, video_config=None, audio_config=None):
        super().__init__()
        if video_config is not None:
            self.video_model = WanModel(**video_config)
        if audio_config is not None:
            self.audio_model = WanModel(**audio_config)

        if has_video and has_audio:
            assert len(self.video_model.blocks) == len(self.audio_model.blocks)
            self.num_blocks = len(self.video_model.blocks)
            self.inject_cross_attention_kv_projections()

    def inject_cross_attention_kv_projections(self):
        for vid_block in self.video_model.blocks:
            vid_block.cross_attn.k_fusion = nn.Linear(vid_block.dim, vid_block.dim)
            vid_block.cross_attn.v_fusion = nn.Linear(vid_block.dim, vid_block.dim)
            vid_block.cross_attn.pre_attn_norm_fusion = WanLayerNorm(vid_block.dim, ...)
            vid_block.cross_attn.norm_k_fusion = WanRMSNorm(vid_block.dim, ...) ...
        for audio_block in self.audio_model.blocks:
            audio_block.cross_attn.k_fusion = nn.Linear(audio_block.dim, audio_block.dim)
            audio_block.cross_attn.v_fusion = nn.Linear(audio_block.dim, audio_block.dim)
            ...

每个 fusion block 的 forward (Ovi fusion.py:L161-L240) 是: 各自做 self-attention → 然后 双向 跨模态 cross-attention (音频 query → 视频 K/V, 视频 query → 音频 K/V), 再各自走 FFN。Starchild-1 没动这套架构, 但它的 第三阶段 (KV-cache rollout) 必须把这四组 cache (视频 self / 视频 cross / 音频 self / 音频 cross) 全都缓存下来才行 — 而双向 cross-attention 在因果模型里要改成 "我只能 attend 到对方已经生成的 chunk", 这就是 §4.3 "cross-attention 也要因果化" 的工程内涵。

另一个关键设计是 modality-specific RoPE: 视频用 3D RoPE (frame / height / width), 音频用 1D RoPE (只有时间维度), 而且各有自己的 temporal_rope_scaling_factor 来对齐采样率差异:

repo/ovi/modules/model.py:L669-L687 — WanModel.set_rope_params: 音频走 1D RoPE, 视频走 3D RoPE

def set_rope_params(self):
    dim = self.dim
    num_heads = self.num_heads
    d = dim // num_heads

    if self.is_audio_type:
        # audio: 1D temporal RoPE only
        self.freqs = rope_params(1024, d - 4 * (d // 6),
                                 freqs_scaling=self.temporal_rope_scaling_factor)
    else:
        # video: 3D RoPE = temporal + height + width
        self.freqs = torch.cat([
            rope_params(1024, d - 4 * (d // 6)),  # temporal
            rope_params(1024, 2 * (d // 6)),      # height
            rope_params(1024, 2 * (d // 6))       # width
        ], dim=1)

这就是 paper §4.1 说的 "modality-specific RoPE scaling accounts for the differing temporal resolutions" 的具体含义: 音频 RoPE 的频率乘了一个 temporal_rope_scaling_factor, 这个因子在因果适配阶段需要重新校准, 让 75 个音频 latent frames 对应到 15 个视频 latent frames 的同一段物理时间。

2.3 阶段一: 少步双向蒸馏 (DMD)

第一阶段沿用 CausVid 的 分布匹配蒸馏 (DMD) 思路 — 用一个 "fake critic" 估学生分布的 score, 一个 "real critic" 估教师分布的 score, 学生网络梯度方向是 "把 fake 推向 real":

—— 翻译: 让 4-step 学生生成的样本分布去匹配 50-step 教师分布。fake critic 在线学学生当前生成的分布, real critic 是冻结的教师 (Ovi 50-step)。

Starchild-1 对这套标准流程做了两个修改:

(a) 拉高 audio params 学习率。 默认情况下整网用同一个 LR; 但视觉是 (帧×高×宽×channels) ≈ 几十万 token 一个 chunk, 音频是 (75×16) ≈ 1200 token 一个 chunk。梯度量级悬殊, 默认 LR 下 audio 部分几乎不更新。Paper 没给具体倍数 — 一个 ad hoc 修改, 但承认是经验试出来的。

(b) 拉高 fake critic 学习率。 这个修改背后的 hypothesize 是: 联合音视频蒸馏让学生分布在两个模态上同时漂移, fake critic 必须更快追上学生当前的分布, 才能给出有效梯度。Critic 是 score-matching 网络, 学慢了相当于给学生一个过时的对照, 训练就发散。

audio CFG 比较: 3 vs 7
Fig. 3 (paper) — 教师生成 ODE 轨迹时, audio classifier-free guidance scale 从默认的 3 拉到 7, 唇形和讲话节奏的对齐显著加强。这是个 "强化条件信号" 的操作: 教师生成的样本里, 文本→音频的因果关系变得更明显, 蒸馏出来的学生才学得到这个关系。

注意这里 audio CFG 不是 inference 阶段调高, 而是 生成蒸馏用的 ODE 轨迹时调高 (相当于教师"用最强的条件信号给学生抄答案")。Ovi 默认配置里 audio CFG = 3, video CFG = 4:

repo/ovi/configs/inference/inference_fusion.yaml:L9-L10 — Ovi 默认 CFG (Starchild-1 蒸馏时把 audio 改到 7)

sample_steps: 50
audio_guidance_scale: 3.0
video_guidance_scale: 4.0
slg_layer: 11   # skip-layer guidance: which transformer block to skip in the negative branch

repo/ovi/ovi_fusion_engine.py:L314-L317 — CFG 公式: audio 和 video 分别用不同 guidance scale

# Apply classifier-free guidance
pred_video_guided = pred_vid_neg[0] + video_guidance_scale * (pred_vid_pos[0] - pred_vid_neg[0])
pred_audio_guided = pred_audio_neg[0] + audio_guidance_scale * (pred_audio_pos[0] - pred_audio_neg[0])

这段是 Ovi 的双 CFG 公式 — 经典 CFG 的双模态扩展。Starchild-1 的修改是把 audio_guidance_scale 在生成蒸馏 ODE 轨迹时设为 7, 同时把 fake critic 用的 slg_layer (skip-layer guidance) 也专门优化过 (§4.4 末尾)。

2.4 阶段二: 块因果掩码适配

第二阶段把双向学生改成 块因果 (block-causal) 学生。每个 chunk 内部仍然全注意力 (chunk 内未来 token 可以看到 chunk 内过去), 但 chunk 之间是因果的 (chunk t 只能 attend 到 chunk 0..t-1)。这是因果视频生成的标准模式 (CausVid / Self-Forcing 都这样)。

训练目标: 从教师 (50-step Ovi 双向) 采 ODE 轨迹 (用 UniPC 求解器), 让学生在选定 denoising steps 复现教师的 clean latent 预测。Loss 是 MSE。

但这里有几个 audio-specific 的关键决策:

(1) 学生从"少步双向"初始化, 而不是从"50-step 双向"。 这是 §4.3 反复强调的最重要发现 (Figure 2)。直接从 50-step 教师初始化, rollout 会 collapse; 从 4-step 学生初始化, 训练稳定。Paper 的解释: 把 "离线 → 流式" 的总优化问题分成两步 (蒸 + 因果化), 减少了 mismatch 跨模态传染的可能。

4-step vs 50-step 初始化的 rollout 质量对比
Fig. 2 (paper) — 因果学生从 4-step 双向初始化 (上) vs 从 50-step 双向直接初始化 (下) 的 rollout 质量对比。下面那行明显退化、糊掉。这是个非平凡的工程经验 — 在 video-only 工作里 (CausVid 等) 直接从 50-step 教师初始化通常没问题, 但在联合音视频设定下, 阶段一的 "少步压缩" 是稳定性的前提。

(2) Audio CFG 在 ODE 轨迹生成时拉到 7。 见上一节 Figure 3 — 这让教师轨迹里"文本→音频"的因果关系更显著, 学生才学得到。

(3) "好看的轨迹 ≠ 好用的轨迹"。 Paper §4.3 末尾说: 视觉感知质量更高的 ODE 轨迹不一定蒸馏出更稳的 rollout。作者的假设是, "视觉更锐利"对应"局部更优化但时间上不稳定的 latent dynamics", 后者反而更难自回归地蒸馏。在多模态设定下还多了一层: rollout 稳定性更依赖于"跨模态时间对齐的一致性", 而不是单模态的短程感知质量。

(4) 优化器细节: MSE loss + AdamW + 关掉 weight decay。 Paper 明确说这三个组合很关键 — "minor optimization choices significantly affect the stability of causal adaptation"。这是个非常诚实的承认: 蒸馏管线对超参极为敏感。

(5) 音频状态粒度: 单词级而非音素级。 这是 §4.4 末尾的一个深刻发现。如果在音素或子音素级别切 chunk 边界, "下一个音素 given 上一个音素" 的预测几乎是 ill-posed (英语音素转移近乎 i.i.d.), 学生没法 condition on prior aural state 学到任何东西。提到单词或短句粒度后, 前后文有了语义连续性, causal predictiveness 就 well-conditioned 了。

2.5 阶段三: KV-cache 自回滚适配

第三阶段沿用 Self-Forcing (Huang 2025) 思想: 让模型在 自己生成的 KV-cache 上做训练, 而不是教师轨迹。这是为了对齐 train/inference 分布 (training time 见到的 KV 都来自教师, inference 时见到的 KV 来自自己, 这就是经典 exposure bias)。

KV-cache 和 orchestrator layer 示意
Fig. 4 (paper) — 左: 自注意力 KV-cache 的时间演化 (cross-attention 同样的模式)。t=0 时只有当前正在 denoise 的 token; t=1 开始 cache 之前 chunk 的 clean 部分; t=2 开始, video 保留了 sink tokens (黄), audio 不保留。右: orchestrator 把用户输入 (speech in / edit prompt) 喂给 campaign generator (一个外部 LLM), 输出一串带语义标签的 action (respond, continue, re-steer, ...), 在 chunk 边界处异步注入到 cross-attention。

核心设计有四:

(a) Self + Cross-attention 都缓存。 不光自注意力 KV 缓存, cross-attention 跨模态 K/V 也缓存 — paper 说这显著改善多模态时间一致性。直觉: cross-attention 里, video query 关注的不是当前 chunk 的 audio, 而是过去几个 chunk 的 audio, 把这部分 K/V 缓存住可以省算力, 也能让模型更直接地"看到"自己之前生成的对方模态。

(b) 非对称 sink token: video 有, audio 没有。 "Sink token" 是从 Attention Sinks (Xiao et al. 2024) 来的概念 — KV-cache 满了之后, 不是完全 FIFO 抛弃最早的 token, 而是 保留最前面几个 当 "锚点", 防止注意力分布塌陷。Paper 观察到: 在 video cache 里加 sink token 显著稳定长程 rollout; 在 audio cache 里加 sink token 几乎没用。一个合理解释: video 的全局场景在长 horizon 上需要锚点 (人物身份、背景、视角不能漂); audio 的全局信号 (说话人音色之外) 大部分是局部 transient, 远古 sink token 反而是噪声。所以最终的非对称设计是 视频 cache 多保留一个 chunk 的 latent frames 当 sink

(c) Prompt 切换时不重置 cache。 这跟很多先前因果生成工作的常规做法相反 (e.g. CausVid 在 prompt 换的时候会 reset 一部分 cache)。Paper 的解释: aggressive reset 会引入视觉 latent 的分布偏移, 通过 cross-attention 传染到 audio, 再回传到 video, 整个 rollout 崩。保留 video sink token, 同时让新 prompt 通过 cross-attention 持续注入新条件, 模型自己会"软切换"。这是个很 counterintuitive 但 paper 说 work 的发现 — 没有 ablation 量化, 但是个 unique design point。

(d) Real-critic biasing。 这个阶段又重新加入 fake critic + real critic 的 DMD 损失。Paper §4.4 末尾承认: SF-style causal adaptation 的大部分增益, 来自 "real critic 比 fake critic 在生成质量上的 advantage"。所以他们把所有调参都集中在拉大这个 advantage: real critic 用 audio guidance scale = 7, slg_layer 选定的 Ovi 层也专门优化过 (代码里 default slg_layer = 9-11, Starchild-1 没给具体数字)。

2.6 编排层 (Interactive Orchestrator)

最后是 paper 工程上最务实的一部分 — 把模型挂到 "真人随便打字" 的交互界面上需要的胶水:

这一层基本是工程系统设计, 没有 novel 算法 — 但它解决了 "用户随便打字" 和 "模型每 2.5s 需要一段结构化 action" 之间的 impedance mismatch, 是把 demo 跑起来必须的胶水。

3. 结论 (Key Findings)

定量结果非常诚实 (Table 1): 因果学生 vs 双向教师 Ovi, 视觉感知质量 略升, 音频语义对齐 明显降, 同步性 基本不变。具体数字:

Ovi 与 Starchild-1 的定量对比
Tab. 1 (paper) — Ovi (双向 50-step 教师) vs Starchild-1 (因果学生)。视觉指标全面小升 (Imaging Quality 0.451 → 0.561 是最大的一档); 音频 CLAP 0.265 → 0.182 (-31%), ImageBind 0.188 → 0.160 (-15%), Audio Alignment 0.609 → 0.474 (-22%) 都是显著回退; LSE-C/D (lip sync) 几乎不变, AV Event Sync (新提的 content-agnostic 同步指标) 0.122 → 0.147 (+20%) 小升。

作者对 audio 语义对齐回退的解释: "long-horizon autoregressive rollout 累积的分布偏移, 主要伤的是 high-level semantic alignment, 而不是 low-level 同步"。换句话说: 模型说的话/出的声还是按时跟画面同步 (lip sync 不掉), 但 "说的话/出的声 是不是 prompt 要的那回事" 退化了。这跟 LLM autoregressive 长生成里 "语法对、内容跑题" 是一回事 — 一个长期遗留问题。

新的定性能力 — 这才是 paper 真正想 demo 的:

Mid-rollout prompt injection 的四个例子
Fig. 5 (paper) — Mid-rollout prompt injection。每个例子 2.5s 后注入新 prompt, 显示视频 frames、waveform、Mel spectrogram。最显著的特征: prompt 切换时 Mel 的能量分布是 结构性 shift (e.g. "Lightning strike" 出现高频 transient burst), 而不是简单的振幅 spike。这说明模型不是简单地"叠加噪声", 而是真的 generate 了新声音事件 — 至少在这些精挑细选的 example 上。
30s 长程 rollout 的额外例子
Fig. 6 (paper) — 30s 长程 autoregressive rollout 例子。lion、kid、kids on a beach、archers、redhead 等等。可以看到主体身份在 30s 内基本保持 (lion 一直是同一只 lion), 但仔细看会发现细节漂移 (服装、背景几何会变)。这就是 paper "Limitations" 提到的 "scene identity drift over long horizons"。

定性结论 paper 反复 hedge (用了 "we observe", "we hypothesize", "preliminary evidence" 等), 因为 没有任何客观 benchmark 衡量交互式音视频生成 — paper 末尾把这写成了"未来工作"。一句直白的总结: Starchild-1 在传统离线指标上比双向教师稍差, 但解锁了双向教师做不了的实时交互能力。 离线 vs 在线是个 trade-off, paper 用"我们关心的是后者"为前者的回退辩护。

4. 实现细节 (Implementation Notes)

Starchild-1 本身未开源, 代码细节绝大部分依赖 paper 自陈, 有 hand-waving 的地方读者无法独立验证。本节把 paper 里所有 "load-bearing" 的工程细节集中列出, 并标出哪些是 hard number、哪些是 narrative:

Paper vs 代码 (Ovi) 的可对照部分:

Paper vs 代码的不可对照部分 (Starchild 自身的修改):

潜在的工程坑 (paper 没说但可以预见):

5. 批判性总结 (Critical Assessment)

优点

不足 / 疑点

适用 vs 不适用

进一步阅读

讨论 / Comments

评论托管在本仓库的 GitHub Discussions, 需 GitHub 账号。