HoloCine: Holistic Generation of Cinematic Multi-Shot Long Video Narratives

Paper: arXiv:2510.20822 Code: yihao-meng/HoloCine Code reference: main @ 0a7630ba (2025-11-26)

1. Motivation (研究动机)

HoloCine 解决的是长视频生成里很具体的一类断层:现有 T2V/DiT 模型已经能生成高质量单镜头 clip,但电影、电视剧和纪录片的叙事不是一个不切的长镜头,而是多个 shot 通过剪辑形成的场景级叙事。论文把这个差距称为 narrative gap:模型不仅要让一个片段好看,还要让若干镜头之间有角色、背景、风格和动作意图的一致性,同时还要听懂“第几个镜头是什么景别、什么时候切、镜头语言如何变化”。如果模型只能接收一段扁平 prompt 并生成一个连续 clip,那么它很难表达“先远景建立环境,再中景表现角色动作,再特写表现情绪”这种导演式控制。

以往长视频路线大多是解耦式的。第一类是 chunk-by-chunk 或 autoregressive 生成:当前片段依赖上一段或重叠帧,优点是显存和注意力成本可控,缺点是误差会累积,角色身份、服装和背景细节随时间漂移。第二类是 keyframe-to-video:先为每个 shot 生成关键帧,再用 I2V 模型分别动画化,优点是每个镜头可以单独控制,缺点是每个 shot 的生成过程相对独立,跨镜头的一致性靠外部 keyframe 或 reference 维持,难以自然形成全局叙事。第三类是已有 holistic multi-shot 方法,例如 LCT/CineTrans 一类,把多个镜头放进同一个生成过程,但会遇到两个瓶颈:per-shot prompt 被整个上下文稀释,导致具体镜头控制不准;全序列 self-attention 的复杂度随 token 长度二次增长,长到分钟级视频时不可承受。

HoloCine 的主张是:多镜头叙事视频应该在一个整体扩散过程里生成,而不是先把每个 shot 当作孤立样本再拼接。整体生成能让角色身份、环境布局和风格通过共享 self-attention 自然传播;但为了不牺牲导演控制,模型必须知道每个 video token 属于哪个 shot、每段文本属于全局描述还是某个 shot 描述。论文因此提出 Window Cross-Attention,把第 个 shot 的 video queries 只连到 global prompt 和第 个 per-shot prompt;同时提出 Sparse Inter-Shot Self-Attention,让每个 shot 内部保持 dense attention 以维持运动连续性,但跨 shot 只通过少量 summary tokens 交换信息,以避免全局 dense attention 的二次成本。

Figure 1 解读:这张 teaser 展示 HoloCine 从文本直接生成多镜头叙事场景,而不是生成一段单镜头 clip。上方多行展示不同原创场景,底部展示对 Titanic 等经典镜头语言的致敬。值得注意的是,论文强调的能力不是单帧美感,而是跨 shot 的人物外观、环境与叙事关系保持稳定;最后一行展开单个 shot 的时间维度,说明模型不仅能切镜头,也能在 shot 内保持连续运动。

这个问题值得研究的原因在于,它把视频生成从“片段合成”推向“自动化拍摄/剪辑”。如果一个模型可以在一次生成中理解全局剧情、角色设定、每个镜头的动作、景别、角度和切点,那么用户就可以用接近剧本或 storyboard 的语言控制完整场景。对创作工具而言,这比单 prompt clip 更接近真实工作流;对模型研究而言,它要求统一处理长程记忆、结构化文本对齐、高效长序列注意力和电影语言控制,因此也是多模态生成能力边界的集中测试。

2. Idea (核心思想)

HoloCine 的核心思想可以概括为“整体生成 + 局部导演控制 + 稀疏跨镜头通信”。整体生成指模型一次处理整段多 shot latent,而不是逐 shot 生成后拼接。局部导演控制指文本 prompt 被显式分成 global caption 与 per-shot captions,并用 [shot cut] 标记切点;模型在 cross-attention 中用 mask 让每个镜头只读取与自己相关的局部文本和全局文本。稀疏跨镜头通信指 self-attention 仍然允许不同镜头交换关键信息,但不是让每个 frame token 与所有其他 frame token 两两 dense 交互,而是每个 shot 对自身局部 token dense 关注,并从其他 shot 的 summary tokens 中读取角色、环境、风格等全局记忆。

