系列讲解视频全流程制作
把「一个主题」变成「一期成片」:策划 → 页面编排(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。
开工五问(每期开工先问;用户说「按上期来」「老规矩」则全部取默认直接开工)
- 这期讲什么?(主题 / 经文章节)
- 内容深度:详细讲解 / 要点讲解?(默认:详细讲解)
- 成片时长目标?(默认 6-7 分钟)
- PPT 风格沿用新中式水墨?(默认:是)
- 音色沿用云健、字幕白字黑发光?(默认:是)
风格档案(用户未指定时直接采用)
| 项目 | 默认值 |
|---|---|
| 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:讲解稿审阅)
-
从 PPT notes 提取讲解词,程序化生成
{BASE} 讲解稿.json(结构见下)。 -
导出可编辑文本供审阅:
python scripts/export_txt.py "{BASE} 讲解稿.json" -
明确提示用户用记事本打开 txt 逐页审阅;用户改完返回后同步回 JSON:
python scripts/import_txt.py "{BASE} 讲解稿.json" "{BASE} 讲解稿_可编辑.txt"用户仅回复「文案可以」无修改时跳过同步。
阶段 ④ 配音(门禁 3:音色试听,硬门禁 voice_confirmed)
-
生成试听页让用户选音色:
python scripts/preview_voices.py 配音试听 -
用户选定后写入 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 动画路线(默认):
-
合成逐页语音(必须先做——页面时长取自真实语音时长):
python scripts/tts_synth.py --narration "{BASE} 讲解稿.json" --out 02_audio -
生成动画演示页(deck.html 可用浏览器
#preview预览动画):python scripts/gen_html_deck.py --narration "{BASE} 讲解稿.json" --audio 02_audio --out 01_deck -
逐帧渲染(只渲染动画窗口,几分钟内完成):
node scripts/render_html_frames.mjs --deck 01_deck --out 01_html_frames -
合成视频(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 回退路线:
-
渲染画面帧(首选 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 页(首页/内容密的一页/表格页)确认无字体异常。 -
合成逐页语音:同上 tts_synth.py。
-
合成视频(静态页 + xfade + 逐句字幕):
python scripts/compose_video.py --frames 01_frames --audio 02_audio --narration "{BASE} 讲解稿.json" --out 03_output -
验证交付:入场/转场点抽帧确认动画正常、无黑闪;页中段抽帧确认字幕; 跑成片闸门:
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。用户明说不要封面时跳过。
- 文案:期名四字做图上唯一大字(如「有无相生」);不加副题小字(必糊);除主文案外画面零文字。
- 成套锚点链(硬规则):横版锚点(纯文生图 1920×1080)→ 用户确认 → 竖版以锚点为参考图派生(1080×1920,竖向三段式);风格 token 原文复用,禁止两张盲发。
- 视觉:与成片同风格(宣纸米白 + 墨黑 + 黛青 + 朱砂、水墨晕染、疏朗留白);意象从本期主题取(如「有无相生」→ 圆月 + 水中月影倒影)。
- 尺寸照实:模型取整可能给 1920×1072 / 1072×1920(差 8px),如实报告;用户要精确再补边到标准值。
- 交付:工作区根
{期名}-抖音封面.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 argument | argparse 误判选项 | 用 --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 指定。