StoryMem:用记忆机制生成连贯的多镜头长视频故事

近年来,AI视频生成技术发展迅速,从短短几秒的单镜头片段,到现在能生成具有电影质感的分钟级视频,已经取得了很大进步。但真正讲好一个故事,需要多个镜头连贯衔接,人物、外貌、场景和风格保持一致。这正是许多现有方法面临的难题。

StoryMem是一个新提出的框架,它受人类记忆机制启发,将长视频故事生成转化为逐镜头迭代合成过程,同时用显式的视觉记忆来保持跨镜头的连贯性。它基于预训练的单镜头视频扩散模型,只需轻量级微调,就能生成高质量的多镜头叙事视频。

如果你对AI视频生成感兴趣,尤其是想生成人物一致、情节连贯的长故事视频,这篇文章会一步步解释StoryMem的工作原理、优势,以及如何自己上手运行代码。

StoryMem是什么?为什么它重要?

简单来说,StoryMem能根据一个带逐镜头文本描述的故事脚本,生成大约一分钟长、多镜头的叙事视频。视频中人物高度一致,视觉质量接近电影级。

(以上是StoryMem官方teaser图,展示了多个故事示例:从幻想场景到现实生活,人物在不同镜头中保持一致。)

传统方法要么联合训练一个大模型处理所有镜头(计算成本高,容易牺牲视觉质量),要么逐帧独立生成(人物和场景容易漂移,镜头间过渡生硬)。StoryMem走了一条中间道路:保持单镜头模型的高质量,同时引入“记忆库”来传递关键视觉信息。

核心创新是Memory-to-Video (M2V) 设计:生成每个镜头时,都会参考之前镜头提取的关键帧作为记忆条件。这样,后续镜头自然继承前面的角色外貌、场景布局和风格。

实验显示,StoryMem在跨镜头一致性上显著优于以往方法,同时保留了高美学质量和对文本提示的忠实度。

StoryMem如何工作?核心机制详解

StoryMem的流程是逐镜头生成(shot-by-shot),类似于导演一部电影时一镜一镜拍摄,但AI会自动维护上下文。

1. 记忆库(Memory Bank)的角色

  • 记忆库存储之前生成的镜头中提取的关键帧。
  • 这些关键帧代表重要视觉元素:人物外貌、服装、环境等。
  • 记忆库大小有限(默认最多10个镜头),动态更新,保持紧凑高效。

2. Memory-to-Video (M2V) 生成过程

StoryMem基于Wan2.2视频扩散模型(一个强大的文本到视频/图像到视频MoE模型)。

  • 对于第一个镜头:用标准的文本到视频(T2V)模型生成,作为初始记忆。
  • 对于后续镜头:将记忆关键帧编码后,与当前镜头噪声潜在表示拼接,并使用负RoPE偏移注入位置信息。
  • 只用LoRA微调即可实现这种记忆条件,而无需从头训练大模型。

这样,模型在生成当前镜头时,就能“回忆”之前的内容,确保人物不会突然变脸,场景自然演变。

(示例生成的视频帧序列,展示多镜头一致性。)

3. 关键帧提取与记忆更新

生成一个镜头后,需要从中提取可靠的关键帧加入记忆库:

  • 语义选择:用CLIP特征计算与当前提示的相关性,选择最匹配的帧。
  • 美学过滤:用HPSv3评分过滤低质量帧,确保记忆稳定可靠。

这样避免了记忆污染,保证长视频中一致性逐步增强。

4. 支持平滑镜头过渡的扩展

  • MI2V:记忆 + 第一帧图像条件,当无场景切(scene_cut=False)时,用于平滑连接相邻镜头。
  • MM2V:记忆 + 前5个运动帧条件,进一步提升动态过渡自然度。
  • MR2V:如果提供参考图像,可作为初始记忆,实现自定义角色生成。

这些扩展让StoryMem不止于纯文本驱动,还能结合图像控制。

如何自己运行StoryMem?完整安装与使用指南

代码已开源,好消息是只需一台带GPU的机器就能运行。下面是详细步骤。

环境准备

git clone --single-branch --branch main git@github.com:Kevin-thu/StoryMem.git
cd StoryMem
conda create -n storymem python=3.11
conda activate storymem
pip install -r requirements.txt
pip install flash_attn

模型下载

需要三个模型,从Hugging Face下载:

模型名称 下载链接 描述
Wan2.2 T2V-A14B https://huggingface.co/Wan-AI/Wan2.2-T2V-A14B 文本到视频基础模型
Wan2.2 I2V-A14B https://huggingface.co/Wan-AI/Wan2.2-I2V-A14B 图像到视频基础模型
StoryMem M2V LoRA https://huggingface.co/Kevin-thu/StoryMem 记忆到视频LoRA权重

推荐用命令行下载:

