make-explainer-video
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseMake an explainer video
制作讲解视频
Make a narrated explainer video about a source project, the project the user wants explained, with the explainer studio, yahyabedirhan/explainer-studio. The source project is read-only: read what explains the subject, such as its code, docs and its own pull requests, and write nothing into it.
A video is a stack of layers. Each layer has options, and the video uses one option per layer. A preset is a named set of choices. Start from a preset, or choose each layer yourself.
使用 explainer studio yahyabedirhan/explainer-studio 制作一段讲解 源项目(source project)(即用户希望讲解的项目)的带旁白讲解视频。源项目是只读的:阅读所有能够说明该主题的内容,例如其代码、文档及其自身的 pull requests,并且不要向其中写入任何内容。
视频是若干 图层(layers) 的堆叠。每个图层都有一些选项,而视频在每个图层中使用一个选项。预设(preset) 是一组有名称的选择。可以从预设开始,也可以自行选择每个图层。
Parameters
参数
- : a checkout of the studio, e.g.
<studio>, or any worktree of it.~/Developer/<owner>/explainer-studio
- :studio 的一个 checkout,例如
<studio>,或它的任意 worktree。~/Developer/<owner>/explainer-studio
Layers
图层
references/layers.md says how layers combine.
| Layer | Options | Choose |
|---|---|---|
| Renderer | | one |
| Drawing | | one or both, scene by scene; |
| Look | | one |
| Effects | | none, one or both |
| Captions | | one |
| Voice | | one |
| Sound | | one |
| Optional steps | | none, one or both |
references/layers.md 说明各图层如何组合。
| 图层 | 选项 | 选择方式 |
|---|---|---|
| 渲染器(Renderer) | | 一个 |
| 绘制(Drawing) | | 一个或两个均可,可按场景逐个选择;仅支持 |
| 视觉风格(Look) | | 一个 |
| 特效(Effects) | | 无、一个或两个均可 |
| 字幕(Captions) | | 一个 |
| 配音(Voice) | | 一个 |
| 声音(Sound) | | 一个 |
| 可选步骤(Optional steps) | | 无、一个或两个均可 |
Presets
预设
- : products, interfaces, data and architecture, with real UI and bold type.
studio - : a concept or process in under a minute, drawn on paper and blueprint.
sketchbook - : a video about Havooch, the sketchbook in Havooch's colours with Havuç the cat.
havooch
- :适用于产品、界面、数据和架构,采用真实 UI 和粗体字排版。
studio - :用纸张和蓝图风格,在不到一分钟内讲解一个概念或流程。
sketchbook - :关于 Havooch 的视频,采用 Havooch 的配色和 sketchbook 风格,并加入 Havuç 猫。
havooch
Steps
步骤
- Open the studio. Work in . Every checkout and worktree shares one videos root; references/videos-root.md says where a video's files go.
<studio>- When there's no clone: clone the studio to , run
<studio>,npm installandnpm run setup:voice, and render the README's smoke-test video once to confirm it works. It needsnpm run setup:skillsandffmpeg.espeak-ng - When or
.claude/skills/remotion-best-practices/is missing: runfframes-video.npm run setup:skills
- When there's no clone: clone the studio to
- Learn the subject. Read the source project until you can explain what the user asked about, end to end.
- Ask once. Ask in a single round, and only what the request and the project leave open: what the viewer should take away, the length, the preset or the layer choices. When nothing is open, ask nothing. Then work to the MP4 with no more check-ins. The one exception is the effect: the user picks each effect from a prototype sheet in step 7.
shaders- When nobody can answer, such as when you run as a sub-agent: decide, and write each decision into the brief.
- Scaffold. creates
npm run new-video -- <project>-<topic>and prints its path. Pass<root>/<slug>/when the preset or the brief sets one.--fps <n> - Choose the layers. Take the preset's choices, then apply the user's changes. Check each option's needs in its reference. Write the choices into the brief's Choices lines, and read the reference of every chosen option.
- When the look has no code for the chosen renderer or drawing: follow "A look in a new renderer" in references/layers.md.
- With : do it now, before the brief.
reference-study - With : from here on, end every step with a snapshot, as references/steps/process-page.md says.
process-page
- Brief and script. Fill : the goal, the audience, the length, the look notes, one line of narration per scene, and every asset the scenes show. Kokoro speaks about 2.5 words a second, so budget the words against the length. Write for the ear: references/pronunciation.md.
<root>/<slug>/brief.md- Done when each scene has its line, and every sentence names something that appears or moves on screen.
- Asset sheet. Draw every character, prop, UI mock and diagram element on one still: in Remotion, a frame of the project in FFrames (the renderer reference says how). Look at it, and fix what collides, reads badly or overflows.
<root>/<slug>/Sheet.tsx- With : draw the candidate effects on the sheet, and let the user pick: references/effects/shaders.md.
shaders - Done when every asset in the brief is on the sheet and reads at a glance.
- With
- Voice. Put the narration in , one scene per line, and run
voiceover.json. Find each cue word in the scene'snpm run voice -- <slug>.words- Done when every scene has and
durationSeconds, and the total is within about 10 % of the length.words
- Done when every scene has
- Storyboard. Build each scene at its end pose, with no motion yet, and render a still of its last frame. Fix overlaps, text outside its shape and empty halves of the frame.
- Done when every end pose reads as the brief says.
- Animate. Add the motion. Cue every reveal on the narration word it shows. Run the sound layer with the final length, then place the music and the sound effects, and add the effects the choices name.
- Done when every reveal has a word cue, and passes (in FFrames,
npx tsc -p "$(npm run --silent root)").cargo build
- Check and render. Look at stills at key frames, then render the MP4 to , as the renderer reference says. Look at a contact sheet of the render (
<root>/<slug>/out/<slug>.mp4; addnpm run sheet -- <slug>for a video under 15 seconds) and at stills two or three frames after the cues. For fast motion, render four stills a few frames apart. Look for:--every 0.125
- a reveal off its word, or something appearing with no cue;
- a stretch where the voice talks and nothing moves;
- text outside its box, overlaps, a trail left after a flight;
- a rotation fast enough to look frozen.
- Done when a round of stills and the sheet finds none of these.
- Final checks. Run on the MP4.
ffprobe
- Done when the frame count equals the summed scene frames, the size and fps match , and there is an audio stream.
config.ts - With : build the page now.
process-page
- Hand over. Give the user the full path of the MP4 and of anything they asked for, the choices the video used, and in the studio to preview or tweak it.
npm run dev
- 打开 studio。 在 中工作。所有 checkout 和 worktree 共享同一个 videos root;references/videos-root.md 说明视频文件应放置的位置。
<studio>- 尚未 clone 时: 将 studio clone 到 ,运行
<studio>、npm install和npm run setup:voice,并渲染一次 README 中的 smoke-test 视频以确认其正常工作。运行需要npm run setup:skills和ffmpeg。espeak-ng - 当 或
.claude/skills/remotion-best-practices/缺失时: 运行fframes-video。npm run setup:skills
- 尚未 clone 时: 将 studio clone 到
- 了解主题。 持续阅读源项目,直到能够从头到尾解释用户所问的内容。
- 只询问一次。 在单轮中提问,并且只询问请求和项目尚未明确的事项:观众看完应掌握什么、时长、preset 或 layer 选择。如果没有任何待定事项,则不要提问。此后持续制作到 MP4,不再询问。唯一例外是 特效:用户在第 7 步从 prototype sheet 中选择每个特效。
shaders- 无人能够回答时(例如以 sub-agent 身份运行时):自行决定,并将每项决定写入 brief。
- 搭建项目结构(Scaffold)。 会创建
npm run new-video -- <project>-<topic>并打印其路径。当 preset 或 brief 指定了帧率时,传入<root>/<slug>/。--fps <n> - 选择图层。 先沿用 preset 的选择,再应用用户的修改。查看每个选项对应 reference 中的要求。将这些选择写入 brief 的 Choices 行,并阅读每个已选选项的 reference。
- 当所选 Look 没有适配所选 Renderer 或 Drawing 的代码时: 按照 references/layers.md 中的“A look in a new renderer”操作。
- 使用 时: 现在就执行,并在 brief 之前完成。
reference-study - 使用 时: 从这里开始,每一步都以 snapshot 结束,正如 references/steps/process-page.md 所述。
process-page
- Brief 和脚本。 填写 :目标、受众、时长、Look 备注、每个场景一行旁白,以及场景中会展示的每项素材。Kokoro 的语速约为每秒 2.5 个单词,因此要根据时长安排词数。写作时应考虑听感:references/pronunciation.md。
<root>/<slug>/brief.md- 完成标准:每个场景都有对应台词,且每个句子都点明屏幕上会出现或移动的某个内容。
- 素材表(Asset sheet)。 在一张静态画面中绘制所有角色、道具、UI mock 和图示元素:Remotion 中为 ,FFrames 中则放在项目的一帧中(具体做法见 renderer reference)。查看素材表,并修复元素重叠、可读性差或溢出的问题。
<root>/<slug>/Sheet.tsx- 使用 时: 将候选 effects 绘制在素材表上,让用户选择:references/effects/shaders.md。
shaders - 完成标准:brief 中的每项素材都在素材表上,并且一眼就能看懂。
- 使用
- 配音。 将旁白放入 ,每个场景一行,然后运行
voiceover.json。在该场景的npm run voice -- <slug>中找到每个 cue word。words- 完成标准:每个场景都有 和
durationSeconds,并且总时长与目标时长相差约 10% 以内。words
- 完成标准:每个场景都有
- 故事板(Storyboard)。 将每个场景搭建成其结束姿态,暂不添加运动,并渲染最后一帧的静态图。修复元素重叠、文字超出其形状以及画面有一半空置等问题。
- 完成标准:每个结束姿态都符合 brief 的描述。
- 添加动画。 加入运动。让每次 reveal 都以它所对应的旁白词作为 cue。以最终时长运行 sound layer,然后放置 music 和 sound effects,并添加 choices 指定的 effects。
- 完成标准:每个 reveal 都有词 cue,并且 通过(在 FFrames 中则运行
npx tsc -p "$(npm run --silent root)")。cargo build
- 完成标准:每个 reveal 都有词 cue,并且
- 检查并渲染。 查看关键帧的静态图,然后按照 renderer reference 所述,将 MP4 渲染到 。查看渲染结果的 contact sheet(
<root>/<slug>/out/<slug>.mp4;对于短于 15 秒的视频,加上npm run sheet -- <slug>),并查看各个 cue 之后两三帧的静态图。对于快速运动,渲染间隔几帧的四张静态图。检查:--every 0.125- reveal 与对应词错位,或有内容在没有 cue 的情况下出现;
- 旁白持续说话但画面没有任何动静;
- 文字超出文本框、元素重叠,或飞行后留下残影;
- 旋转速度快到看起来像卡住。
- 完成标准:一轮静态图检查和 contact sheet 检查未发现上述任何问题。
- 最终检查。 对 MP4 运行 。
ffprobe- 完成标准:帧数等于所有场景帧数之和,尺寸和 fps 与 一致,并且存在音频流。
config.ts - 使用 时: 现在构建页面。
process-page
- 完成标准:帧数等于所有场景帧数之和,尺寸和 fps 与
- 交付。 向用户提供 MP4 及用户要求的其他内容的完整路径、视频使用的 choices,以及用于预览或调整的 命令。
npm run dev
Rules
规则
- Timing comes from the voice. Scene lengths come only from after
voiceover.json; every reveal is cued on a spoken word. Type no scene length and no guessed cue frame.npm run voice - One scene per file.
- Look before you finish. A render command that succeeds proves nothing: look at the stills, the sheet and the output.
ffprobe - Small edits for feedback. Change the part the user named, and keep the rest.
- Free and local. No paid APIs and no keys. Draw art in code first. When code can't draw it, use a freely licensed file and note its source and licence beside it.
- Videos stay private. A video's files stay in the videos root. Commit only studio code, never a video's files.
- 时序来自配音。 场景长度只能来自运行 后的
npm run voice;每个 reveal 都以说出的词作为 cue。不要输入场景长度,也不要猜测 cue 所在的帧。voiceover.json - 每个文件一个场景。
- 完成前必须查看。 渲染命令成功并不能证明任何问题:务必查看静态图、contact sheet 和 输出。
ffprobe - 针对反馈进行小范围修改。 只修改用户指出的部分,保留其余内容。
- 免费且本地运行。 不使用付费 API 和密钥。优先用代码绘制美术素材。当代码无法绘制时,使用采用自由许可的文件,并在文件旁注明来源和许可。
- 视频保持私密。 视频文件留在 videos root 中。只提交 studio 代码,绝不提交视频文件。
Where the official skills differ
官方 skills 存在差异时的处理方式
Use the official skill of each tool for the tool itself: Remotion's skills ( and the references it routes to) and FFrames' . Where one of them disagrees with this skill, this skill wins. When you find a disagreement the table doesn't list, follow this skill and add a row to this table.
.claude/skills/remotion-best-practices/fframes-video| Where the official skill says | Do this instead |
|---|---|
Remotion | Finish with steps 11 and 12: stills you've looked at, then the MP4, checked with |
Remotion: render or take a still with | |
| Remotion: write scene lengths as literal numbers | Lengths come from |
Remotion | Kokoro through |
Remotion | Sound files are local, in the video's |
Remotion | Plain JSX components and |
Remotion | Captions are the script: references/captions.md. |
| The project is |
| Timing comes from |
| Kokoro through |
对于每种工具本身,使用相应工具的官方 skill:Remotion 的 skills( 以及其中路由到的 references)和 FFrames 的 。如果其中某个官方 skill 与本 skill 不一致,以本 skill 为准。如果发现本表未列出的分歧,遵循本 skill,并向表中新增一行。
.claude/skills/remotion-best-practices/fframes-video| 官方 skill 的说法 | 改为这样做 |
|---|---|
Remotion | 改为完成第 11 和 12 步:查看静态图,然后生成 MP4 并用 |
Remotion:使用 | 使用 |
| Remotion:将场景长度写为字面数字 | 长度通过 |
Remotion | 改用 Kokoro,通过 |
Remotion | 声音文件保存在视频的 |
Remotion | 使用普通 JSX 组件和 |
Remotion | 字幕就是脚本:references/captions.md。 |
| 项目是 |
| 时序来自 |
| 使用通过 |