Communitygithub.com

系列讲解视频全流程制作 (EMzhe/explainer-video-series)

AI 代理技能,用于自动完成系列讲解视频的完整制作流程:从内容策划、HTML 动画页面生成、讲解稿编写、TTS 配音、字幕合成到最终 1080p 视频输出和抖音封面制作。内置四道用户确认门禁和发音修正功能。

explainer-video-series)란 무엇인가요?

该技能专为 AI 代理(如 Claude Code)设计,能够自动化地、分步骤地创建带有旁白和字幕的系列讲解视频。它能够将一个主题(比如道德经的某个章节)转化为一段完整的视频成片,整个过程包括策划、页面编排、配音、字幕合成和最终渲染。该技能的核心优势在于其高度结构化和确定性的工作流程,支持两种视频制作路线:默认的 HTML 动画路线可以生成带有入场动画和页面切换效果的演示页面并渲染成视频;静态 PPT 路线作为备选,适用于需要复杂表格或原生 PPT 格式的场景。为了确保输出质量,流程中嵌入了四道确认门禁,分别在开工前、讲解稿审阅、音色选择和最终合成前要求用户确认。此外,它还内置了发音修正能力,例如确保‘老子’一词在 TTS 中被正确朗读。该技能支持从零开始制作新视频、按上一期风格继续制作、以及为最终成片生成适配抖音的横版和竖版封面。

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/EMzhe/explainer-video-series/tree/HEAD

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

系列讲解视频全流程制作

把「一个主题」变成「一期成片」:策划 → 页面编排(HTML 动画) → 讲解稿 → 配音 → 字幕 → 1080p MP4 → 抖音封面(横 16:9 + 竖 9:16)。 默认风格档案沉淀自《道德经》讲解视频系列实战(新中式水墨 / 云健男声 / 白字黑发光字幕),整套可复用,逐项可覆盖。

画面路线(v2.0 起默认走 HTML 动画;v2.1 图文协同):

  • 默认:HTML 动画页——基于讲解词生成带入场动效与页间交叉淡化的 HTML 演示页,确定性逐帧渲染成视频,动画 100% 同步进成片(方案与编排规则见 references/html-animation.md)。
  • v2.1 图文协同:内置水墨 SVG 场景库(水波孤舟/涟漪/山峦/墨竹/望月/锦鲤)+ 条目图标 + 外链图片支持,按讲解词自动匹配或显式指定,图形部件错峰入场与文字动效统一编排。
  • 回退:静态 PPT 帧 + xfade(需要原生 PPT 表格/复杂版式、或用户点名要 .pptx 时用)。

v2.3 起每期标配抖音封面:横版 16:9 + 竖版 9:16,按主题 AI 生成成套(横版锚点→用户确认→竖版派生),不取视频帧;流程见阶段 ⑥ 与 references/douyin-covers.md。

开工五问(每期开工先问;用户说「按上期来」「老规矩」则全部取默认直接开工)

  1. 这期讲什么?(主题 / 经文章节)
  2. 内容深度:详细讲解 / 要点讲解?(默认:详细讲解)
  3. 成片时长目标?(默认 6-7 分钟)
  4. PPT 风格沿用新中式水墨?(默认:是)
  5. 音色沿用云健、字幕白字黑发光?(默认:是)

风格档案(用户未指定时直接采用)

项目默认值
PPT 风格新中式水墨:宣纸米白 + 墨黑 + 黛青 + 朱砂
字体标题 SimSun(宋体),正文 Microsoft YaHei(SlideDSL 一律用英文 font-family)
画面元素SVG 水墨插画(不用 AI 生图,保真度 100%、可反复改)
动画HTML 动画页:标题 blur-in / 条目错峰 fade-up / 页间交叉淡化 / cue 要点强调(原「元素动画被否」针对 ffmpeg 叠加方案,HTML 确定性渲染路线已于 v2.0 落地验证)
音色zh-CN-YunjianNeural(云健 · 男 · 浑厚)
语速+0%(整篇统一;仅当用户显式要求才改,不得按内容密度分段变速)
字幕白字 + 黑色外发光(blur 0.8),透明背景,底部居中
画幅1920×1080(16:9)
发音修正「老子」→ TTS 读「老紫」(lǎo zǐ 文读三声),字幕仍显示「老子」
抖音封面横版 16:9 + 竖版 9:16;期名四字大字;AI 生成成套(锚点链),不取视频帧

