电影级影片 是做什么的?
这种方式制作的影片是单一摄像机在一个世界中的一次移动。每张照片、卡片、剪报、地图和数字都位于一个大板上,摄像机随着故事的推进,沿线条、路线和箭头在这些元素之间移动。每个视觉元素的出现时间都与旁白者所说的词语精确同步。这一切都由代码(Skia in Python)实现,因此每次渲染结果一致,任何主题都适用,新的语音会自动重新调整整个影片的时间。
基于一部关于 Al Capone 的 5 分 22 秒纪录片构建,随后开放给任何主题。这里的规则是根据制作过程中遇到的问题编写而成。
工具
| 文件 | 功能 |
|---|---|
scripts/check_setup.py | 检查 Python、skia-python、ffmpeg、字体和内存;说明需要安装什么 |
scripts/get_fonts.py | 获取开源字体(Bebas Neue、Homemade Apple),用于此机器缺少的任何文字角色 |
scripts/new_project.py | 从 assets/template/(一个可运行的解说片)或使用 --example 从纪录片示例开始一个项目 |
scripts/make_beats.py | 编写 beats.md,即您需要审批的表格;检查时间顺序、行长度、口语文本中的数字 |
scripts/tts_say.py | 免费草稿语音(macOS say、espeak-ng 或任何 TTS 命令),在最终语音前为影片计时 |
scripts/split_takes.py | 将整段录音剪辑为每行一个片段,并标记可疑的剪切 |
scripts/build_narration.py | 将各行拼接成 audio/narration.m4a 和 audio/timing.json,这是构建影片的基础 |
scripts/fetch_commons.py | 搜索 Wikimedia Commons,下载并附带许可证和署名,拒绝非自由文件,编写 credits.md |
scripts/make_map.py | 投影公共领域边界(任何国家或地区)以生成地图 |
scripts/prep_assets.py | 将所有图像分级为统一外观(黑白、怀旧或自然色);生成板纹理 |
scripts/engine.py | 影片引擎:摄像机、聚光灯、项目、地图、外观、影片输出 |
scripts/render.py | 静态帧、接触条、提示列表以及并行 MP4 渲染 |
scripts/build_sfx.py | 根据提示列表合成所有音效(无样本,无需许可) |
scripts/mix_soundtrack.py | 语音、效果和可选音乐,经过闪避和响度标准化 |
scripts/burn_captions.py | 将四种字幕样式之一烧录到完成的影片中,并编写 SRT |
需要 Python 3.9+、pip install skia-python numpy pillow(scipy 可选)和 ffmpeg。首先运行 scripts/check_setup.py;在 Linux 或 Windows 上,还需每个项目运行 scripts/get_fonts.py。所有命令都接受 --project <folder> 参数。
选择影片风格
| 类型 | 外观 | 图像 | 典型项目 |
|---|---|---|---|
| 历史、真实犯罪、调查 | wall, slate | 档案照片和文档,分级为 bw | 印刷品、撕裂的剪报、印章、红线、地图路线 |
| 产品发布、品牌或创始人故事 | studio, charcoal | 您的产品照片和团队照片,分级为 natural | 卡片、大数字、计数器、箭头 |
| 科学、工程、工作原理 | blueprint, paper | 图表、档案或 AI 静帧 | 卡片、计数器、笔迹、地图 |
| 科技、太空、预告片 | night | 截图、渲染图、AI 静帧 | 大号字体、计数器、路线、卡片 |
可自由混搭:外观是板和输出效果,每个项目在任何外观下都可用。references/story.md 为每种类型提供了故事结构。
规则
- 每行一个主角。每行旁白恰好有一个摄像机的焦点。聚光灯会调暗其他所有内容。
- 画面落在口述词语上。印章应在“指控”一词时落下,而不是在行开头。使用
doc.W(line, "word")为所有内容计时。 - 以单一方式展示短语。要么在屏幕上打字,要么在真实文档上显示,切勿同时进行。文档中的正文内容为灰色行,无需填充词。
- 开场后时间只向前移动。冷开场可以向前跳转。经过一个过渡行(“四年前……”)后,故事时间只能向前。
- 文字需在手机上于一秒内可读。使用大号紧凑大写字母。屏幕上的打字标签应约为画面高度的 3% 或更多。
- 少即是多。线条在其节拍结束后淡出,旧项目变暗。最后的拉远镜头应显得构图精美,而非杂乱。
- 不虚构看似真实的内容。真实照片和文档需附署名。由代码绘制的文档需标记为“再现”,并仅引用真实书写过的词语。AI 图像可用于说明,但绝不能作为真实事件或真实人物的证据。
工作流程
在四个关卡(标记为 关卡)处等待用户审批。
- 故事。研究,然后编写
script.json:场景(段落)行,每行包含text、spoken(数字用文字表示)、hero和typed。将事实笔记保留在旁边。60 到 90 秒大约 150 到 230 个词。详情见references/story.md。 - 节拍表。运行
scripts/make_beats.py并修复所有 lint 警告。关卡: 用户审批beats.md,包括事实。 - 图像。在
photos.json中列出每张图像:其 ID、种类和来源。- 档案图像:使用
fetch_commons.py search、category和get。 - 用户自己的文件:放入
<project>/assets/photos/。 - AI 静帧:以统一风格生成(
motion-assets技能会规划和定价)。 references/archive.md涵盖其他档案和版权规则。
- 档案图像:使用
- 草稿语音。运行
tts_say.py,然后split_takes.py,再build_narration.py。听取split_takes.py标记的每一行。现在时间数据已真实。 - 资产。如果故事涉及移动,运行
make_map.py,然后prep_assets.py。 - 场景。编写
scene.py:按场景将项目分簇布局,在doc.L/doc.W时间点上添加项目,然后设置摄像机和聚光灯关键帧(film.shot)。阅读references/film.md。两个已交付项目展示了模式:assets/template/scene.py(解说片,工作室外观)和assets/wright-flyer/scene.py(纪录片,包含所有项目类型)。 - 外观测试。以 1280x720 分辨率对每行运行
render.py --probe,生成一张静帧并查看所有;然后对每个大摄像机移动运行--strip。关卡: 向用户展示开场静帧和外观。 - 草稿。使用草稿语音以 1280x720 渲染前 30 秒。关卡: 用户观看它。
- 最终语音。使用任何 TTS 或真人录制(
references/voice.md)。再次运行分割、构建和探针;场景中无需更改。 - 音效。运行
render.py --cues,然后build_sfx.py,再mix_soundtrack.py,如有需要可添加配乐。阅读references/sound.md。 - 完成。执行完整渲染,然后
burn_captions.py和 SRT。在渲染 1440p 或 4K 前阅读references/performance.md。随影片交付credits.md。
每次自我检查
在声称任何内容有效之前,先查看静帧。以下是在实际渲染中出现的每个错误:
- 深色墨水在深色板上不可见。在暗色外观上使用浅色字体,或对暗色字体使用
bar_h=0.92以添加完整标签块背景。 - 摄像机已移动但聚光灯留在原地,导致画面变暗。除非需要分离,否则应使用
film.shot()。 - 地图比例太小:整条海岸线比一张照片还小。选择
K使每个有印刷品的地点有独立空间(references/film.md)。 - 地图标签重叠。将标签放在远离相邻标签的一侧。
- 集群跨越地图边缘。将集群保持在地图内或明显位于地图外。
- 高亮部分偏离文字几个像素。使用
PaperDoc.phrase_spans,以及doc.on(print, fx, fy),其中分数是从图像上的网格叠加读取的。
已交付项目
assets/template/:“From Cherry to Cup”,一个 25 秒的解说片,采用工作室外观,由卡片、箭头和计数器组成,无图像。new_project.py my-film会复制它。赋予它一个草稿语音即可渲染。assets/wright-flyer/:“Twelve Seconds”,一个 90 秒的纪录片,讲述首次飞行和一位两次坠毁的 5 万美元竞争对手的故事。它使用了七张公共领域照片、美国地图、两种排版文档和所有项目类型。
python3 scripts/new_project.py wright --example
python3 scripts/fetch_commons.py get --project wright
python3 scripts/make_map.py --project wright && python3 scripts/prep_assets.py --project wright
python3 scripts/tts_say.py --project wright && python3 scripts/split_takes.py --project wright && python3 scripts/build_narration.py --project wright
python3 scripts/render.py --project wright --size 1280x720 --out out/draft.mp4 --audio audio/narration.m4a
相关技能
来自 Open 3D Skills:motion-assets 在影片需要插图时规划和定价 AI 静帧,frame-capture 录制网页而非代码绘制的影片。