这三个设计是互补的。只有整体生成而没有 Window Cross-Attention,模型会把所有 per-shot 指令混在一起,导致该切镜头时不切,或在一个镜头中混入其他镜头的内容。只有 Window Cross-Attention 而没有跨镜头 self-attention,模型虽然知道每个 shot 要画什么,但人物可能在镜头之间变脸、背景布局漂移。只有 full self-attention 虽然概念上能解决一致性,但长视频 token 太多,训练与推理成本过高。Sparse Inter-Shot Self-Attention 的关键假设是:shot 内运动连续性需要 dense frame-to-frame 建模,而 shot 间一致性更像“记住人物和环境摘要”,不需要所有 token 全连接。

Figure 2 解读:架构图把 HoloCine 的数据流分成结构化 prompt、整体 latent 序列和两个注意力改造。左侧的 global/per-shot 文本形成层级条件,Window Cross-Attention 把每个 shot 的 query 对齐到 global 文本和对应 shot 文本;中间所有 shot latents 在一个扩散模型里共同处理;右侧 Sparse Inter-Shot Self-Attention 用 shot 内 dense、shot 间 summary 的方式降低复杂度。图中最重要的细节是“全局一致性”和“镜头级可控性”分别由不同注意力路径承担,而不是靠一个普通 prompt 让模型自己推断。

从数据角度看,论文也没有只依赖现成短 clip 数据集。作者从公开影视内容构建多镜头数据:先用 TransNet V2 做 shot boundary detection,记录每个镜头的起止时间;再去字幕、过滤过短、过暗或 aesthetic score 低的片段;然后把同一来源视频中时间上连续的 shots 顺序聚合成训练样本,目标总时长覆盖 5 秒、15 秒、60 秒等档位。最终数据集包含 400k 个 multi-shot samples,最多 13 个 shots。每个样本用 Gemini 2.5 Flash 生成层级 caption:global prompt 描述场景、角色、环境和剧情,per-shot prompts 描述每个 shot 的动作、镜头运动和出现角色,中间插入 [shot cut]。这使得模型训练时同时看到全局语义和局部镜头语义。

开源代码进一步说明了作者希望用户如何使用这种层级 prompt。HoloCine_inference_sparse_attention.py 中的 prepare_multishot_inputs() 会把 global_caption 自动补上 “This scene contains N shots.”,再把 shot_captions[shot cut] 拼接为 [global caption] ... [per shot caption] ... 的字符串;同一函数把总帧数和切点强制调整为 形式,以匹配 Wan VAE/latent 时间下采样。这个实现细节让论文中的“结构化 prompt”不只是概念,而是在推理入口处直接变成 prompt、shot_cut_framesnum_frames 三个显式条件。

3. Method (方法)

3.1 数据构建与层级标注

HoloCine 首先需要一个能教会模型“镜头序列”的数据分布。论文指出,普通公开视频数据集大多是短且孤立的 clip,不包含足够的跨 shot 叙事结构。因此他们构建了一个 pipeline:收集公开影视内容;用 TransNet V2 把长视频切成 shots;去除字幕,并过滤太短、太暗、审美分低的片段;把时间上连续的 shots 按目标总时长聚合成样本。聚合规则不是随机抽镜头,而是保持原视频时间顺序,这一点很重要,因为叙事关系、角色状态和环境变化通常依赖原始剪辑顺序。目标时长包括 5s、15s、60s,最终样本覆盖不同 shot 数,训练时可以形成较均匀的 batch。

标注采用两层 prompt。Global caption 负责“这个场景整体是什么”:角色身份、环境、氛围、剧情线索。Per-shot captions 负责“每个镜头具体怎么拍”:动作、角色出现情况、镜头运动、景别等。论文在 per-shot 之间插入 [shot cut],这既是文本边界,也是模型学习切点控制的语义标记。相比把所有内容写成一整段自然语言,层级 prompt 提供了两个好处:一是全局 prompt 可被每个 shot 共享,维持角色和世界设定;二是 per-shot prompt 可以局部对齐,减少“镜头 3 的指令影响镜头 1”的混淆。