工作目录约定

在工作区建 视频工作目录/,每期一个子目录(以主题命名):

视频工作目录/{期名}/
├── {BASE} 讲解稿.json          # 单一数据源:标题/音色/发音修正/每页讲解词(+页面文案)
├── {BASE} 讲解稿_可编辑.txt    # export_txt.py 导出,供用户记事本审阅
├── 01_deck/                    # deck.html(动画演示页,可预览) + deck.json(时间轴清单)
├── 01_html_frames/             # f_XXXXX.png 逐帧 + frames_manifest.json(HTML 路线)
├── 01_frames/                  # frame_01.png ...(静态 PPT 回退路线)
├── 02_audio/                   # slide_01.mp3 ... slide_NN.mp3(逐页语音)
├── 配音试听/                   # 多音色试听 mp3 + 配音试听.html
└── 03_output/                  # 成品 {BASE}(带字幕).mp4

BASE = 期名(若含「讲解稿」字样自动剥除)。讲解稿 JSON 用 Python json.dump 程序化生成,禁止手写含中文引号的 JSON(会转义报错)。 封面画布 {期名}-抖音封面.miora 按生成媒体交付规范放工作区根,双尺寸 PNG 在其 _assets/ 目录。

分阶段流程(含 4 道确认门禁,每道门禁拿到用户答复再继续)

开工前(首次或环境异常时)先跑环境体检:python scripts/doctor.py,MISSING 补齐再开工。 节奏底线、闸门清单、BGM 与改版范围表见 references/pacing-and-gates.md (融合自 liyupi/ai-promo-video-maker 的方法论:节奏硬标准 / 数据校验 / 双闸门 / 改版纪律)。

阶段 ① 内容策划(门禁 1:开工五问)

按五问确定方案后,产出简短策划包(文案结构 / 视觉方案 / 音频方案),用户认可后进 ②。

阶段 ② 页面编排(HTML 动画路线 = 默认)

  • 不再做 PPT:直接程序化生成 {BASE} 讲解稿.json,逐页写讲解词 text; 每页可选 title(页面标题)、points(屏幕条目数组)、layout(title/bullets/quote/end)、 cues(要点强调,见下)——缺省时由讲解词自动推导(规则见 references/html-animation.md), 但正式制作建议显式给出,质量更稳。
  • 页数按内容深度定(详细讲解约 8 页);表格/数据仍建议走静态 PPT 回退路线。

阶段 ②′ PPT 制作(静态回退路线)

  • 用 workbuddy-pptx(SlideDSL)制作幻灯片,页数按内容深度定(详细讲解约 8 页)。
  • 演讲者备注(notes)= 逐页讲解词:一次写入,多处复用(视频配音 / DOCX 时间轴 / 剪映导入)。
  • 字体用英文名(SimSun / Microsoft YaHei),中文名不渲染。
  • 配色与元素按风格档案;表格/数据页优先原生 PPT 元素。

阶段 ③ 讲解稿定稿(门禁 2:讲解稿审阅)

  1. 从 PPT notes 提取讲解词,程序化生成 {BASE} 讲解稿.json(结构见下)。

  2. 导出可编辑文本供审阅:

    python scripts/export_txt.py "{BASE} 讲解稿.json"
    
  3. 明确提示用户用记事本打开 txt 逐页审阅;用户改完返回后同步回 JSON:

    python scripts/import_txt.py "{BASE} 讲解稿.json" "{BASE} 讲解稿_可编辑.txt"
    

    用户仅回复「文案可以」无修改时跳过同步。