pip install "huggingface_hub[cli]"
huggingface-cli download Wan-AI/Wan2.2-T2V-A14B --local-dir ./models/Wan2.2-T2V-A14B
huggingface-cli download Wan-AI/Wan2.2-I2V-A14B --local-dir ./models/Wan2.2-I2V-A14B
huggingface-cli download Kevin-thu/StoryMem --local-dir ./models/StoryMem

提供的LoRA有两个变体:

  • Wan2.2-MI2V-A14B:支持M2V和MI2V
  • Wan2.2-MM2V-A14B:支持M2V和MM2V

运行示例

直接运行:

bash run_example.sh

脚本会:

  1. 用T2V生成第一个镜头作为初始记忆。
  2. 逐镜头用M2V生成剩余部分,自动提取关键帧更新记忆。

关键参数(可在脚本中修改):

参数 说明 默认值
story_script_path 故事脚本JSON路径 示例文件
output_dir 输出视频保存目录 ./results
t2v_model_path T2V模型路径 ./models/Wan2.2-T2V-A14B
i2v_model_path I2V模型路径 ./models/Wan2.2-I2V-A14B
lora_weight_path LoRA权重路径 ./models/StoryMem
seed 随机种子 0
size 输出分辨率 832×480
max_memory_size 记忆库最大镜头数 10
t2v_first_shot 用T2V生成第一个镜头 True
mi2v / mm2v 启用平滑过渡模式 False

生成后,你会在output_dir看到每个镜头的视频和最终拼接的长视频。

(更多生成示例,展示不同风格的故事视频。)

ST-Bench:多镜头故事视频的新基准

为了公平评估多镜头故事生成,作者发布了ST-Bench基准。

  • 用GPT-5生成30个多样化长故事脚本。
  • 每个脚本包含:故事概述、8-12个镜头级文本提示、场景切指示(True/False)。
  • 总计300个详细视频提示,覆盖人物、场景、动态事件、镜头类型等。
  • 风格多样:现实、童话、古今、中西等。

基准位于代码仓库的./story文件夹。你可以用它测试自己的方法,或创建自定义脚本。

如何创建自己的故事脚本?

脚本必须是JSON格式,包含:

  • story_overview:故事简要总结
  • scenes:列表,每个scene有scene_num、video_prompts(文本提示列表)、cut(True/False列表)

每个video_prompt:

  • 1-4句,描述人物(外貌、服装)、动作、场景、氛围、镜头类型(close-up、wide等)。
  • 相邻cut=False的提示必须能自然平滑衔接。
  • 第一条提示cut必须为True。

为了更好一致性,建议在每个提示中明确描述人物特征。

示例脚本结构(简化版):

{
  "story_overview": "一个街头音乐家的日常故事...",
  "scenes": [
    {
      "scene_num": 1,
      "video_prompts": ["提示1", "提示2"],
      "cut": [true, false]
    },
    ...
  ]
}

完整示例见文档中的“The Street Musician”。

StoryMem的局限性与未来方向

任何技术都有改进空间。StoryMem当前的主要局限:

  • 在多人物复杂场景中,记忆检索可能模糊,导致人物混淆。解决办法:在提示中更明确描述人物。
  • 平滑过渡虽已改善,但当相邻镜头运动速度差异大时,仍可能不自然。未来可通过重叠更多帧来优化。

总体而言,StoryMem代表了向连贯长视频叙事的重要一步。它证明了:通过巧妙的记忆机制,无需昂贵的全长训练,就能让单镜头模型讲好长故事。

常见问题解答(FAQ)

StoryMem支持多长视频?

默认每个镜头5秒,8-12个镜头,大约40-60秒。理论上可更长,受内存大小限制。

需要多强的GPU?

基于Wan2.2-A14B,推荐至少24GB显存的GPU(如A100或RTX 4090)。

可以用自己的参考图像生成自定义角色吗?

是的,使用MR2V模式:将参考图像放在output_dir,命名如00_00_keyframe0.jpg,并设置m2v_first_shot

生成速度如何?

单镜头几分钟到十几分钟,视分辨率和采样步数。全故事视镜头数而定。

代码基于哪个基础模型?

Wan2.2(开源大型视频生成模型),感谢其优秀工作。

如何引用StoryMem?

如果用于研究,请引用:

@article{zhang2025storymem,
  title={StoryMem: Multi-shot Long Video Storytelling with Memory},
  author={Zhang, Kaiwen and Jiang, Liming and Wang, Angtian and Fang, Jacob Zhiyuan and Zhi, Tiancheng and Yan, Qing and Kang, Hao and Lu, Xin and Pan, Xingang},
  journal={arXiv preprint},
  volume={arXiv:2512.19539},
  year={2025}
}

如果你正在探索AI视频生成,StoryMem值得一试。它不只是一项技术,更是一种思考方式:用“记忆”桥接短片段,构建长叙事。未来,随着基础模型继续进步,这种记忆机制很可能成为长视频生成的标准范式。