跳到正文

anything2explainer

一个把主题——或者一份文件——变成 1280×720 旁白解说片的技能,跑在 Claude Code 或 Codex 里。agent 先带着来源做调研、写解说词、生成配音和词边界时间轴,再逐镜头做分镜,然后派出一批并行构建 agent,每个 agent 写一个 Remotion 组件,所以画面是代码画出来的,不是模型生成的。它与同一作者的 video-shotcraft 不是同一种片子:那一条用 157 张镜头卡加一轮声音设计做产品宣传片,这一条的主干是旁白,不带镜头卡库、不带音效也不带配乐,并且在任何镜头动手之前就把解说词冻成了帧号。

Screenshot of anything2explainer
编辑截图, 1 Oct 2026anything2explainer ↗

这是什么

一个把主题——或者一份文件——变成旁白解说片的技能,跑在 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 个阶段
  1. 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 的横屏,不是给手机看的竖屏。

  2. 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 工作台报告装上了这套技能,端到端完成了一次英文解说片任务,复核过的镜头达到了它写下的视觉标准。

  3. 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 那组——全片至多两处,留给核心概念第一次登场和可选的结尾。

  4. 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。修法是哪里需要词边界就显式要一次;贡献者针对间歇性空音频写的重试则被整体采纳,提交上保留了他的署名。

  5. 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,附了一小段实验,至今没有回复。

  6. 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 写得很清楚:用它做出来的片子归做片子的人。

相关档案

全部档案 →