3.2 Holistic multi-shot latent generation

模型基于 Wan2.2 DiT。设一个视频包含 个 shots,每个 shot 被 VAE 编码为一段 latent tokens。HoloCine 不把每段 latent 分开送入模型,而是在扩散去噪时同时处理所有 shot latents。共享 self-attention 让不同 shot 可以在 denoising 中交换信息,使人物身份、服装、背景和整体色调更容易保持一致。这个选择解释了为什么论文把方法叫 holistic:一致性不是后处理拼接出来的,而是在同一个生成状态中内生形成。

但 holistic 直接带来两个问题。第一,cross-attention 如果让所有 video tokens 都看完整 prompt,那么每个 shot 的 query 会同时看到所有 per-shot text,模型需要自己猜哪些文本对应自己;在长 prompt 下,局部镜头指令会被稀释。第二,self-attention 若对全序列 dense 计算,复杂度是 时成本随 shot 数和每 shot token 数二次增长。HoloCine 因此把方法拆成 Window Cross-Attention 和 Sparse Inter-Shot Self-Attention 两个模块。

3.3 Window Cross-Attention

Window Cross-Attention 的目标是同时控制“每个 shot 生成什么”和“何时发生镜头切换”。设 是第 个 shot 的 video query tokens, 是 global prompt 的文本 key/value, 是第 个 per-shot prompt 的文本 key/value。普通 cross-attention 会让 访问所有文本;HoloCine 只允许它访问 global 文本和自己对应的 per-shot 文本: 直观上,global prompt 像全局剧本设定,per-shot prompt 像当前镜头的导演指令。第 个 shot 不应该读取第 个 shot 的局部动作描述,否则切点附近会出现语义泄漏。开源实现中,这个机制主要体现在 diffsynth/pipelines/wan_video_holocine.py:pipeline 接收 shot_cut_framesWanVideoUnit_ShotEmbedder 把原始帧切点转换为 latent cut indices,并为每个 latent frame 生成 shot_indices

随后在 denoising forward 中,代码读取 text_cut_positions['global']text_cut_positions['shots'],构造 global_maskshot_tablevid_shot = shot_indices.repeat_interleave(h * w, dim=1) 把 shot id 扩展到每个空间 token;最终 allow = allow_shot | global_mask,并把不允许的文本位置填成 -1e4 bias 作为 cross-attention mask。也就是说,论文公式里的窗口不是抽象描述,而是实际落到 text-token mask 上。

3.4 Sparse Inter-Shot Self-Attention

Sparse Inter-Shot Self-Attention 的目标是保留 holistic 的跨镜头一致性,同时避免 full attention 的长序列成本。论文区分两种一致性:shot 内一致性涉及连续动作、帧间平滑和局部运动,必须 dense;shot 间一致性更关注人物身份、环境布局和风格延续,通常不需要每个 token 与所有其他 shot 的 token 全连接。因此对第 个 shot,HoloCine 让 同时看本 shot 的完整 和由所有 shots 摘要组成的 如果每个视频有 个 shots,每个 shot 长度为 ,每个 shot 用 个 tokens 摘要,则 full attention 复杂度为 ;稀疏版本约为 。当 时,它随 shot 数增长更温和,适合分钟级生成。论文举例 summary tokens 可取每个 shot 的第一帧 token,并提到也做了 first/last frame 或 learnable 机制的选择消融。

开源代码锚点在 diffsynth/models/wan_video_dit.pyAttentionModule.forward() 在收到 shot_latent_indices 时调用 attention_per_batch_with_shots()

后者根据每个 batch 的 cuts 把 切成多个 shot local blocks,调用 build_global_reps_from_shots(K_locals, V_locals, per_g, mode="firstk") 生成全局 summary,然后对每个 shot 拼接 [K_local_i, K_global][V_local_i, V_global]。代码用 flash_attn_varlen_func 把不同长度的 query/key-value packed 成 variable-length attention,一次 kernel 调用完成每个 shot 的局部+全局注意力。

