/html-explainer
把任意主题做成讲解/科普视频并渲染成 MP4(HTML/CSS/GSAP 画面 + 确定性逐帧渲染 + 配音 + 词级硬字幕)。触发场景:要做科普/讲解/教学/知识/产品类视频、「讲一下 X 做成视频」、要挑某种视觉风格(极简/数据/赛博/电影感/品牌)出片、要出抖音封面/竖版封面/9:16 封面、要用 html-video 那种模板化画面但更稳的音画同步、anything2explainer 换 HTML 渲染,或提到 html-explainer / HTML 讲解视频 / explainer video / MG 视频。内置 23 个模板风格(8
$ npx -y skills add OneMoh/html-explainer --skill html-explainer --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/html-explainer
Context preview
The summary Claude sees to decide when to auto-load this skill.
把任意主题做成讲解/科普视频并渲染成 MP4(HTML/CSS/GSAP 画面 + 确定性逐帧渲染 + 配音 + 词级硬字幕)。触发场景:要做科普/讲解/教学/知识/产品类视频、「讲一下 X 做成视频」、要挑某种视觉风格(极简/数据/赛博/电影感/品牌)出片、要出抖音封面/竖版封面/9:16 封面、要用 html-video 那种模板化画面但更稳的音画同步、anything2explainer 换 HTML 渲染,或提到 html-explainer / HTML 讲解视频 / explainer video / MG 视频。内置 23 个模板风格(8
SKILL.md
html-explainer.SKILL.mdname: html-explainer
version: 2.0.7
description: 把任意主题做成讲解/科普视频并渲染成 MP4(HTML/CSS/GSAP 画面 + 确定性逐帧渲染 + 配音 + 词级硬字幕)。触发场景:要做科普/讲解/教学/知识/产品类视频、「讲一下 X 做成视频」、要挑某种视觉风格(极简/数据/赛博/电影感/品牌)出片、要出抖音封面/竖版封面/9:16 封面、要用 html-video 那种模板化画面但更稳的音画同步、anything2explainer 换 HTML 渲染,或提到 html-explainer / HTML 讲解视频 / explainer video / MG 视频。内置 23 个模板风格(8 类)与 40+ 动作词汇的动效库,主题驱动模板编排;支持 4K60、快门运动模糊、多进程提速、断点续渲;流程含六个用户确认点(渲染通道是硬闸门)。独立可移植,不依赖 html-video / anything2explainer。
agent_created: true
html-explainer
> **定位**:`anything2explainer` 的流程与音画同步 + `html-video` 的 **23 个模板风格库**, > 渲染层独立实现。作者 **Moh**,MIT 许可(第三方声明见 `THIRD_PARTY_NOTICES.md`)。 > > **零外部依赖**:不需要 Remotion/npm 工程,不需要 html-video 仓库/Studio/pnpm/agent 后端。 > 技能自带:GSAP(离线)、playwright-core、渲染器、TTS/字幕/时间轴/主题/QC/封面全套脚本。 > 对两个来源项目的引用**只存在于注释署名里**,运行时不读它们的任何文件。 > 风格库是**抄下来的设计规范文本**(`references/style-catalog.md`),来源 `html-video`(Apache-2.0), > 类比:把菜谱抄回家,之后做菜不需要原餐厅营业。
**v2.0 新增能力(全部可选、向下兼容;不用就是 v1.4 行为)**
| 能力 | 入口 | 文档 | |---|---|---| | **动效库**(40+ 动作词汇) | `assets/motion.js` → `window.HXM` | `references/motion-library.md` | | **主题驱动模板编排**(挑风格 / 混用 / 动态开头) | `scripts/style_director.py` | `references/style-director.md` | | **画质帧率档位 + 快门运动模糊 + 提速** | `scripts/render_video.mjs --profile/--quality/--fps/--shutter-only/--motion-hold` | `references/render-profiles.md` | | **渲染基准测试**(优化前后对比) | `scripts/bench_render.py` | `references/render-profiles.md` | | **宣传片范式**(去模板化:模板只吸纳配色/字体/时序三层) | 设计方法 | `references/showcase-mode.md` | | **库全量演示编排**(统一舞台 + 节拍网格 + 标签常驻) | 设计方法 | `references/library-showcase.md` | | **确认闸门**(六个确认点由用户拍板才放行) | `scripts/gate_check.py` | `SKILL.md` 流程第 3 步 | | **★ 渲染通道确认**(渲染前必问:`png-fast` / `jpeg q95` / `png` / `jpeg q82`,**默认推荐 `png-fast`**,附速度与描述) | `consent.json` 的 `render_channel` + `gate_check.py --phase render` | `SKILL.md` 确认点 5 · `references/render-profiles.md` §0 |
把一个主题做成**原创**讲解视频:任意风格的 MG 画面(HTML/CSS/GSAP,1920×1080 或竖版)、 配音(edge-tts)、词级对齐硬字幕、全局进度条。一句话一个场景,画面节拍直接锚在 吐字时刻上(`B('块文本')` 节拍器)。
★ 画面风格库(23 个模板 / 8 个类别)
**不要自己从零想画面 —— 先从风格库里挑;多个风格要混用时用编排器自动挑(见下)。** 挑出候选后交用户拍板(见**确认点 0**),不许静默自选。 完整目录(含每种的画布/字体/时间轴/配色纪律) 见 **`references/style-catalog.md`**;怎么改编成合规帧见 **`references/template-guide.md`**。
**两种用法的深度不同,先分清在做哪一种**:
| 你在做 | 怎么用风格库 | 读这篇 | |---|---|---| | **讲解片**(默认) | 从 23 个模板里**挑一个**,按 `template-guide.md` 改编成帧 | `references/template-guide.md` | | **宣传片 / 发布片**(去模板化) | 只从模板**吸纳配色 / 字体 / 时序骨架三层**,画面语言用 `assets/motion.js` 重写 —— **不搬模板画面** | **`references/showcase-mode.md`** | | **要全量展示某个库**(40+ 动效 / 23 个模板) | 统一舞台 + 节拍网格 + 标签常驻,把「N 个动作」演成「一个动作语言的 N 拍」 | **`references/library-showcase.md`** |
> 判据:成片能被认出「这是 bold-signal 模板」= 吸纳过头;只能说「颜色像 xx、节奏像 yy」= 深度对了。
> **★ v2.0:不要一片只用一个模板。** 用 `scripts/style_director.py` 读解说词, > 自动给每场挑主风格(按角色/时长/关键词打分)、按需搭次风格做**局部替换**、 > 决定**动态开头变体**与**场间转场**、并算出每场的**动效强度**。 > 详见 `references/style-director.md`。核心价值:**让模板服务于主题,而不是让主题被模板限制**。
| 类别 | 可用风格 | |---|---| | 演示 / 标题卡 | 大胆海报帧、大胆信号卡帧、奢华极简留白帧、创意电压分屏帧、电光工作室分屏帧、故障艺术标题帧、Kinetic Type、Swiss Grid、Warm Grain | | 数据可视化 | NYT 风数据图表帧、数据滚动帧、NYT Graph、瑞士网格数据帧 | | 图解 / 流程 | 东方柔和有机帧、Decision Tree | | 氛围 / 空镜 | 胶片漏光电影帧 | | 营销 / Hero | 流体背景 Hero 帧 | | 片头片尾 | 品牌 Logo 收尾帧 | | 社媒竖版 | Play Mode、Vignelli(9:16)| | 产品演示 | Product Promo、Product Promo · 30s | | 特效 | VFX 文字光标 |
**两类模板、两种改编成本**(速查表「类型」列):
| 类型 | 数量 | 处理 | |---|---|---| | **★ rich** | 12 | 单文件 + 纯 CSS `@keyframes`。**零改动可渲染** —— 只需①换系统字体栈(删 Google Fonts)②让出底部字幕带③填真实内容 | | **gsap** | 11 | 多 composition + CDN GSAP(或 Remotion)。**不要搬代码**,只取视觉 DNA 用 CSS keyframes 重写(搬进来会得到静止首帧且零报错,见 `lessons.md` #9)|
> 时长档要匹配内容:`frame-bold-signal` 是 3–6s 的短片花,拉长到 20s 会空。 > 长段(>10s)优先选 3–30s 档的(Swiss Grid / Kinetic Type / NYT Graph / Warm Grain)。
何时用 / 不用
- 用:给主题/文章/文档做讲解视频;要挑某种视觉风格出片;要 html-video 那种模板化画面但要求音画稳;要 anything2explainer 流程但不想装 Remotion。
- 不用:复刻现有视频、真人口播、实拍为主;要 Remotion/React 代码动画本体(那是 anything2explainer 的领域)。
环境(首台机器跑一次)
bash <skill>/setup_env.sh # 自检;--install 联网补装
依赖:Python≥3.9(edge-tts==7.2.8 钉死 / numpy / pillow / imageio-ffmpeg)、Node≥18、 **火山引擎零额外依赖**(`tts_volcano.py` 只用标准库 `urllib`,不需要装任何 SDK)。 Chrome 或 Edge(几乎必有;都没有才下载 playwright chromium ~115MB)、ffmpeg(PATH 或 imageio-ffmpeg 静态二进制自动回退)。Windows 注意:项目路径全 ASCII;给 Node/Python 传 `C:/...` 正斜杠路径;别用 heredoc 给 Python 传正则。
命令流水线(项目目录内,顺序不能乱)
PY=<venv python 绝对路径> # 派子 agent 时必须展开成绝对路径写进 prompt
"$PY" <skill>/scripts/new_project.py <dir> <slug> --topic "主题" # 阶段 0 建项目
"$PY" <skill>/scripts/tts_setup.py --project . # ★ 先定配音方案 + 音色(问用户:edge / 火山)
"$PY" <skill>/scripts/tts_build.py --project . # 配音:audio/*.mp3 + manifest
"$PY" <skill>/scripts/timeline_build.py --project . # 全局时间轴:layout.json + narration-full.mp3
"$PY" <skill>/scripts/subs.py --project . # 字幕:subs.json + beats.js + srt/vtt
"$PY" <skill>/scripts/check_beats_refs.py --project . # ★ 节拍引用校验:B()/Be() 是否都能解析(前缀匹配,失配秒级报出可用块)
"$PY" <skill>/scripts/style_director.py --project . # ★ v2.0 风格编排:读解说词给每场挑主/次风格 + 开场变体 + 转场 + 动效强度 → style-plan.json
"$PY" <skill>/scripts/gate_check.py --project . # ★★ 确认闸门:六个确认点未由用户拍板 → 拒绝放行(缺 consent.json 用 --init 生成)
"$PY" <skill>/scripts/gate_check.py --project . --phase render # ★★ 渲染前必过:render_channel(渲染通道)未拍板 → 拒绝渲染
"$PY" <skill>/scripts/lint_frames.py --project . # 静态体检:八条契约违规(渲染前一秒出结果,比渲完再发现便宜得多)
node <skill>/scripts/check_layout.mjs . # ★ 几何体检:越界 / 侵入字幕带 / 元素互相遮挡(lint 看不见几何)
node <skill>/scripts/render_video.mjs . [--audio audio/narration-full.mp3] [--profile draft|balanced|final|master] [--quality 1080p|2k|4k] [--fps 30|60] [--shutter 180] [--shutter-flush 4] [--shutter-only <场景id,场景id>] [--motion-hold 1] [--preview 30] [--keep-frames] [--only <场景id>] [--mux-only] [--png-fast|--jpeg --jpeg-quality 95] [--workers N] [--concurrency N] [--resume] # 渲染:out/<slug>.mp4(★ 通道/档位先按确认点 5 问过用户;★ 通道与档位必须一起报——`--jpeg` 与默认快门同时用,中间帧扩展名要一路贯穿到积分器;★ 快门覆盖面也要问:全片开还是 `--shutter-only` 点名几场)
"$PY" <skill>/scripts/qc_check.py --project . # 体检 + 抽帧速览图
node <skill>/scripts/cover_build.m
Read more
name: html-explainer version: 2.0.7 description: 把任意主题做成讲解/科普视频并渲染成 MP4(HTML/CSS/GSAP 画面 + 确定性逐帧渲染 + 配音 + 词级硬字幕)。触发场景:要做科普/讲解/教学/知识/产品类视频、「讲一下 X 做成视频」、要挑某种视觉风格(极简/数据/赛博/电影感/品牌)出片、要出抖音封面/竖版封面/9:16 封面、要用 html-video 那种模板化画面但更稳的音画同步、anything2explainer 换 HTML 渲染,或提到 html-explainer / HTML 讲解视频 / explainer video / MG 视频。内置 23 个模板风格(8 类)与 40+ 动作词汇的动效库,主题驱动模板编排;支持 4K60、快门运动模糊、多进程提速、断点续渲;流程含六个用户确认点(渲染通道是硬闸门)。独立可移植,不依赖 html-video / anything2explainer。 agent_created: true
html-explainer
> **定位**:`anything2explainer` 的流程与音画同步 + `html-video` 的 **23 个模板风格库**, > 渲染层独立实现。作者 **Moh**,MIT 许可(第三方声明见 `THIRD_PARTY_NOTICES.md`)。 > > **零外部依赖**:不需要 Remotion/npm 工程,不需要 html-video 仓库/Studio/pnpm/agent 后端。 > 技能自带:GSAP(离线)、playwright-core、渲染器、TTS/字幕/时间轴/主题/QC/封面全套脚本。 > 对两个来源项目的引用**只存在于注释署名里**,运行时不读它们的任何文件。 > 风格库是**抄下来的设计规范文本**(`references/style-catalog.md`),来源 `html-video`(Apache-2.0), > 类比:把菜谱抄回家,之后做菜不需要原餐厅营业。
**v2.0 新增能力(全部可选、向下兼容;不用就是 v1.4 行为)**
| 能力 | 入口 | 文档 | |---|---|---| | **动效库**(40+ 动作词汇) | `assets/motion.js` → `window.HXM` | `references/motion-library.md` | | **主题驱动模板编排**(挑风格 / 混用 / 动态开头) | `scripts/style_director.py` | `references/style-director.md` | | **画质帧率档位 + 快门运动模糊 + 提速** | `scripts/render_video.mjs --profile/--quality/--fps/--shutter-only/--motion-hold` | `references/render-profiles.md` | | **渲染基准测试**(优化前后对比) | `scripts/bench_render.py` | `references/render-profiles.md` | | **宣传片范式**(去模板化:模板只吸纳配色/字体/时序三层) | 设计方法 | `references/showcase-mode.md` | | **库全量演示编排**(统一舞台 + 节拍网格 + 标签常驻) | 设计方法 | `references/library-showcase.md` | | **确认闸门**(六个确认点由用户拍板才放行) | `scripts/gate_check.py` | `SKILL.md` 流程第 3 步 | | **★ 渲染通道确认**(渲染前必问:`png-fast` / `jpeg q95` / `png` / `jpeg q82`,**默认推荐 `png-fast`**,附速度与描述) | `consent.json` 的 `render_channel` + `gate_check.py --phase render` | `SKILL.md` 确认点 5 · `references/render-profiles.md` §0 |
把一个主题做成**原创**讲解视频:任意风格的 MG 画面(HTML/CSS/GSAP,1920×1080 或竖版)、 配音(edge-tts)、词级对齐硬字幕、全局进度条。一句话一个场景,画面节拍直接锚在 吐字时刻上(`B('块文本')` 节拍器)。
★ 画面风格库(23 个模板 / 8 个类别)
**不要自己从零想画面 —— 先从风格库里挑;多个风格要混用时用编排器自动挑(见下)。** 挑出候选后交用户拍板(见**确认点 0**),不许静默自选。 完整目录(含每种的画布/字体/时间轴/配色纪律) 见 **`references/style-catalog.md`**;怎么改编成合规帧见 **`references/template-guide.md`**。
**两种用法的深度不同,先分清在做哪一种**:
| 你在做 | 怎么用风格库 | 读这篇 | |---|---|---| | **讲解片**(默认) | 从 23 个模板里**挑一个**,按 `template-guide.md` 改编成帧 | `references/template-guide.md` | | **宣传片 / 发布片**(去模板化) | 只从模板**吸纳配色 / 字体 / 时序骨架三层**,画面语言用 `assets/motion.js` 重写 —— **不搬模板画面** | **`references/showcase-mode.md`** | | **要全量展示某个库**(40+ 动效 / 23 个模板) | 统一舞台 + 节拍网格 + 标签常驻,把「N 个动作」演成「一个动作语言的 N 拍」 | **`references/library-showcase.md`** |
> 判据:成片能被认出「这是 bold-signal 模板」= 吸纳过头;只能说「颜色像 xx、节奏像 yy」= 深度对了。
> **★ v2.0:不要一片只用一个模板。** 用 `scripts/style_director.py` 读解说词, > 自动给每场挑主风格(按角色/时长/关键词打分)、按需搭次风格做**局部替换**、 > 决定**动态开头变体**与**场间转场**、并算出每场的**动效强度**。 > 详见 `references/style-director.md`。核心价值:**让模板服务于主题,而不是让主题被模板限制**。
| 类别 | 可用风格 | |---|---| | 演示 / 标题卡 | 大胆海报帧、大胆信号卡帧、奢华极简留白帧、创意电压分屏帧、电光工作室分屏帧、故障艺术标题帧、Kinetic Type、Swiss Grid、Warm Grain | | 数据可视化 | NYT 风数据图表帧、数据滚动帧、NYT Graph、瑞士网格数据帧 | | 图解 / 流程 | 东方柔和有机帧、Decision Tree | | 氛围 / 空镜 | 胶片漏光电影帧 | | 营销 / Hero | 流体背景 Hero 帧 | | 片头片尾 | 品牌 Logo 收尾帧 | | 社媒竖版 | Play Mode、Vignelli(9:16)| | 产品演示 | Product Promo、Product Promo · 30s | | 特效 | VFX 文字光标 |
**两类模板、两种改编成本**(速查表「类型」列):
| 类型 | 数量 | 处理 | |---|---|---| | **★ rich** | 12 | 单文件 + 纯 CSS `@keyframes`。**零改动可渲染** —— 只需①换系统字体栈(删 Google Fonts)②让出底部字幕带③填真实内容 | | **gsap** | 11 | 多 composition + CDN GSAP(或 Remotion)。**不要搬代码**,只取视觉 DNA 用 CSS keyframes 重写(搬进来会得到静止首帧且零报错,见 `lessons.md` #9)|
> 时长档要匹配内容:`frame-bold-signal` 是 3–6s 的短片花,拉长到 20s 会空。 > 长段(>10s)优先选 3–30s 档的(Swiss Grid / Kinetic Type / NYT Graph / Warm Grain)。
何时用 / 不用
- 用:给主题/文章/文档做讲解视频;要挑某种视觉风格出片;要 html-video 那种模板化画面但要求音画稳;要 anything2explainer 流程但不想装 Remotion。
- 不用:复刻现有视频、真人口播、实拍为主;要 Remotion/React 代码动画本体(那是 anything2explainer 的领域)。
环境(首台机器跑一次)
bash <skill>/setup_env.sh # 自检;--install 联网补装
依赖:Python≥3.9(edge-tts==7.2.8 钉死 / numpy / pillow / imageio-ffmpeg)、Node≥18、 **火山引擎零额外依赖**(`tts_volcano.py` 只用标准库 `urllib`,不需要装任何 SDK)。 Chrome 或 Edge(几乎必有;都没有才下载 playwright chromium ~115MB)、ffmpeg(PATH 或 imageio-ffmpeg 静态二进制自动回退)。Windows 注意:项目路径全 ASCII;给 Node/Python 传 `C:/...` 正斜杠路径;别用 heredoc 给 Python 传正则。
命令流水线(项目目录内,顺序不能乱)
PY=<venv python 绝对路径> # 派子 agent 时必须展开成绝对路径写进 prompt "$PY" <skill>/scripts/new_project.py <dir> <slug> --topic "主题" # 阶段 0 建项目 "$PY" <skill>/scripts/tts_setup.py --project . # ★ 先定配音方案 + 音色(问用户:edge / 火山) "$PY" <skill>/scripts/tts_build.py --project . # 配音:audio/*.mp3 + manifest "$PY" <skill>/scripts/timeline_build.py --project . # 全局时间轴:layout.json + narration-full.mp3 "$PY" <skill>/scripts/subs.py --project . # 字幕:subs.json + beats.js + srt/vtt "$PY" <skill>/scripts/check_beats_refs.py --project . # ★ 节拍引用校验:B()/Be() 是否都能解析(前缀匹配,失配秒级报出可用块) "$PY" <skill>/scripts/style_director.py --project . # ★ v2.0 风格编排:读解说词给每场挑主/次风格 + 开场变体 + 转场 + 动效强度 → style-plan.json "$PY" <skill>/scripts/gate_check.py --project . # ★★ 确认闸门:六个确认点未由用户拍板 → 拒绝放行(缺 consent.json 用 --init 生成) "$PY" <skill>/scripts/gate_check.py --project . --phase render # ★★ 渲染前必过:render_channel(渲染通道)未拍板 → 拒绝渲染 "$PY" <skill>/scripts/lint_frames.py --project . # 静态体检:八条契约违规(渲染前一秒出结果,比渲完再发现便宜得多) node <skill>/scripts/check_layout.mjs . # ★ 几何体检:越界 / 侵入字幕带 / 元素互相遮挡(lint 看不见几何) node <skill>/scripts/render_video.mjs . [--audio audio/narration-full.mp3] [--profile draft|balanced|final|master] [--quality 1080p|2k|4k] [--fps 30|60] [--shutter 180] [--shutter-flush 4] [--shutter-only <场景id,场景id>] [--motion-hold 1] [--preview 30] [--keep-frames] [--only <场景id>] [--mux-only] [--png-fast|--jpeg --jpeg-quality 95] [--workers N] [--concurrency N] [--resume] # 渲染:out/<slug>.mp4(★ 通道/档位先按确认点 5 问过用户;★ 通道与档位必须一起报——`--jpeg` 与默认快门同时用,中间帧扩展名要一路贯穿到积分器;★ 快门覆盖面也要问:全片开还是 `--shutter-only` 点名几场) "$PY" <skill>/scripts/qc_check.py --project . # 体检 + 抽帧速览图 node <skill>/scripts/cover_build.m
一个 Agent Skill:给任意主题,产出一条带配音、硬字幕、封面的讲解视频。 HTML 写画面 → 确定性逐帧渲染 → 真 MP4。全本地跑,核心链路零 API key、零按次计费。 画面用一套可 seek 的动效库写,风格由主题驱动编排,渲染支持 4K60、快门运动模糊与多进程并行。 两条用本技能生成的成片——画面、配音、字幕、封面全部由流水线产出,无手工后期。 封面等素材托管在演示仓库,本仓库零体积。

