一部程序化生成的短片

芒原决战

剑者,以一生赴一瞬。For a swordsman, a whole life goes to meet a single instant.

SilverGrass:一部 160 秒的武士决斗动画,每一帧、每一次剪辑、每一个音符都由代码生成。

160 秒片长
30个镜头
~150次剪辑
109个姿势
25 万丛芒草
0手工素材

影片

观看完整影片

160 秒24 fps2.35:11080p原创配乐
建议打开声音观看 · 下载(1080p)

故事

落日,芒草原。

无主之忍朔,对上年迈的剑豪天鼓斋。决斗分三幕层层升级,最后胜负只在一瞬之间。

一之幕

剑

拔刀对峙、第一次弹刀,一记完美弹反把剑豪的斗笠一刀两断。

二之幕

焰

枪尾顿地,一圈火环在芒草中炸开,围成擂台。

三之幕

雷

大雨之中,剑豪一刀斩开落雷;最终,一道闪光定下胜负。

仓库里没有一件手工制作的素材,全部由代码生成。一条命令就能重新生成整部影片;改一个数字,就是另一部电影。

画面

角色、绑定、动画、镜头和特效,都是在 Blender 里运行的 Python。

声音

配乐和每一个音效都用 numpy 和 scipy 合成。

字幕

书法字幕卡用 Pillow 绘制。

成片

由 ffmpeg 合成并做母带处理。

亮点

用语言导演,用代码成片

🤖

由 coding agent 创作

用自然语言导演,由 coding agent 完成:规划分镜、编写全部代码、编排打斗、创作配乐,并检查成片。

🎬

完整影片,零手工素材

160 秒、30 个镜头、约 150 次剪辑,遵守 180° 轴线规则,设有慢镜头窗口,闪光控制在光敏安全预算以内。角色、骨架、约 25 万丛芒草、四种天空状态和全部特效都由代码生成。

🥋

代码即编舞

109 个姿势,加上 slash、deflect、jump、spear_thrust 等动作宏;clash() 让两把刀在世界空间的指定位置相交。火花、火焰、闪电和雨都是免烘焙的粒子池,由同一个影片时钟驱动。

🎼

动作即声音

原创配乐基于日本都节音阶,从零合成太鼓、尺八、筝、三味线、合唱和寺钟。每个动作都会发出带时间的事件,音效和配乐重音按事件落在准确的帧上。

♻️

可复现,可改造

一条命令重新生成整部影片;镜头级内容指纹只重渲改动的部分;从故事节拍到渲染画质,每个数字都可以改。

快速开始

自己生成这部电影

bash
git clone https://github.com/ZJUCQR/SilverGrass.git && cd SilverGrass
python3 -m venv .venv && source .venv/bin/activate     # Windows: .venv\Scripts\activate
pip install .

python src/run.py check     # 查找 Blender 5.2+、ffmpeg 和字幕字体,并报告缺少的部分
python src/run.py all       # 构建 → 渲染 → 音频 → 字幕 → 合成

成片输出到 assets/film/。完整渲染是最慢的一步,可以随时中断,再次运行会从中断处继续。想花几分钟先看某一幕,可以运行 python src/run.py preview act2。

命令作用
check检查工具链、Python 依赖和字体
build [--lanes all] [--quality final|preview|layout]构建场景和事件表
preview <lane>构建某一幕并以低分辨率渲染。可选:prologue、act1a、act1b、act2、act3、finale
render [--shots S15-S20] [--slots N]正式渲染,可断点续渲,只重渲内容变动过的镜头
audio按事件表合成配乐、音效和环境声,然后混音和母带处理
titles渲染书法字幕卡
assemble [--preview] [--range A B]把画面、字幕和音频合成为成片,然后做成片质检
all从头到尾跑完整条流程

个性化定制

一切都可以改

影片由数据和代码组成,每一部分都可以修改。时间轴、故事和风格都在 src/common/config.py 里;机器和画质相关的设置在 pyproject.toml 的 [tool.silvergrass] 里。完整说明见 docs/CUSTOMIZING.md(英文)。

想改什么改哪里
片名、题记、名牌、幕名config 里的 TITLES
镜头长度、分幕、节奏、慢镜头、配乐提示点config 里的 SHOTS、ACTS、TEMPO_MAP、TIME_WARP、MUSIC_CUES
角色配色和比例config 里的 PALETTE、SHINOBI_HEIGHT、SAINT_HEIGHT;造型在角色模块里
某一幕的动作和镜头该幕的编舞线模块;逐帧分镜见 docs/shots/
天空、光照、风、芒草、特效在编舞线里调用 environment.* 和 vfx.*
旋律、调式、乐器config 里的 LEITMOTIFS、SCALE_IN、SCALE_YO;编曲和乐器模块
分辨率、采样数、运动模糊、编码、响度[tool.silvergrass] 设置

你可以自己创建相应的配置,或者覆盖已有设置:

silvergrass.local.toml
[render]
samples_final = 32        # 更干净,也更慢
slots = 1

[fonts]
calligraphy = "~/fonts/ZhiMangXing-Regular.ttf"
bash
SILVERGRASS_VIDEO_CRF=18 BLENDER_BIN=/path/to/blender python src/run.py all

项目结构

文件都在哪里

SilverGrass/
SilverGrass/
├── src/
│   ├── run.py              # 命令行入口
│   ├── common/             # 影片数据(config)、设置加载、跨平台工具
│   ├── blender/            # 在 Blender 内运行:角色、动作、场景、特效、镜头、构建、渲染
│   │   └── acts/           # 六条编舞线
│   ├── audio/              # DSP、乐器、音效、环境声、配乐、混音与母带
│   ├── post/               # 书法字幕、合成、成片质检
│   ├── tools/              # 联系表、单幕预览、闪光质检
│   └── render_supervisor.py
├── docs/                   # 定制指南、制作规划、调度规则、逐帧分镜
├── assets/                 # README 图片
└── pyproject.toml          # 依赖和全部可调设置

工作原理

从数据到电影

SilverGrass 流程:数据规格、Blender 场景合成、渲染、声音合成与后期

图 1. SilverGrass 流程。(a) 影片以数据形式描述:config.py 里的镜头、交接状态、节拍网格、提示点和主导动机,外加六条编舞线。(b) 在 Blender 里,每条编舞线只在自己的帧区间内为角色、镜头和特效打关键帧;构建时用 NLA 条带隔离各条线,并检查每个交接点的状态。统一的影片时钟 fx_time 让程序化特效和慢镜头同步。(c) 调度器按镜头分块渲染,只有内容指纹变化的镜头才会重渲。(d) 每个动作都会发出带时间的事件,音效和配乐重音按事件落在准确的帧上。(e) 字幕、画面和母带混音按采样精度合成,再检查光敏安全、音画同步和响度。

设计文档包括制作规划、调度规则和逐帧分镜(英文)。

一瞬。

剑者,以一生赴一瞬。