HoloCine_inference_sparse_attention.py 会加载 sparse_high_noise.safetensorssparse_low_noise.safetensors,并设置 pipe.dit.use_sparse_self_attn=Truepipe.dit2.use_sparse_self_attn=True;full attention 脚本则加载 full_high_noise.safetensorsfull_low_noise.safetensors,不启用 sparse flag。

3.5 训练与推理细节

论文训练使用 Wan2.2 14B 版本作为基础模型,在 400k multi-shot samples 上训练。数据包含 5s、15s、60s 多个时长档位,最多 13 个 shots,所有样本处理为 分辨率。训练 10k steps,学习率 ,linear warmup,使用 128 张 NVIDIA H800。由于长视频 token 和 14B DiT 显存压力大,训练采用 FSDP 分片模型参数,并用 Context Parallelism 切分长序列 token。需要注意:当前 GitHub 仓库释放的是 inference code 和模型权重下载说明,没有公开训练 launch/config;因此这些训练数字只能锚定论文 4.1,而不能从仓库训练脚本复现。

Attention 实现也体现了工程取舍。Sparse Inter-Shot Self-Attention 是主要计算瓶颈,因此用 FlashAttention-3 的 varlen sequence 功能,避免 padding 不同 shot 长度;Window Cross-Attention 面对的是较短文本序列,计算占比小,所以直接用 attention mask 限制文本范围,额外开销可忽略。README 也明确 release 了两类权重:HoloCine-14B-fullHoloCine-14B-sparse;full attention 版本质量更好,sparse 版本更快但略不稳定,且超过 1 分钟的 full-l/sparse-l 计划后续释放。

方法伪代码可以写成:

# Paper-level pseudocode aligned to yihao-meng/HoloCine main@0a7630ba
prompt = "[global caption] " + global_caption + " [per shot caption] " + " [shot cut] ".join(shot_captions)
num_frames = enforce_4t_plus_1(total_frames)
shot_cut_frames = enforce_4t_plus_1_each(user_cuts or evenly_spaced_cuts(num_frames, len(shot_captions)))
shot_indices = ShotEmbedder(shot_cut_frames, num_frames)  # latent-frame shot ids
 
for denoising_step in scheduler:
    x = latent_tokens_for_all_shots
    text_positions = parse_global_and_per_shot_text_positions(prompt)
    cross_mask = allow(global_text) | allow(text_of_same_shot(shot_indices, text_positions))
    if sparse:
        cuts = labels_to_cuts(repeat_shot_indices_over_spatial_tokens(shot_indices))
        for block in DiT:
            x = self_attention(q=x, kv=local_tokens_of_same_shot + firstk_summary_tokens_from_all_shots, cuts=cuts)
            x = cross_attention(q=x, kv=text_tokens, mask=cross_mask)
    else:
        for block in DiT:
            x = full_self_attention(q=x, kv=all_video_tokens)
            x = cross_attention(q=x, kv=text_tokens, mask=cross_mask)

这个伪代码的关键不是生成流程本身,而是两个边界映射:shot_cut_frames → shot_indices → cross_mask / sparse cuts,以及 [global caption] + [per shot caption] + [shot cut] → text_cut_positions。只有二者同时存在,模型才能把视频 token 的时间位置和文本 token 的语义片段对齐。

4. Experimental Setup (实验设置)

实验从三类 baseline 覆盖现有范式。第一类是预训练视频扩散模型 Wan2.2 14B:给它完整层级 prompt,让它一次生成整段多镜头视频,用来测试强 T2V 模型是否天然理解 multi-shot 指令。第二类是 two-stage keyframe-to-video:StoryDiffusion 或 IC-LoRA 先生成每个 shot 的 keyframe,再用 Wan2.2 14B 做 I2V 动画化;为了公平,作者把 global context 合并到每个 shot prompt,并把 [character1] 之类抽象 ID 展开成完整描述。第三类是 holistic multi-shot 方法 CineTrans,代表已有整体生成路线。作者还说明 LCT、Mixture of Concept、Captain Cinema 等相关工作没有开源,因此无法直接量化比较,只在 appendix/定性材料中对照公开结果。

