手绘科普视频
把用户给的主题,做成一支「手绘白板动画」短视频:纯手绘线稿被一支笔逐步画出来,配中文旁白,
整体落在暖色纸板上、左侧写标题与要点、右侧放插画(参考市面爆款简笔白板讲解视频风格)。
触发场景
- 用户提供主题,要求「做成手绘动画 / 白板动画 / 简笔科普视频」。
- 用户提到"手绘科普""白板动画""线描讲解"。
- 用户已有 SRT 字幕,想渲染成白板手绘风格视频。
资源位置
- 渲染引擎:
scripts/render_stream_whiteboard.py+scripts/stream_render.py(整合 mask 编排 + stream 笔迹画法)。 - 辅助脚本:
scripts/merge_scenes.py(合并)、scripts/composite.py(暖纸张合成)、scripts/add_voiceover.py(配音)、scripts/mux.py(转码封装)。 - 手素材:
assets/drawing-hand.png(卡通线稿手,SkillHub 版不含二进制——缺图时由scripts/hand_assets.py自动解码生成);字体由composite.py自动选择(内置assets/STXINGKA.TTF→ 系统行楷/楷体C:/Windows/Fonts)。 - 详细规范:
references/srt-spec.md(时间轴无空挡)、references/imagegen-prompts.md(生图提示词)、references/pipeline.md(完整命令)。
交互流程(核心:先收参数 → 用户确认 → 再生成)
不要在没拿到参数、没经用户确认前就开始生图或渲染。严格走四步:
第 1 步 · 收主题
向用户索取「视频主题」(如:空城计、猴子捞月、光合作用)。一个短句或关键词即可。
第 2 步 · 收参数(给出默认值,让用户改)
用下表逐项确认。未特别说明的项沿用默认值。
| 参数 | 默认值 | 说明 |
|---|---|---|
| 文案 | 由模型按主题撰写 | 200–250 字(对应 40–50s);要求首尾相接、无空挡(见 srt-spec.md) |
| 时长 | 47 秒 | 推荐 40–50 秒,分 3 幕(约 15+16+16s) |
| 分幕数 | 3 幕 | 每幕一张线稿 + 一段旁白 |
| 成片尺寸 | 1280×720(横版) | 线稿生图固定 1216×832;竖屏需改 composite.py 布局,暂不支持 |
| 配音音色 | 云健(男声 zh-CN-YunjianNeural) | 沉稳叙事感,默认;可换女声 zh-CN-XiaoxiaoNeural |
| 画面风格 | 暖纸张 + 左文右图 + 淡彩 | 参考爆款白板讲解视频;可选「纯白底无文字栏」简版 |
第 3 步 · 复述并等待确认
把主题 + 全部参数(文案、时长、分幕、尺寸、音色、风格)整理成一段,明确请用户确认。
出现「确认 / 可以 / 就这样」之类肯定答复后再进入第 4 步。这一步是硬性 gate,避免返工。
第 4 步 · 生成(按 references/pipeline.md 八步)
- 写 SRT:按 srt-spec.md 规则(窗口≈朗读时长、首尾相接)。
- 生成三幕线稿(ImageGen,逐条串行,模板见 imagegen-prompts.md,1216×832 淡彩线描)。
- 写每幕 annotation.json(region 用画布像素坐标 0..1216×0..832,勿用 0..1 归一化——会退化为 0×0 区域、上色段不写帧致时长缩水;时间窗对齐 SRT 段落)。
- 渲染三幕:
scripts/render_stream_whiteboard.py <图> <标注> <出> [手png] --ink-path grid --color-fill contour-wipe --hand-height 150 --tip-anchor-x 0.177 --tip-anchor-y 0.998 --total-ms <幕时长>。 - 合并:
scripts/merge_scenes.py --inputs s1 s2 s3 --output merged.mp4(PyAV 写 H.264)。 - 合成:
scripts/composite.py --scenes s1 s2 s3 --output silent.mp4 --title … --tag … --series … --bullets … --bullet-starts …(PyAV 写 H.264)。 - 配音:
scripts/add_voiceover.py --srt script.srt --video silent.mp4 --output voiced.mp4 [--voice …](看 per-cue gap 确认无空挡)。
- 若 SRT 时间轴与朗读时长有偏差,可加--rewrite-srt script_auto.srt让脚本按实测 TTS 时长自动首尾相接重排,再用重排后的 SRT 重跑一次即可,免手动改时间码。 - 封装:
scripts/mux.py --silent silent.mp4 --audio voiced.mp4 --output final.mp4。
最后把 final.mp4 用 present_files 交付给用户预览。
必记坑点(踩过,已固化在脚本里)
- ImageGen 必须串行:同一条消息并行发多个会互相覆盖,只留最后一个。逐条发。
- PyAV 多文件合并报 Invalid argument:合并多幕用 merge_scenes.py(逐帧拼接),勿用 PyAV packet 拷贝。
- Windows 上勿用 OpenCV mp4v 写长视频:composite.py / merge_scenes.py 已改用 PyAV 直接写 H.264(yuv420p);若自己另写脚本,勿用
cv2.VideoWriter("mp4v")写 30s+ 视频(会产出 moov atom 缺失的损坏文件,无报错但无法解码)。 - 配音总时长取 SRT 末条 + 0.5s:脚本已动态取,勿硬编码 30s(长视频会越界崩溃)。
- SRT 空挡:时间窗开太大、文案太短 → 死寂空挡。add_voiceover.py 自带 per-cue gap 检测,要求每条 gap<0.6s;偏差大时用
--rewrite-srt自动重排。 - 配角过小:扩散模型空间控制弱,多主体时配角被压成装饰级。改提示词只能部分缓解;根治见 imagegen-prompts.md 方案 B(配角单独生图 + 合成)。
- 合成帧率从源读取:保持 60fps,确保 47s 与配音精确对齐。
- 渲染大视频耗时:可能超前台超时,必要时后台运行。
署名
本技能由 AI杜老师 基于 geeklee/srt-whiteboard-animation 渲染引擎改造封装(MIT,上游作者 江哥是老登啊,见 DERIVATIVE_NOTICE.md / ORIGIN.json)。