知识区视频有个经久不衰的形态:白板手绘动画——一只手在纸上边画边讲, Salvador Dali 画风先不谈,这种形式的信息密度和完播率一直很能打。但传统做法要么请画师逐帧画,要么买 Videoscribe 这类软件套模板,又贵又套路。最近看到 geeklee/srt-whiteboard-animation(近 4k star,MIT 协议),思路很对胃口:拿现成的 SRT 字幕,直接生成暖米黄纸张底的手绘动画视频,还是以 Claude Code Skill 的形态交付的。
先看效果:不是“图片擦除”,是真的在画
市面上很多“白板动画”本质是整图 reveal——一块遮罩唰地移开,底下是完整图片,跟“画”没关系。这个项目用的是流式笔迹:笔尖沿着骨架或网格连续滑行落墨,先铺线稿(ink),再添彩(color,时长权重 ink:color = 2:1),一只手跟着笔尖走。视觉上就是有人在纸上画画,而不是图片在变魔术。
纸张底是暖米黄旧纸色(#F5EBD7,渲染时从原图取样染底,禁用纯白),配上线稿+淡彩,成品自带一种讲故事的质感。去仓库 examples 目录能看到完整案例:一幕大概 25–35 秒,讲一个完整的小意思,节奏跟字幕走。
核心设计:分区遮罩编排 + 按字幕叙事排序
它的聪明之处不在渲染,而在编排。一张图不会整体画完,而是先拆成若干区域,每个区域绑定字幕里的一个叙事事件,按“场景铺垫 → 关键人物/物体 → 动作变化 → 反应结果”的语义顺序依次出场。排序依据是字幕事件,不是画面坐标——这是全套 workflow 里反复强调的一条。
区域之间用允许掩码隔离:每个区域的绘制范围 = 自己的矩形扣除后续区域和保护区。什么意思呢?后面的内容在轮到它之前,一个像素都不会提前露出来。相互遮挡的物体再在 protectedRegions 里标出来,双保险。遮罩不变量是硬约束,不是建议。
所有这些信息存在一个 annotation.json 里:区域坐标(原图整数像素)、顺序、起止毫秒、字幕文本、叙事角色、手部路径。文件即时间线,改文件就是改片子。
完整工作流:7 步,每步都要你点头
这是个 Skill,不是全自动脚本,流程里塞满了确认点:
1. 读字幕出策略:parse_srt.py 把 SRT 按 25–35 秒一幕拆分镜,每幕只表达一个核心意思。停,等确认。
2. 生成统一风格线稿:按策略配图。停,等确认。
3. 标注:先读字幕再看图,把图中主体对应到叙事事件,写 annotation.json,顺手打开浏览器预览台。停,等确认。
4. 检查图:render_annotation_preview.py 出带编号和方向的分区图,核对顺序和重叠保护。停,等确认。
5. 预览台微调:拖区域、改顺序、调时间轴,保存写回。停,等确认。
6. 逐幕渲染 MP4,抽查开头、中段、结尾三帧。停,等确认。
7. 多幕合并成完整成片。
嫌啰嗦?做过视频的都知道,返工的成本全在“画完了才发现顺序错了”。七个确认点看着多,每一个都在帮你省渲染时间和 token。
上手:三条命令
环境准备有 prepare_env.py,编码用的是纯 pip 的 PyAV,不用装系统 ffmpeg,这点对 Windows 和新手很友好。核心就三条:
# 解析字幕,给分镜建议
python scripts/parse_srt.py 字幕.srt --target-sec 30 --min-sec 25 --max-sec 35
# 渲染单幕(grid 稳,线稿干净可换 skeleton;contour-wipe 是轮廓扫描上色)
<ENV_PY> scripts/render_stream_whiteboard.py 图片.png 标注.json 输出.mp4 assets/drawing-hand.png \
--ink-path grid --color-fill contour-wipe
# 多幕合并
<ENV_PY> scripts/merge_scenes.py --inputs 幕1.mp4 幕2.mp4 --output final.mp4
预览台是纯前端 preview.html,Chrome/Edge 直接打开, File System Access API 写回文件,不用起服务器。渲染走命令行,分工清楚。
什么内容最适合做成这样
知识讲解(概念拆解、历史故事)、课程字幕(把网课文案转手绘版,完播率一般会涨)、故事口播、短视频文案(读书博主、商业故事号直接套)。共同点:强叙事、弱实拍——内容靠讲不靠拍,画面是辅助理解的,白板动画就是最优解之一。
不适合的:颜值向内容(美妆穿搭探店)、强实拍的内容(评测开箱)、节奏极快的卡点视频。笔在纸上画画,天然是慢 medium,别拿它去卷信息流前三秒。
调参指南:两个关键选项
--ink-path 选 grid 还是 skeleton:grid 是网格扫描,稳,什么图都不翻车,默认用它;skeleton 是骨架追踪,笔尖贴着线稿走,更像人手,但只适合线稿干净的插画,照片级原图用了反而乱。
--color-fill 选 contour-wipe 还是 brush:前者轮廓扫描上色,干净;后者沿轨迹刷,大面积色块更有手绘感。我的建议是默认组合先出成片,不满意再单换一个变量重渲,别两个一起换,定位问题快。
还有个小细节:每幕结束后至少停留 0.5 秒完整画面,给观众一个“看全了”的凝视时间,也给合并留呼吸感。时序上同一幕内各区域串行作画,startMs 别重叠,重叠了渲染器也按顺序处理,但就不是“一支笔”的感觉了。
作者的姊妹项目
geeklee 围绕白板动画做了三个仓库,正好是三档需求:whiteboard-mask-animation 是最轻的,静态线稿做遮罩动画;whiteboard-stream-animation 是单图版,拿一张插图直接渲染流式笔迹 MP4,支持批量队列;srt-whiteboard-animation 是满配版,字幕驱动+分幕+合并。如果只是想试试笔迹效果,从单图版开始,五分钟出第一条片子。
常见问题
需要显卡吗?不需要。笔迹渲染是 OpenCV + PyAV 的 CPU 活,瓶颈在图片生成(走你自己的生图 key)和 agent 跑流程的 token,不在算力。
中文字幕可以吗?可以。标注里的 narrativeRole、字幕文本、分镜说明全用中文,纸张底+线稿对中文排版也很友好。注意预览台写回文件要用 Chrome/Edge。
一幕多长合适?官方建议 25–35 秒,这是注意力+信息量的 sweet spot。太短了笔刚落墨就切,太长了观众会忘前面画了什么。长字幕用 parse_srt.py 自动拆,别手拆。
跟 Videoscribe / Doodly 比呢?那类工具是模板库+拖拽,胜在零门槛,输在千篇一律且素材库要钱。这个项目是 skill+脚本,胜在每一帧都按你的字幕定制、可进 git 版本管理,输在要跑环境和过确认点。走量的营销号用前者,做知识 IP 的用后者。
支持哪些 AI 助手?仓库是标准 skill 结构,Claude Code 直接用,Codex 走了 agents/openai.yaml 元数据。Cursor、Windsurf 这些认 SKILL.md 的理论上都行。
结语
AI 视频现在两极分化:一头是 prompt 直出 clip,爽但不可控;一头是重型管线,强但笨重。这个项目走的是中间路线:用确定的程序保证下限(遮罩不变量、时序模型、质量检查清单),用 agent 负责需要理解的部分(分镜、语义排序、标注)。确定性+理解力各干各的,成品率才高。
做知识内容的、囤了一堆字幕没时间剪的、想给课程加个手绘版的,都值得去跑一遍 examples。仓库:github.com/geeklee/srt-whiteboard-animation。