测试集由 Gemini 2.5 Pro 生成 100 个 diverse hierarchical text prompts,每个 prompt 都包含明确 shot transition 指令,覆盖不同 genre 和 narrative structures。这个设置对 HoloCine 有利也有挑战:有利在于 prompt 格式与训练标注一致,能发挥 Window Cross-Attention;挑战在于指标必须同时衡量切镜头、语义跟随、shot 内稳定和跨 shot 角色一致性,不能只看单帧美感。

指标分五类。Transition Control 用论文提出的 Shot Cut Accuracy (SCA):先用 TransNet V2 检测生成视频的 cut locations,与输入指定的 ground-truth cuts 比较。公式为 其中 是预测 cut 与真实 cut 一对一匹配后的帧级偏差, 惩罚漏检或多出的 cut, 是视频总帧数。SCA 范围 ,越接近 1 表示切点数量和时间越准确。Aesthetic Quality 用 LAION aesthetic predictor 评估帧的构图、色彩、真实感和自然度。Semantic Consistency 分 global 和 shot-level:用 ViCLIP 对整段 prompt/视频或每个 shot prompt/clip 计算 cosine similarity。Intra-shot Consistency 先用 TransNet V2 分段,再按 VBench 设计分别计算 subject consistency(DINO 特征)和 background consistency(CLIP 特征)。Inter-shot Consistency 不是简单比较所有 shot,因为不同 shot 可能出现不同人物或场景;作者先按 prompt 中角色身份把相关 shots 分组,再计算同一角色组内 ViCLIP 相似度。

Figure 3 解读:这张图对应一个复杂五镜头叙事 prompt。Wan2.2 基线往往只生成单一静态 shot;StoryDiffusion+Wan2.2 和 IC-LoRA+Wan2.2 虽然能产生不同 keyframes,但第二镜头本应是女性沉思表情的 medium close-up,却生成男孩和女性同框,说明 per-shot 语义和长程一致性都有偏差;CineTrans 在长视频复杂 prompt 下画质退化且切换不准确。HoloCine 则生成五个明确不同 shots,并保持人物和风格一致。

Figure 4 解读:商业模型比较强调“好看”和“会切镜头”不是同一件事。Vidu 和 Kling 2.5 Turbo 视觉质量强,但面对层级 multi-shot prompt 时倾向生成一个连续 clip,没有执行 medium shot 到 close-up 的指定 transition。HoloCine 在这个例子中表现出与 Sora 2 相近的叙事控制:能解析 prompt、执行 shot transition,并维持人物和风格一致。

5. Experimental Results (实验结果)

定量结果显示,HoloCine 在多镜头任务核心指标上显著领先。Table 1 中,Transition Control 从 Wan2.2 的 0.4843、CineTrans 的 0.5370 提升到 HoloCine 的 0.9837,说明普通强 T2V 和已有 holistic 方法都很难精确执行指定切点,而 Window Cross-Attention + 显式 shot indices 对 cut control 非常关键。Inter-shot Consistency 也从 StoryDiffusion+Wan2.2 的 0.7364(runner-up)提升到 0.7509,说明整体生成和稀疏跨镜头通信确实帮助角色/场景跨 shot 保持。Intra-shot subject/background consistency 分别为 0.9448/0.9352,均为最佳;Semantic global/shot 分别为 0.1856/0.1837,也是最佳。唯一不是第一的是 Aesthetic Quality:StoryDiffusion+Wan2.2 为 0.5773,HoloCine 为 0.5598,但 HoloCine 仍是 runner-up。这个差异合理,因为 two-stage keyframe 可能生成更静态、更审美的关键帧,而 HoloCine 优先解决场景级叙事和切镜头控制。

MethodTransition Control↑Inter-shot Consistency↑Subject↑Background↑Aesthetic↑Global Semantic↑Shot Semantic↑
Wan2.20.48430.67720.90540.90140.55680.16520.1364
CineTrans0.53700.61520.89900.89980.47890.15680.1159
IC-LoRA+Wan2.2-0.70960.94210.93030.52460.18080.1692
StoryDiffusion+Wan2.2-0.73640.84870.89270.57730.14530.1644
HoloCine0.98370.75090.94480.93520.55980.18560.1837

