代码电影
电影即程序。每一帧都是时间纯函数,由你编写的代码绘制,而语音、音乐和所有声音也来自代码。不涉及任何图像或视频生成器。因此,任何一秒都可以更改并重新渲染,而另一种语言只需重新运行,无需重新剪辑。
该流水线制作了一部5分16秒的俄语和英语电影:16个节拍,57个提示,10个3D插入,从剧本到首个语言版本约需1.5到2小时,每语言版本在笔记本电脑上渲染约14到16分钟。该电影的代码位于 assets/examples/court-astronomer/。
核心理念:口播优先
编写带有标记的脚本。让语音服务朗读并报告每个单词的时间。然后,标记变成绝对秒数,画面和声音都依赖于这些秒数。
Придворные астрономы {plant}поставили её на карту и {cut}записали дату.
CUE.plant = 9.21 手放下星星:砰,火花
CUE.cut = 10.50 切换到场景,羽毛笔开始书写
每种语言都有自己的时间线(来自自己的录音),因此俄语和英语电影无需额外工作即可实现不同的剪辑,而重写的句子会移动其后的所有内容。这就是为什么下面的顺序是:脚本、语音、画面、声音,而永远不是画面优先。
script/script.json ─ tools/tts.py ─> audio/voice/<lang>/ + web/timing_<lang>.js
│
┌─────────────────────────────────────────┴───────┐
web/film.js + shots + space.js audio/score.py
│ render.py │
renders/film_<lang>/film_<lang>.mp4 audio/mix/<lang>.wav
└───────────────── tools/finish_film.py ──────────┘
final/<stem>.mp4, -phone.mp4, .srt
启动项目
python <this-skill>/scripts/check_env.py
python <this-skill>/scripts/new_project.py <文件夹>
将项目放在有足够空间的驱动器上,位于以电影命名的文件夹中,路径要短。帧会流式传输到编码器,从不存储,因此一部5分钟的电影大约需要1 GiB。
新项目是一个可工作的25秒演示,内容关于月相,支持两种语言。运行 new_project.py 打印的命令,并在更改任何内容之前查看联系表:如果演示有效,则后续所有失败都是你的问题,而非机器的问题。
模板状态。 流水线制作了真实电影,但此模板是事后从中提取的。在演示中,tts.py、混音和声音检查已运行。交付工具已在黑色片段上运行,render.py 针对存根页面运行,平面画面逻辑针对两种语言的存根画布逐帧运行。模板从未绘制过真实帧,其3D镜头也从未运行过。因此,首批静帧也是对模板的测试:如果失败,请与 assets/examples/court-astronomer/ 对比,后者是已渲染的代码。
然后替换内容并保留机制:
| 每个电影需要替换 | 通常保持不变 |
|---|---|
script/script.json | tools/ |
web/shots.js(平面镜头) | render.py, server.py |
web/film.js:SHOT 和 SEQ | web/main.js, web/lib.js, web/labels.js |
web/space.js:构建器 | web/space.js:上方的工具包 |
audio/score.py | audio/mixlib.py, audio/synth.py |
工作流程
在后台运行超过两分钟的命令。如果机器有作业队列或散热规则(在项目笔记和记忆中查找),则通过它运行渲染。
1. 确定需求
只询问你无法默认的内容:主题、语言、发布位置。默认使用1920x1080、24 fps、-15 LUFS、长度由脚本决定。在完善任何部分之前,先制作一部完整的粗糙电影。人们对整部电影的评价远好于对完美的十秒钟,而且他们经常直说高质量可以等待。
2. 阅读参考资料(如果有)
测量而非猜测:剪辑、节奏、调色板、角色更新频率、线条粗细、颗粒感。你可以在浏览器中逐帧完成,无需下载视频。阅读 references/reference-analysis.md。将数据以简短风格表的形式写入项目的 README 中。
掌握技术,放弃内容。创造你自己的角色、故事和设计。不要重复使用参考资料中的帧、角色、标志或可识别的曲调,也不要重新创作特定的作品,即使换个名字也不行。
3. 制作10秒试片
一个最终外观的镜头,无声。这里可以使用硬编码的时间,因为这只测试外观。发送给用户。这是整个项目中最便宜的改变方向的机会。
4. 收集事实,编写脚本
阅读 references/script-and-voice.md。将电影划分为10到35秒的节拍,每个节拍一个想法,通常一个镜头。预算字数:俄语约每分钟125个词,英语约每分钟150个词,包含停顿。在需要屏幕上有动作的单词上放置提示。
在电影中(而不仅仅在你的笔记中)明确区分确切事实和解读。如果你计算了某些内容,请将数据保存在电影读取的文件中,以便屏幕上的内容与数据一致。
如果主题敏感或用户要求审批,则将脚本展示给用户。否则继续,让他们对电影做出反应。
5. 语音,然后时间线
python tools/tts.py
它会打印每个提示为 name=word@seconds。阅读这些行:在错误的单词上发现提示成本更低。检查总时长是否与目标一致。如果太长,则删减文本;不要将语音速度提高到约+10%以上。
6. 编写镜头
阅读 references/picture.md。屏幕上的所有内容都是 (g, t) 的函数,每个时间都来源于 CUE 或 BEAT。平面镜头使用 Canvas 工具包绘制;3D 镜头通过合成器渲染到同一个 2D 画布上。每帧末尾进行一次颗粒处理,一组标签使两者读起来像一部电影。
7. 查看静帧,修复,重复
python render.py renders/check "lang=ru×=25,66,241,273"
python tools/contact.py renders/check 4
阅读 references/review-and-render.md 了解如何选择时刻以及注意什么。打开联系表并真正检查:大多数缺陷在代码中不可见,但在图片中显而易见。批量提问。连续的审查渲染是导致笔记本电脑发热和会话缓慢的原因。
8. 编写声音
阅读 references/sound.md。部分从语音节拍开始,效果位于与画面相同的提示名称上,音乐在语音下方降低音量,混音达到 -15 LUFS。
python audio/score.py ru
python tools/bands.py ru
python tools/qa_audio.py ru whisper
你听不到它,所以使用数字。目标是每个节拍语音比其余部分高约10 dB;真实电影在6.7到14.2 dB之间,大部分为7到9 dB,因此不要低于此范围。明确说明还没有人听过它。
9. 每种语言的静帧,然后完整渲染
python render.py renders/check_en "lang=en×=25,66,241,273"
THREADS=6 CRF=17 python render.py renders/film_ru "lang=ru&fps=24&file=film_ru.mp4"
首先在每种语言中通过静帧测试。一种语言中的十进制逗号错误会导致整个后续重新渲染。一次只运行一个繁重任务。仅声音更改无需画面渲染:重新制作混音并再次运行 finish_film.py。
10. 交付、清理、报告
python tools/finish_film.py ru
python tools/telegram_copy.py ru
python tools/chapters.py ru
阅读 references/delivery.md 了解平台副本、描述和报告。除非用户要求特定帖子,否则不要代表用户上传或发布。将草稿移到回收站而不是删除,并保留最终版和重新制作所需的一切。
最大程度节省返工的规则
- 帧仅依赖于
t。 没有时钟,没有未种子的随机,没有从前一帧延续的状态。否则静帧与电影不匹配,部分重新渲染与相邻帧不匹配。 - 时间来自提示。 提示的偏移量是可以的。硬编码的绝对秒数会在另一种语言以及任何重写后失效。
- 所有屏幕文本都通过
T_,包括数字。29,5 дня和29.5 days是不同的字符串。这是真实电影英语母版中出现的错误:一个23,4°。 - 不要跨语言假设提示顺序。 单词顺序不同,因此
CUE.a < CUE.b可能只在一种语言中成立。保护由两个提示构建的跨度。 - 标签是2D的,使用
project()放置。 然后它们与平面镜头共享字体、颗粒和语言处理。 - 将相机保持在任何旋转物体之外。 在联系表上检查移动的极端情况,而不仅仅是中间位置。
- 静态层放入
plate()。 每帧重新绘制详细背景是渲染缓慢的原因。 - 更改,然后查看,然后报告。 在未看到帧之前,不要声称已修复。
你无法检查且必须说明的内容
- 声音。 你看到响度、平衡、频谱图和转录文本。你无法知道它听起来如何。
- 节奏。 你看到帧,而不是观众体验,因此节奏是你最薄弱的判断。请用户特别询问节奏。
- 平台。 你无法看到文件在用户的 Telegram 或 YouTube 账户中的行为。
报告哪些已验证,哪些未验证,并使用这些措辞。决策(想法、方向、要删减的内容)属于用户。
捆绑文件
| 路径 | 内容 | 何时阅读 |
|---|---|---|
references/reference-analysis.md | 用于测量视频的已测试浏览器代码片段,风格表模板 | 有参考视频时 |
references/script-and-voice.md | script.json、提示语法、字数预算、语音、事实 | 编写脚本之前 |
references/picture.md | 时间线、平面工具包、提示动作、文本、颗粒、3D 工具包、示例代码地图 | 编写镜头之前 |
references/sound.md | 乐器、乐谱结构、语音链、混音数字、检查 | 编写乐谱之前 |
references/review-and-render.md | 联系表上要看的内容、渲染模式和选项、负载 | 首次审查之前,完整渲染之前 |
references/delivery.md | 母版、手机版、Telegram、YouTube、X、字幕、清理、报告 | 最后 |
references/pitfalls.md | 症状、原因、修复,涵盖整个流水线 | 当出现问题时 |
scripts/check_env.py | 机器有什么 | 首先 |
scripts/new_project.py | 从模板创建项目 | 其次 |
assets/template/ | 项目骨架,可工作的演示 | 由 new_project.py 复制 |
assets/examples/court-astronomer/ | 真实电影代码:10 个 3D 构建器、平面镜头、手动装置、完整乐谱 | 搜索技术;它不能独立运行 |