一句话概括:这个项目能让你的 SRT 字幕文件自动变成手绘白板动画------随着字幕的叙事顺序,笔尖在纸上逐帧落墨,从线稿到上色,最终生成完整的 MP4 视频。

为什么这个项目火?
白板动画(Whiteboard Animation)在知识类短视频中非常流行。传统制作方式需要:找素材、手动标注区域、逐帧录制、后期合成。整个流程可能需要几个小时。
这个项目把流程简化到了极致:你只需要一个 SRT 字幕文件和一张线稿图,剩下的交给脚本。它能自动解析字幕、按叙事顺序编排区域、生成流式笔迹动画。一周内获得近 3000 Star,说明这个需求确实真实存在。
架构概览:字幕驱动的动画流水线
这个项目的核心设计思想是「字幕驱动、逐步确认」。整个流程被拆分成多个步骤,每一步都需要人工确认才继续,避免在错误的基础上浪费渲染时间。
整个项目由四个核心脚本组成。parse_srt.py 负责解析字幕文件,按时间跨度建议分镜;render_annotation_preview.py 生成区域编号检查图;render_stream_whiteboard.py 是核心渲染器,把静态图变成动画;merge_scenes.py 负责多幕合并。
除此之外,还有一个本地预览台 assets/preview.html,用户可以在浏览器中拖拽调整区域、顺序和时序,然后保存回标注文件。

核心技术点解析
1. 双模式笔迹渲染
这个项目最核心的技术创新是「流式笔迹」渲染。传统的白板动画通常是「矩形擦除」------一个矩形区域从左到右逐渐显示。这个项目不同,它模拟的是真实的笔迹:笔尖沿着路径连续滑行,边走边落墨。
渲染器支持两种笔迹模式。网格模式(grid)把图像分割成小格子,笔尖逐格移动并填充墨迹。这种模式适合大多数场景,稳定可靠。骨架模式(skeleton)则先提取图像的骨架结构,然后让笔尖沿着骨架线条移动。这种模式适合线稿清晰的插画,笔迹更贴合原始线条。
代码位置在 render_stream_whiteboard.py 的 RegionStreamRenderer 类中。网格模式使用 _region_grid_path() 方法生成路径,骨架模式使用 _region_skeleton_strokes() 方法提取骨架并生成笔迹。
2. 分区遮罩编排
这是动画编排层的核心机制。每个元素都有一个矩形区域(region),但这个区域不是固定不变的。渲染时,每个区域的「允许掩码」会扣除后续区域和保护区域,确保未开始的元素不会提前露线。
举个例子:如果画面中有三个元素,顺序是假山、小猴、香蕉。当绘制假山时,小猴和香蕉所在的区域会被扣除,笔迹不会画到那些地方。绘制小猴时,香蕉区域被扣除,但假山已经画完,保留在画布上。
这种机制通过 _allowed_mask() 方法实现。它接收当前元素和后续元素列表,计算出当前元素可以绘制的区域。protectedRegions 字段则用于处理元素之间的重叠------比如小猴的手可能遮住假山的一部分,就需要在假山的标注中标记保护区。
3. ink → color 两阶段渲染
每个区域的绘制被分成两个阶段:起笔(ink)和添彩(color)。起笔阶段用深灰色线条铺设线稿,添彩阶段逐步填充原图颜色。两个阶段的时长比例默认是 2:1。
这种设计模拟了真实的手绘过程------先画轮廓,再上色。渲染器使用 _lay_ink() 方法处理起笔阶段,_wash_brush() 或 _wash_contour() 方法处理添彩阶段。
上色有两种风格。brush 模式沿笔迹路径逐点涂抹,适合笔迹密集的区域。contour-wipe 模式用波浪扫描的方式从上到下填充,适合大面积背景。contour-wipe 还会生成一个「阻力场」,让墨线附近的上色速度变慢,模拟颜料在纸上扩散的效果。
4. 字幕驱动的语义排序
这个项目最独特的地方在于:元素的绘制顺序不是由位置决定的,而是由字幕的叙事顺序决定的。
传统的动画工具通常按照「从左到右、从上到下」的顺序绘制。但这个项目要求标注者先阅读字幕,理解故事的叙事逻辑,然后按照「场景铺垫 → 关键人物 → 动作冲突 → 反应结果」的语义顺序安排绘制顺序。
比如在「猴子山抢香蕉」的场景中,字幕先说「小猴子坐在猴子山顶」,然后说「大猴子抢走了香蕉」,最后说「小朋友们围观」。对应的绘制顺序就是:先画假山(场景铺垫),再画小猴(关键人物),然后画大猴(动作冲突),最后画围观的小朋友(反应结果)。
5. 字节级标注格式
标注文件使用 JSON 格式,每个元素包含以下关键字段:sequence(绘制顺序)、narrativeRole(叙事作用)、subtitle(对应字幕)、region(像素坐标)、reveal(揭示参数)、handPath(预览用笔迹路径)。
region 使用原图的整数像素坐标,不是百分比或比例。这确保了标注的精确性。canvas 字段必须等于原图像素尺寸,用于坐标系的参考。
reveal 对象包含 startMs(开始时间)、durationMs(持续时间)、direction(预览用方向)、maskPaddingPx(遮罩内缩像素)、protectedRegions(保护区域)。这些参数控制了元素的出场时机和遮罩行为。

设计亮点
确认关卡机制
这个项目有一个非常聪明的设计:每一步完成后都必须停止并等待用户确认。分镜策略、线稿、标注、预览图、最终成片------每一步都需要人工确认才能继续。
这种设计避免了传统工具「一键生成后发现全部重来」的问题。用户可以在每个阶段及时发现问题,避免在错误的基础上浪费渲染时间。
本地预览台
项目提供了一个纯前端的预览台 assets/preview.html,用户可以在浏览器中直接编辑区域、调整顺序、修改时序。预览台使用 File System Access API 直接读写本地文件,无需服务器。
暖米黄纸张背景
所有动画都使用暖米黄色(#F5EBD7)作为纸张背景,模拟真实的白板手绘风格。渲染时会从原图四角采样,自动匹配背景色,避免纯白底色。
适用场景
这个项目特别适合几类内容创作者。知识类博主可以把讲解文案转成动画,配合字幕讲解,视觉效果比纯文字字幕好很多。故事类创作者可以把故事脚本转成手绘动画,适合儿童教育内容。课程制作者可以把课件字幕转成动画,增加观看趣味性。
Github: github.com/geeklee/srt...
局限性与改进方向
作为一个一周前创建的项目,这个工具还有一些明显的局限。首先是素材依赖:你需要自己准备线稿图,而不能自动生成。其次是风格固定:只能生成暖米黄纸张背景的手绘风格,不能自定义。
第三是交互有限:预览台只能调整区域和时序,不能修改笔迹路径或颜色。可能的改进方向包括:支持 AI 自动生成线稿、支持更多纸张背景和笔迹风格、增加实时预览功能。
关注
如果这篇文章对你有帮助,欢迎关注公众号「技术写作与开源」,获取更多 AI 工具和技术写作技巧。