Figure 5 解读:消融图直观看到三个模块的作用。去掉 Window Cross-Attention 后,模型无法按 prompt 切换内容,第三镜头 close-up 等指令被忽略,仍停留在初始场景;Full Attention + Window 能保持一致性但计算昂贵;Sparse Zero 关闭跨 shot summary 后,每个 shot 内部可生成,但老人身份跨 shot 崩溃;完整 Sparse 版本在质量和效率之间取得折中。

消融表与定性结论一致。WO WINDOW 的 Transition Control 只有 0.6266,Semantic Consistency 0.1562,说明局部文本对齐缺失会同时伤害切点和 per-shot 语义。FULL ATT WINDOW 的 Inter-shot Consistency 0.7231 略高于 SPARSE 的 0.7225,说明 dense 全局 self-attention 在一致性上仍有轻微优势;但论文强调 full attention 计算上不可扩展。SPARSE ZERO 的 Transition Control 0.9675 很高,但 Inter-shot Consistency 降到 0.6761,说明切镜头由 Window Cross-Attention 负责,而跨镜头角色一致性依赖 summary tokens。最终 SPARSE 的 Transition Control 0.9736、Semantic Consistency 0.1739 为最佳,Inter-shot Consistency 几乎追平 full attention。

MethodTransition Control↑Inter-shot Consistency↑Aesthetic↑Semantic Consistency↑
WO WINDOW0.62660.70090.57550.1562
FULL ATT WINDOW0.89230.72310.57000.1738
SPARSE ZERO0.96750.67610.56690.1642
SPARSE0.97360.72250.56930.1739

Figure 6 解读:作者把 HoloCine 的 emergent memory 分成三类。第一是 character permanence:同一个艺术家在中景、侧面和微笑镜头中保持金发、灰色 T 恤和围裙等特征。第二是 long-range consistency:教授在 Shot 1 出现,中间经过图书馆环境 distractor,Shot 5 重新出现时身份仍保持。第三是 fine-grained persistence:背景中不显眼的蓝色磁铁在 intervening shot 后仍出现在原位置。这说明模型记忆的不只是主体脸,而是场景布局细节。

Figure 7 解读:这张图展示 cinematic language controllability。Shot scale 部分要求同一雕像的 long shot、medium shot、close-up,模型能产生符合电影语法的构图差异;camera angle 部分要求 low-angle、eye-level、high-angle,模型能改变视角几何;camera movement 部分包含 tilt up、dolly out、tracking,说明 prompt 不只控制静态构图,也能控制镜头运动。这类能力可能来自影视数据和层级 prompt 标注,使模型把电影术语与视觉变化关联起来。

Figure 8 解读:失败案例指出 HoloCine 的一致性并不等价于因果推理。Shot 1 是空玻璃,Shot 2 往杯中倒水,Shot 3 按逻辑应显示水位变化,但模型又生成空玻璃。它优先保持初始视觉状态,而没有理解动作对物体物理状态的后果。这个例子很关键,因为它说明“长程视觉记忆”可能反而压过“状态更新”:模型记得杯子长什么样,却没有可靠维护世界状态变量。

综合看,HoloCine 的贡献不是提出一个新的视频审美指标,而是把多镜头叙事拆成可训练、可实现、可评估的三个问题:层级 prompt/shot 数据、镜头级 cross-attention 对齐、可扩展的跨镜头 self-attention。它的局限也很明确。第一,训练数据和资源门槛高:400k 多镜头样本、14B Wan2.2、128 H800、FSDP+CP,使复现实验难度大;开源仓库目前主要提供 inference code 和权重,缺少训练配置。第二,因果状态更新弱,说明模型仍以视觉一致性为主,未必具备显式世界模型。第三,sparse 版本相对 full attention 略不稳定,README 也建议先从 full attention 版本开始;这意味着 summary token 选择仍可能影响长视频质量。第四,商业模型比较主要是定性展示,且 Sora 2 作为闭源模型无法纳入完整量化表。尽管如此,SCA 0.9837 与跨 shot 一致性提升说明 HoloCine 确实把“会生成好看 clip”推进到“能按导演式层级 prompt 生成 coherent multi-shot scene”。