
这是什么
一个把主题——或者一份文件——变成旁白解说片的技能,跑在 Claude Code 或 Codex 里。它不是命令行工具:交付的是整套方法——21,395 字节的 SKILL.md(九道工序、四个会停下来等你的停点)、reference/ 下十份规格文档、六份提示词模板、一个可编译的 Remotion 4 模板(图元与灯光库,外加十一个管配音、分镜、静帧、预览、渲染与量化 QC 的脚本),以及一支带着全部纸面记录的参考片。成片是 1280×720、30fps 的 H.264,中文或英文,带章节卡、底部进度条、顶部 HUD 和按词边界对齐的字幕;中文用 edge-tts 的 zh-CN-YunxiNeural,英文用本地跑的 kokoro-82m am_liam,也可以直接交出自己的音频。解说词里的空行是一段、也是一个镜头;段内句子相隔 10 帧、段末 30 帧,于是停顿正好落在画面切换处,每个镜头在最后一个元素落位后还要停 1–1.5 秒。时长决定其余一切:两分钟是 24–32 个镜头、4–6 个构建 agent,八分钟是 60–80 个镜头、10–14 个 agent。每一帧都由代码画出,没有素材库,没有生成式视频模型,而屏幕上出现的每一个数字都必须能追到来源 URL。2,207 个星、305 个 fork,PolyForm Noncommercial 许可。
谁做的仓库挂在 GitHub 账号 Vincentwei1021 下——video-shotcraft 也出自同一个账号——README 的落款是 Vincent。28 次提交全部落在 2026-09-08 到 2026-09-18 之间:25 次属于这个账号,同一邮箱却用了三个署名,Wei Yihao 17 次、Vincent Wei 5 次、Yihao 3 次;一次来自 DHCatLaw;另有两次署 mdipaolo1,邮箱在 GitHub 上没有关联账号。28 次里 25 次带着共同作者尾注,且每一条写的都是 Claude 模型:带百万 token 上下文的 Opus 5 十八条、Fable 5.1 五条、Opus 4.8 两条。贡献者列表只有两个名字:作者 25 次、DHCatLaw 一次。
它是怎么搭起来的
组成 · 6一个包在模板外面的技能,工作单位是镜头,时间的来源是解说词。每个片子由 agent 复制一份 Remotion 工程,按固定的一套图元与灯光库、一个镜头写一个组件,而常驻层——字幕、进度条、HUD、流水轨、片尾署名——放在 src/common/ 与 src/overlay/ 里,镜头代码不碰。可复现性在这里是硬要求而不是加分项:每个动画都是帧号加固定随机种子的纯函数,文字排版是算出来的而不是靠 DOM 量出来的,所以同一部片子重渲两遍逐帧一致。质量一半靠写、一半靠量。reference/ 里有风格指南、入场/强调/光/离场/相机各自的公式与帧数、构图与光的规则,以及镜头模式表。frame_metrics.py 随后给成片打分:抽样 320×180 的内容区,灰度变化小于 0.35 记作静止帧,预算为每个镜头静止不超过 40%、最长静止不超过一秒;motion_check.py 把同一套判据按组跑、也按成片跑,成片模式多一列,用来区分「真静止」(变化像素少于 800,该加动作)和「小面积动作」(800 到 2500,该加大幅度而不是加元素)。组级读数被刻意排除在判据之外:第四片组级 48 个镜头全过,成片里仍有 11 个超限,所以判据是成片。风格只有一套,开关只有一个(背景),因为多一套主题层就意味着镜头代码不能依赖它。
- SKILL.md 与 reference/
- 面向 agent 的那一半:21,395 字节的流程入口,旁边是约 123 KB 的规格,写给主会话也写给并行的 agent——
lessons.md(32,865)、narration-storyboard.md(21,950)、agent-build-rules.md(13,343)、composition-and-light.md(11,806)、style-guide.md(10,762)、motion-vocabulary.md(10,373)、含六份模板的prompts.md(8,421)、narration-guidance.md(7,121)、agent-qc-rules.md(6,344),以及最小的research-brief.md(3,477)。 - template/
- 可编译的 Remotion 4 工程,由
scripts/new_project.sh每片复制一份:src/下 39 个 TypeScript 文件、128 KB,其中ui.tsx(40,704)放着图元与配色,fx.tsx(17,209)管光、景深与相机,config.ts(4,070)是语言、背景与署名的开关,overlay/Overlay.tsx(14,062)负责标题、章节卡、HUD、流水轨与片尾。src/common/另有十四个文件——雾、星空、点阵波、故障、缓动、字幕、进度条、实拍层、算出来的文字适配、时间轴与字幕表——而src/shots/G1到G8是八个等着下一部片子的镜头组件的目录。 - template/scripts/
- 十一个 Python 与 shell 脚本,60 KB。
tts_build.py(29,185)解析解说词、驱动四种 TTS 引擎并写出时间轴与字幕表;frame_metrics.py(9,585)给成片打分;motion_check.py(8,071)按组也按成片做同一件事;selfcheck.py(6,310)与sheet.py(1,637)负责工程自检与拼帧表;new_project.sh(1,438)、render_storyboard.py(1,311)、preview.sh(1,141)、still.sh(1,133)、render.sh(989)与test_render.sh(732)把一部片子从解说词送到帧序列。 - examples/rag/
- 一支片子完整的纸面记录,119 个文件、3,920 KB:带来源的
research.md(48,851)、storyboard_src.md(35,589)与中文分镜表(33,529)、narration.txt(4,486)、timeline.md(6,367)、ui_rag.tsx(19,711)、交付说明(4,664),G0 到 G8 九个镜头目录里的 44 个镜头组件与每份 12,401 到 15,707 字节的 BUILD_NOTES,五份 QC 报告(最大 23,532 字节),二十张参考帧与六张总览帧。 - examples/contrast/
- 六组「坏 / 好」对照帧,配一份 1,477 字节的说明与一张 408,424 字节的对照拼图:QC agent 被要求对照的构图与光之量尺。
- 仓库根部
README.md(17,628 字节)与它的中文版(16,380)、SKILL.md、5,048 字节的 PolyForm Noncommercial 1.0.0 许可、一份引用文件(1,124),以及 591 字节的模板样片解说词;另有四个自带字体(其中一个中文字体 17,772,300 字节),按各自的 SIL OFL 1.1 授权。
取舍,以及它替代了什么
每一帧都用代码画在确定性的画布上 替代 把画面交给生成式视频模型
README 的对比表用一句话划界:生成式模型是「从提示词合成出的素材」,这里则是「deterministic code, not pixels」——屏幕上的每个数字都能追到来源 URL,任何一帧都可以靠改一个镜头文件修好。FAQ 补上了机制:每个动画都是帧号加固定随机种子的纯函数,文字排版是算出来的而不是在 DOM 里量出来的,所以重渲两遍逐帧一致。为什么是 Remotion 而不是别种可编程画布,是本记录唯一答不上来的问题:issue 14 正是问这个,还附了一份 HyperFrames 实验,至今没有回复。
显式向 TTS 引擎要词边界 替代 让字幕块起点退回按字数插值
这是量出来的而不是争出来的:在仓库自带的那份样片解说词上,插值出来的块起始帧是 0、9、45、81、134,真实发声位置是 0、6、30、76、130。钉住
edge-tts==7.2.8的理由写在注释里——它跟的是一个微软端点,跨版本升级就会坏,而 7.2.0 起边界模式必须显式请求——最终落地的修法是显式请求,而不是贡献者提的那次换引擎。在任何镜头开工之前锁死解说词 替代 稿子改了就让片子自动重排
第二个停点把代价写明了:配音一旦存在,帧号就被硬编码进每个镜头文件,改一个词就要重排整条片子的时间。所以配音前的那次签字被称作最便宜的介入位置,而「已知限制」把配过音的解说词称为已经冻住。
让成片比原始语音长 5% 到 8% 替代 把画面剪到和音轨一样长
停顿预算是刻意的:段内句子相隔 10 帧、段末 30 帧,于是静音正好落在画面切换处,每个镜头在最后一个元素落位后还能停 1 到 1.5 秒。这条规则在第五片之后被加码:观众说动画刚一落位画面就走了,于是句间空白从 10 帧提到 20 帧,多出来的长度被接受为换停留的代价。
只有一套风格,只有一个开关 替代 一层供镜头代码依赖的主题层
FAQ 说风格只有一套是刻意的,唯一的开关是背景——星空加雾,或者从同系列解说项目移植过来的点阵波——要改别的就得改风格指南与图元库,而不是改镜头。已知限制把这件事重述为项目自身的性质,而不是一处缺口。
把样片从规范里拆出去 替代 把技能按那支证明了它的片子来调
一条审查用的 pull request 发现某个片子的习惯被写进了方法:一套固定章法把「讲一项技术」当成了所有题材的结构;镜头模式表的左列是向量空间、索引、提示词输出、评估指标这类领域概念;还有一张塞满某一片 CUDA 与 NIXL 专有词的读音表。后来章法改成「结构由主线决定」,表左列改成与题材无关的画面关系,读音表被清空。
依据README.md(17,628 字节)——尤其是输出规格表、时长表、四个停点、对比表、FAQ、原创性规则与已知限制;以及 SKILL.md(21,395)、reference/ 下十份文档(3,477 到 32,865)、template/scripts/tts_build.py(29,185)、frame_metrics.py(9,585)、motion_check.py(8,071)、template/src/ui.tsx(40,704)与 template/src/fx.tsx(17,209)的体积;第 1、2、3、4、7、9、10、15、17 号 pull request 的正文,第 1、10、15 号 pull request 与第 5、6、12、16 号 issue 的评论串;以及 examples/rag/ 与 examples/contrast/ 里数出来的内容。
制作过程
6 个阶段- 01
同一个作者、同一块画布,做的是另一种片子
本档案里现在有两条记录出自
Vincentwei1021这个账号。video-shotcraft 建于 2026-07-19,有 10,029 个星,它存在的意义是让一个产品好看,重心是一座 157 张镜头配方卡的库,加一轮覆盖 149 个音效和五首垫底曲的声音设计。anything2explainer 晚了五十一天,建于 2026-09-08,有 2,207 个星,它存在的意义是把一个主题讲清楚,重心是一份解说词。两者共用机器,几乎没有共用内容:都是 Claude Code 与 Codex 的技能,都用 Remotion 把 React 组件画到黑色画布上,文档体量也相当。真正不同的是「什么在决定画面」。在卡片库里,片子的形状来自你挑的镜头和钉上去的音效,产物是一支主角为产品的宣传片;在这里,形状来自解说词——先做带来源的调研、写稿、配音、变成帧级精确的时间轴,一个镜头都还没写,而镜头文件随后把这些帧号硬编码进去。这里完全没有音效库,没有垫底曲,没有卡片目录,也没有浏览器工作台。README 自己划的线是:产物是讲机制的动态图形,画面由旁白驱动,而且是 1280×720 的横屏,不是给手机看的竖屏。 - 02
九道工序、四个停点,和一份以方法为主的仓库
整段历史只有十天:2026-09-08 到 2026-09-18 之间的 28 次提交,最后一次加上片尾署名
built by Anything2Explainer skill。周围是 2,207 个星、305 个 fork、八个 watcher、四个未关条目,以及一棵 209 个文件的树。仓库对自己的边界说得很直白——「It is not a CLI」——它交付的是一套流程:21,395 字节的SKILL.md走九道工序,从把模板搭起来,到调研、解说词、分镜、覆盖层、试拍、并行构建、渲染,最后是 QC,中间在四个停点等你。reference/下十份文档再加约 123 KB 规格,领头的是 32,865 字节的lessons.md、21,950 的narration-storyboard.md和 13,343 的agent-build-rules.md,最小的是 3,477 的research-brief.md。template/下是可编译的 Remotion 工程:src/ui.tsx是 40,704 字节的图元与配色,src/fx.tsx是 17,209 字节的光、景深与相机,src/overlay/Overlay.tsx是 14,062 字节的标题、章节卡、HUD、流水轨与片尾,另有 60 KB 的十一个脚本,核心是 29,185 字节的tts_build.py。树里最重的文件不是代码:四个自带字体之一、按自己的 SIL OFL 1.1 授权的NotoSansSC.ttf有 17,772,300 字节。README 把成本写成钟点与磁盘——两分钟的片子约一小时、2 GB,参考档约两小时,八分钟是两到三小时、3 GB——并且明说这些 shell 脚本是 zsh 加 Python 3,只在 macOS 上验证过,Windows 未测。外部反应里除了星标还有一次第三方实测:AutoClaw 这个 agent 工作台报告装上了这套技能,端到端完成了一次英文解说片任务,复核过的镜头达到了它写下的视觉标准。 - 03
旁白就是时间轴,一个段落就是一个镜头
这里的节奏不是审美问题,而是从音轨里掉出来的结果。解说词里的空行标出一个段落,一个段落就是一个镜头,于是画面在说话人停顿的地方换;段内句子相隔 10 帧,段末 30 帧。字幕 44px,按 TTS 引擎给出的词边界对齐;成片被允许比纯语音长 5–8%,好让每个镜头在最后一个元素落位后再停 1–1.5 秒。第二个停点是这件事变贵的地方:配音一旦生成,帧号就被硬编码进每个镜头文件,改一个词就要把整条片子的时间重排——README 把这个停点称为最便宜的介入位置,而「已知限制」把这叫作「词被冻住」。这套规则被真实反馈重写过一次。第五片的观众说节奏太快、紫色扫光来得太频繁,数字也同意:47 句里有九句不足三秒;英文成片里抽查的 40 个镜头中,26 个末拍完全没有稳定帧,只有七个能停到 30 帧以上,而 47 个镜头里有 34 处推近。修法由用户裁定,是一串画面规则——静止上限从 30 帧改成 3 秒,且不许用漂浮、飘动、呼吸去凑;镜头末拍落位后停 30–45 帧再离场,稳定期不新增元素也不运镜;单镜头不短于 120 帧,短句并进相邻镜头当节拍,而不是自己占一个镜头;句间空白从 10 帧提到 20 帧;每章至多一个高光时刻;三轮扫光这套东西——
StageLine与GhostText那组——全片至多两处,留给核心概念第一次登场和可选的结尾。 - 04
词边界到底去哪了
仓库里最锋利的一次取证来自一位用户。2026-09-09,
DHCatLaw报上他在 macOS 上跑完一条四分半中文片时撞到的三个问题,其中两个是真的。第一个既琐碎又致命——test_render.sh建出来的临时目录名以点结尾,而 Remotion 拒绝输出目录带扩展名的图片序列,于是这个脚本在任何机器上都跑不起来。第二个看起来像微软那边变了:四个音色、两种语言、单句与多句全测一遍,WordBoundary事件恒为零,只剩SentenceBoundary,把edge-tts钉在 7.2.8 也毫无变化。作者把这些全部复现之后,把原因定位到客户端一侧:7.2.0 版(2025-08-05 发布)给Communicate新增了boundary参数,默认值是SentenceBoundary,于是请求里发出去的是wordBoundaryEnabled:"false",而 7.0.2 及以前是硬编码为 true 的。失败方式不是报错,而是静默降级——拿不到词,字幕块的起点就退回按字数线性插值。拿仓库自带的那份样片解说词、用zh-CN-YunxiNeural把语速提高百分之八来量,插值出来的块的起始帧是 0、9、45、81、134,而真实发声位置是 0、6、30、76、130。修法是哪里需要词边界就显式要一次;贡献者针对间歇性空音频写的重试则被整体采纳,提交上保留了他的署名。 - 05
收下了什么,推广了什么,退回了什么
这个项目的形状是在 pull request 队列里定下来的。一个 Linux 与树莓派移植被合并,贡献者在 Pi 5 上把它整条跑通:
sed -i ""是 BSD 语法,在 GNU sed 下直接失败;默认的英文引擎在 ARM 加 Python 3.13 上装不上;于是TTS_ENGINE后面多了两个本地引擎kokoro_onnx与piper,而REMOTION_BROWSER_EXECUTABLE让 Remotion 指向系统 Chromium,因为根本没有 linux-arm64 的无头浏览器。随后一条后续改动把整个技能审了一遍「是否通用」,发现样片被写进了方法里:一套固定章法把某一种题材的形状当成了所有片子的结构,后来改成「结构由主线决定」;镜头模式表左列原本是向量空间、索引、提示词输出、评估指标这类领域概念,改成了与题材无关的画面关系;一张塞满某一片 CUDA 与 NIXL 专有词的读音表被清空。Windows 是以报告而不是补丁的形式来的——这条链路确实能用,打包、30 帧测渲、出 H.264、中文字形都在 Windows 11 上验证过,但有五个 shell 脚本必须替换,从 zsh 专有的参数展开到 Git for Windows 根本不带的rsync——现在有一条开着的 pull request 把它们变可移植。有两份贡献被带着理由退回,而不是被无视:一是片头口播的标题句,已经实现、且贡献者自己的 fork 上已有四支成片在用,作者的理由是他更愿意保留现有的片头镜头与时间轴设计;二是俄语旁白(含西里尔字母检测、40 字符字幕预算与回归测试),理由是主仓库得长期背着这份维护。本记录最想问而没答案的那个问题——为什么是 Remotion 而不是别种可编程画布、有没有评估过 HyperFrames、渲染层能不能做成可替换后端——是 2026-09-20 的 issue 14,附了一小段实验,至今没有回复。 - 06
一支片子整份交付,一份不断收到申请许可的授权
那支参考片是连纸面记录一起交出来的,而这些记录是仓库里最大的一块:
examples/rag/下 119 个文件、3,920 KB——48,851 字节的调研文档(每一项都带 URL)、35,589 字节的分镜源文与 33,529 字节的中文分镜表、九组镜头里的 44 个镜头组件(每组的 BUILD_NOTES 从 12,401 到 15,707 字节)、五份 QC 报告(最大 23,532 字节)、二十张参考帧与六张总览帧,最后是交付说明。那一版是四分三十五秒的中文片,星空背景,由八个 agent 并行跑了四十分钟、过了两轮 QC;它的下一版是 4:54 的点阵背景,换成外部引擎加强制对齐;英文版 5:02,44 句、785 个词,由 kokoro 配音。旁边examples/contrast/放着六组「坏 / 好」对照帧和一张 408,424 字节的拼图,作为构图与光的量尺。视觉语言是被致谢而不是被主张的:黑底、白色线稿、紫色强调、超粗标题,这套词汇学自一位抖音创作者(名字写在致谢里),而对方的画面、素材与工程文件一件都没有被使用。原创性随后被写成两条规则——每一帧都由代码画出,可选的实拍素材必须来自免版税来源并登记在清单里(哈希、来源、许可);每一条事实都要有来源,未经验证的东西不许进画面也不许进解说词。商业使用被问过三次:一家读了 PolyForm 后认定「带律所品牌、预期有商业用途」不算个人使用的小型美国律所,一个发布到抖音、视频号、小红书与微信公众号的教育账号,以及一个靠 AdSense 与 Udemy 付费课变现的土耳其 YouTube 频道。三次得到的都是同一条路——写信给作者,说明使用范围、规模,以及是否会再分发这套工具——而 README 写得很清楚:用它做出来的片子归做片子的人。
相关档案
全部档案 →第 112 号
video-talkcraft
一个把 Claude Code 或 Codex 变成口播视频动效工作室的 agent 技能。给它一份口播稿和一条成品配音,它在本机把两者逐字对齐、把每个语义拍写进分镜,再用 108 张动效配方卡渲出成片,运镜由一套做减法的相机纪律守着。同一位作者的 video-shotcraft 用 157 张镜头卡加一轮声音设计做产品宣传片,anything2explainer 把主题变成解说片、让旁白冻结成帧号;这一条从一条已经存在的配音出发,把那条声音本身当作时钟。
第 117 号
sepia
一个可移植的去 AI 味写作技能:一套规则文件配四个操作,小说先修叙事结构再谈用词,专业文稿按场合套一份薄薄的规则文件,而每条规则都标着它是被测出来的、被咨询过的,还是这个项目自己的推断。
第 119 号
headcount
一个按公司组织的 agent 组织——一位首席执行官之下是十六个可独立安装的部门和 172 个技能:每个技能是一个 Markdown 目录,请求与它的描述匹配时自己加载;同一棵树既能装进 Claude Code,也能装进 ChatGPT,因为两边只有清单不同;而那 184 份真正裁决问题、而不是给答案做装饰的外部权威——监管机构、标准组织、成文法——就放在它们所服务的技能旁边,每一条都标着 agent 拿它可以做什么。