阶段 ④ 配音(门禁 3:音色试听,硬门禁 voice_confirmed)

  1. 生成试听页让用户选音色:

    python scripts/preview_voices.py 配音试听
    
  2. 用户选定后写入 JSON 并置 voice_confirmed=true(缺它 TTS 与合成直接拒绝执行):

    python -c "import json;p='{BASE} 讲解稿.json';d=json.load(open(p,encoding='utf-8'));d['voice']='zh-CN-YunjianNeural';d['rate']='+0%';d['voice_confirmed']=True;json.dump(d,open(p,'w',encoding='utf-8'),ensure_ascii=False,indent=2)"
    

    语速默认 +0% 不动;仅当用户显式要求变速才改,且整篇统一。

阶段 ⑤ 成片合成(门禁 4:合成前向用户确认开工)

顺序:合成语音 → 生成动画页 → 渲染帧 → 合成视频(HTML 路线);或 渲染帧 → 语音 → 视频(静态路线)。

HTML 动画路线(默认):

  1. 合成逐页语音(必须先做——页面时长取自真实语音时长):

    python scripts/tts_synth.py --narration "{BASE} 讲解稿.json" --out 02_audio
    
  2. 生成动画演示页(deck.html 可用浏览器 #preview 预览动画):

    python scripts/gen_html_deck.py --narration "{BASE} 讲解稿.json" --audio 02_audio --out 01_deck
    
  3. 逐帧渲染(只渲染动画窗口,几分钟内完成):

    node scripts/render_html_frames.mjs --deck 01_deck --out 01_html_frames
    
  4. 合成视频(concat 帧序列 + 逐句字幕,白字黑发光默认样式):

    python scripts/compose_html_video.py --deck 01_deck --frames 01_html_frames --audio 02_audio --narration "{BASE} 讲解稿.json" --out 03_output
    

    默认产出 {BASE}(带字幕).mp4;--also-plain 加出无字幕版; --bgm <文件> 加背景音乐(自动 ducking,旁白起时压低音乐;曲库 Mixkit 免费可商用,须用户试听后定)。

静态 PPT 回退路线:

  1. 渲染画面帧(首选 PowerPoint COM,需本机装 PowerPoint):

    powershell -ExecutionPolicy Bypass -File scripts/export_frames.ps1 -Pptx "{BASE}.pptx" -OutDir 01_frames
    

    已有 PDF 时可用 pymupdf 路径:python scripts/pdf_to_frames.py "{BASE}.pdf" 01_frames 1920。 渲染后抽查 3 页(首页/内容密的一页/表格页)确认无字体异常。

  2. 合成逐页语音:同上 tts_synth.py。

  3. 合成视频(静态页 + xfade + 逐句字幕):

    python scripts/compose_video.py --frames 01_frames --audio 02_audio --narration "{BASE} 讲解稿.json" --out 03_output
    
  4. 验证交付:入场/转场点抽帧确认动画正常、无黑闪;页中段抽帧确认字幕; 跑成片闸门:python scripts/verify_output.py --video "03_output/{BASE}(带字幕).mp4" --deck 01_deck (规格/时长/响度/黑帧/静音全过才交付);present_files 交付。

阶段 ⑥ 抖音封面(每期标配:横版 16:9 + 竖版 9:16)

成片交付时一并给封面,方便直接上传抖音。不取视频帧——按本期主题 AI 生成成套,交付 .miora 画布 + 双尺寸 PNG; 提示词模板 / 意象对照 / 质检清单见 references/douyin-covers.md。用户明说不要封面时跳过。

  1. 文案:期名四字做图上唯一大字(如「有无相生」);不加副题小字(必糊);除主文案外画面零文字。
  2. 成套锚点链(硬规则):横版锚点(纯文生图 1920×1080)→ 用户确认 → 竖版以锚点为参考图派生(1080×1920,竖向三段式);风格 token 原文复用,禁止两张盲发。
  3. 视觉:与成片同风格(宣纸米白 + 墨黑 + 黛青 + 朱砂、水墨晕染、疏朗留白);意象从本期主题取(如「有无相生」→ 圆月 + 水中月影倒影)。
  4. 尺寸照实:模型取整可能给 1920×1072 / 1072×1920(差 8px),如实报告;用户要精确再补边到标准值。
  5. 交付:工作区根 {期名}-抖音封面.miora + 双尺寸图卡片;封面文案与尺寸记入 需求确认.md。

(需要文字 100% 可控或跨期复用模板时,改走可编辑设计稿排版导出;默认 AI 生成。)

阶段 ⑦ 微调迭代

  • 每期目录维护 需求确认.md:五问答案 + 每轮修改记录(用户原话入档),收到反馈先记后改、 只重做必要步骤(改动范围→重做步骤对照表见 references/pacing-and-gates.md)。
  • 字幕样式/颜色调整 → 见 references/subtitle-style.md(ASS 颜色是 BBGGRR 反序,必读)。
  • 发音问题 → 只改 tts_replacements 重跑 TTS + 合成,字幕不动。
  • 字幕同步 → compose 优先读 02_audio/timing_XX.json(TTS 句级真实时间轴,tts_synth 自动产出)。
  • 画面/动画问题(HTML 路线)→ 改讲解稿 JSON 的 title/points/visual/cues 或 gen_html_deck.py 编排 → 重跑 生成 deck → 渲染 → 合成(音频复用,除非讲解词也改了)。
  • 画面问题(静态路线)→ 改 PPT 重导帧,音频复用。
  • 封面修改 → 文案/意象不对只重出对应件;风格整体不对重出锚点再派生(见 references/douyin-covers.md)。

阶段 ⑧ 交付验收(自检清单)

  • 画面:字体/配色无异常;表格页(若有)渲染正确
  • 动画:标题/条目入场自然、页间转场平滑、cue 强调与讲解对位(HTML 路线)
  • 配音:可听清、无吞字、语速全篇统一
  • 发音:文读词正确(如「老子」= lǎo zǐ)
  • 字幕:与语音逐句同步、样式统一、无溢出裁切
  • 转场:交叉淡化平滑、无黑闪、无空白帧
  • 时长:≈ 目标时长(±10 秒)
  • 格式:1920×1080 / H.264 / AAC / .mp4
  • 封面:横竖两版四字无缺笔、风格成套、尺寸照实(清单见 references/douyin-covers.md)

讲解稿 JSON 结构(单一数据源)

{
  "title": "老子今读-上善若水",
  "voice": "zh-CN-YunjianNeural",
  "rate": "+0%",
  "voice_confirmed": true,
  "tts_replacements": { "老子": "老紫" },
  "slides": [
    { "idx": 1, "text": "第一页讲解词……" },
    { "idx": 2, "text": "第二页讲解词……",
      "title": "水的三种品格", "points": ["利他,滋养万物", "不争,甘居下位"],
      "cues": [ { "t": 4.5, "dur": 0.9, "target": 0 } ] }
  ]
}
  • idx 从 1 连续编号,与 frame_XX.png(静态路线)/ slide_XX.mp3 严格对应。
  • HTML 动画路线每页可选字段:title(页面标题)、points(屏幕条目数组)、 layout(title/bullets/quote/end)、cues(要点强调:t=页内相对秒、target=条目序号 0 起、 dur=强调时长、action=pulse);图文协同(v2.1):visual(水墨场景 water/ripples/mountain/ bamboo/moon/fish,缺省按讲解词关键词自动匹配)、icons(条目图标 droplet/wave/mountain/moon/leaf)、 image(外链图片路径,内嵌右栏)。缺省时由讲解词自动推导,正式制作建议显式给出。
  • tts_replacements:发音修正表,只作用于 TTS 输入,字幕与可编辑文本保持原字。通用系列留空 {}。
  • voice_confirmed 默认 false,门禁 ③ 置 true,否则脚本拒绝合成。

常见失败速查

症状原因处理
字幕外框颜色和预期不符ASS 颜色是 BBGGRR 反序红=&H000000FF 蓝=&H00FF0000 黑=&H00000000
文读词被读成白话音(如老子 lǎo zi)TTS 默认取口语读法加进 tts_replacements 重跑 TTS
PPT 字体不渲染中文名无法识别用 SimSun / Microsoft YaHei
一步合成白屏/滤镜链崩xfade 后叠 overlay 覆盖拆两步:先底版再叠加;逗号转义 \,
帧"生成了"但找不到pymupdf 静默失败脚本已 abspath + 写后校验;或改用 export_frames.ps1
--rate -10% 报错 expected one argumentargparse 误判选项用 --rate=-10% 或只改 JSON 的 rate
合成报"语音尚未确认"漏了门禁 ③置 voice_confirmed=true 后重跑
中文引号写 JSON 报错手写转义错误用 Python json.dump 程序化生成
deck 生成报"缺少语音"HTML 路线必须先 TTS先跑 tts_synth.py 再 gen_html_deck.py
渲染报"找不到 Chromium"浏览器路径变了用 --browser 指定 chrome.exe / msedge.exe
标题页没有居中CSS 类选择器写法用 .inner.layout-title(同类元素),别用后代选择器
条目被拆碎(序号句独立成条)序号短句未合并gen_html_deck.py 已内置合并;自定义 points 可彻底避免
成片最后一帧时长不对concat 末文件怪癖compose_html_video.py 已内置末文件重复,勿删
cue 强调没出现cue 超出页面时长检查 slides[].cues 的 t 是否小于该页语音时长
封面大字缺笔/错字AI 渲染中文长句不稳文案压到四字以内重出;锚点字不对先重出锚点再派生
封面短边 1072≠1080模型取整照实交付(比例仍≈16:9/9:16);要精确补边到 1920×1080 / 1080×1920
两张封面不像一套两张纯文生图各自漂移必须锚点链:竖版以横版锚点为参考图派生

完整踩坑与架构经验见 references/pitfalls.md;HTML 动画路线详见 references/html-animation.md。

资源

  • scripts/doctor.py — 环境体检(每期开工先跑,MISSING 补齐再开工)
  • scripts/verify_output.py — 成片闸门(规格/时长/响度/黑帧/静音,全过才交付)
  • scripts/gen_html_deck.py — 讲解稿 → 图文协同动画 HTML 演示页 + deck.json 清单(HTML 路线入口)
  • scripts/render_html_frames.mjs — Playwright 确定性逐帧渲染(只截动画窗口,静止段复用末帧)
  • scripts/compose_html_video.py — 帧序列 + 语音 + 真实时序字幕 + BGM ducking 合成(HTML 路线)
  • scripts/tts_synth.py — edge-tts 批量合成(发音修正 + 句级真实时间轴 + voice_confirmed 门禁)
  • scripts/compose_video.py — 静态页+xfade+逐句字幕合成(静态回退路线)
  • scripts/export_txt.py / scripts/import_txt.py — 讲解稿与可编辑 txt 双向同步
  • scripts/preview_voices.py — 五音色试听对比页(离线可播)
  • scripts/export_frames.ps1 — PowerPoint COM 导出 1920×1080 画面帧(静态路线首选)
  • scripts/pdf_to_frames.py — pymupdf 渲染 PDF 帧(静态路线备选)
  • references/douyin-covers.md — 抖音封面全流程:文案规则 / 提示词模板 / 锚点链 / 质检清单(每期标配横竖双尺寸)
  • references/html-animation.md — HTML 动画路线:可行性结论 / 编排规则 / 踩坑(必读)
  • references/pacing-and-gates.md — 节奏底线 / 数据校验 / 双闸门 / BGM / 改版范围表(必读)
  • references/playbook.md — 全流程手册:确认项表 / 技术栈 / 优化路线
  • references/pitfalls.md — 踩坑清单与架构经验
  • references/subtitle-style.md — ASS 字幕样式手册(颜色反序 / 发光效果 / 样式预设)
  • assets/narration-template.json — 讲解稿 JSON 模板

依赖:playwright-core(技能根目录 node_modules,已装);Chromium 探测顺序 ms-playwright 缓存 → 系统 Edge,均缺失时 --browser 指定。

관련 스킬