SRT字幕白板手绘动画生成工具,将SRT字幕文件转换为暖米黄纸张底的白板手绘动画视频。核心功能:读字幕→配图策略→统一风格线稿→语义分区标注→预览台调整→渲染MP4全流程。支持流式笔迹动画、分区遮罩揭示、多幕合并,适用于知识科普、教程视频、故事讲解等内容创作场景。
SRT字幕白板手绘动画生成工具:流式笔迹+分区遮罩+MP4渲染
【适用场景】
- 需要把SRT字幕文件转换为白板手绘动画视频 - 制作知识科普、教程、故事讲解类短视频 - 需要流式笔迹动画效果(非逐格跳变) - 需要按字幕叙事语义分区控制元素出场顺序 - 需要批量生成系列化白板动画内容
适用人群:知识博主、教育创作者、教程视频制作者、故事类内容创作者
使用时机:当用户提供SRT字幕并要求「字幕做成白板手绘」「SRT生成白板动画」「按字幕分镜画手绘」「字幕转流式笔迹视频」时触发
【操作步骤】
第一步:读字幕、出配图策略
使用脚本解析SRT字幕并生成建议分镜: ```bash python scripts/parse_srt.py <字幕.srt> --target-sec 30 --min-sec 25 --max-sec 35 ```
输出内容: - 每幕的场景编号 - 核心表达 - 画面主体 - 对应字幕区间与 `sceneDurationMs`
每幕只表达一个核心意思。完成后停止,等待用户确认策略。
第二步:生成统一风格线稿
在用户确认策略后,按以下视觉规范逐幕生成线稿图:
视觉规范(强制): - 纸张背景:暖米黄旧纸色 `#F5EBD7`(从原图距四角内缩取样染底,禁止纯白) - 线条:深灰色草图线条 - 风格:极简手绘插图、纯素描草图风格、Notion克制涂鸦美学 - 构图:简洁、背景干净、大量留白 - 颜色点缀:仅可用红色、橙色、蓝色 作少量概念性点缀
禁止出现: - 文字、词语、字母、数字、字体或标签 - 写实感、摄影细节、3D效果、绘画质感 - 复杂场景、密集背景、繁复装饰
完成后停止,展示线稿并等待用户确认。
第三步:标注分区并打开预览台
在用户确认线稿后: 1. 先阅读该图对应的字幕 2. 实际查看图片并获取原图像素宽高 3. 按叙事语义顺序安排绘制(场景铺垫→关键人物/物体→动作冲突→反应/结果) 4. 创建标注JSON文件
```json { "sceneId": "scene-01", "canvas": { "width": 1672, "height": 941 }, "storyBasis": "该幕字幕的事件摘要", "sceneDurationMs": 9000, "elements": [ { "id": "rockery", "label": "假山场景", "sequence": 1, "narrativeRole": "故事的场景铺垫", "subtitle": "猴子山上,一只小猴子坐在假山顶端,手里拿着香蕉。", "type": "structure", "region": { "x": 20, "y": 120, "width": 540, "height": 780 }, "reveal": { "direction": "top_to_bottom", "startMs": 300, "durationMs": 2600, "maskPaddingPx": 22, "protectedRegions": [] }, "handPath": { "start": [290, 130], "end": [290, 890], "easing": "easeInOut" } } ] } ```
创建完成后,立即用默认浏览器打开 `assets/preview.html`,通过预览台的「打开文件夹」载入该目录全部图片和标注文件。
预览台已带入目录后停止,等待用户确认标注与预览内容。
第四步:生成区域预览图
在用户确认标注后,出编号/方向检查图: ```bash python scripts/render_annotation_preview.py <图片> <标注> <预览图输出> ```
核对: - 分区与叙事顺序一致 - 区域都在画布内 - 重叠主体用 `protectedRegions` 保护
完成后停止,等待用户确认预览图。
第五步:在预览台调整并保存
在预览台中进行最终调整: - 默认(未播放)显示完整图片和区域框 - 拖区域四边四角改 `region` - 右侧改名称/方向/开始(ms)/结束(ms)与字幕 - 拖动模块列表调整顺序(自动重排 `sequence`) - 选中模块自动高亮对应字幕 - 拖时间轴或按播放看揭示效果
调整完成后点「保存本场景/全部保存」写回原 `.annotation.json`。
保存后停止,等待用户确认最终标注与时序。
第六步:命令行渲染成片
在用户确认最终标注后,渲染单幕MP4: ```bash <ENV_PY> scripts/render_stream_whiteboard.py <图片> <标注> <输出mp4> assets/drawing-hand.png \ [--ink-path grid|skeleton] [--color-fill contour-wipe|brush] [--total-ms <毫秒>] ```
参数说明: - `--ink-path grid`:网格路径(默认,稳健) - `--ink-path skeleton`:骨架追踪(线稿清晰的插画更贴合) - `--color-fill contour-wipe`:轮廓扫描(默认) - `--color-fill brush`:沿轨迹刷
抽查开场、任意重叠模块中段、结尾三个时间点。
完成后停止,等待用户确认成片。
第七步:多幕合并(仅多幕时)
在用户确认所有单幕后,合并成一条: ```bash <ENV_PY> scripts/merge_scenes.py --inputs 幕1.mp4 幕2.mp4 幕3.mp4 --output final.mp4 ```
完成后停止,等待用户确认最终合成视频。
【代码模板】
环境准备(首次使用)
```bash
探测并建立虚拟环境
python scripts/prepare_env.py --check # 成功末行输出 ENV_PY=<路径> python scripts/prepare_env.py # 缺则建 .venv 并装 opencv-python/numpy/av ```完整工作流
```bash
1. 解析字幕
python scripts/parse_srt.py <字幕.srt> --target-sec 30 --min-sec 25 --max-sec 352. 确认策略后,生成线稿图(按规范逐幕生成)
3. 确认线稿后,标注并打开预览台
创建 <图片名>.annotation.json
浏览器打开 assets/preview.html,选择文件夹
4. 确认标注后,生成预览图
python scripts/render_annotation_preview.py <图片> <标注> <预览图>5. 预览台调整并保存标注
6. 确认标注后,渲染MP4
<ENV_PY> scripts/render_stream_whiteboard.py <图片> <标注> <输出mp4> assets/drawing-hand.png7. 多幕合并
<ENV_PY> scripts/merge_scenes.py --inputs 幕1.mp4 幕2.mp4 --output final.mp4 ```目录结构
```text assets/whiteboard/<项目名>/ scene-01-<名称>.png # 线稿图 scene-01-<名称>.annotation.json # 标注(与png同名) scene-01-<名称>-whiteboard.mp4 # 成片 scene-01-<名称>-preview.mp4 # 预览片段 ```
【复盘要点】
质量检查清单
渲染前/后必须确认: - 首帧为干净的暖米黄旧纸张底,没有提前露出线条 - 已阅读对应字幕并实际查看原图 - `canvas` 与原图像素尺寸一致 - 所有 `region` 为整数像素坐标且在画布内 - `sequence`、`startMs` 与字幕事件顺序一致 - 预览图编号/标签/区域来自同一份标注JSON - 开场、任意重叠模块中段、所有模块完成后三个时间点检查 - 未绘制模块均不可见,重叠保护区不漏出 - 所有模块结束后停留至少0.5秒完整原图
常见问题处理
| 问题 | 解决方案 |
|---|---|
| 笔迹不贴合线稿 | 使用 `--ink-path skeleton` 替代 grid |
| 区域提前露线 | 检查 `protectedRegions` 是否正确保护了重叠区域 |
| 画布尺寸不一致 | 确认 `canvas.width/height` 等于原图像素尺寸 |
| 元素顺序错乱 | 检查 `sequence` 是否按字幕叙事顺序排列 |
强制确认关卡
每一步完成后必须停止并等待用户明确确认,才可开始下一步。不得把「未回复」「用户没有反对」视为确认。用户要求修改上一步时,只重做该步并再次等待确认。
标注JSON关键字段
- `canvas`:画布像素尺寸(原图像素) - `sceneDurationMs`:该幕总时长(来自字幕时间跨度) - `elements[].region`:原图整数像素坐标 `x/y/width/height` - `elements[].reveal.startMs`:该区域开始绘制时间(毫秒) - `elements[].reveal.durationMs`:该区域绘制时长(毫秒) - `elements[].subtitle`:对应字幕文本(供预览台联动) - `elements[].narrativeRole`:中文说明该元素的叙事作用
【来源信息】
来源:GitHub https://github.com/geeklee/srt-whiteboard-animation
【合规声明】
- 本工具仅生成白板手绘动画,不涉及真实人物形象 - 请遵守各平台内容规范 - 使用他人素材需获得授权