SRT 白板动画:让字幕「画」出故事

一句话概括:这个项目能让你的 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.pyRegionStreamRenderer 类中。网格模式使用 _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 工具和技术写作技巧。

相关推荐
阿里嘎多学长1 小时前
2026-09-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
dong_junshuai2 小时前
每天一个开源项目#87 fmt:24.5K Stars 的 C++ 格式化核心
c++·开源·github
七牛开发者6 小时前
拆解 dsh:Session 的事件溯源与状态重建
javascript·github·agent
ashina9 小时前
Claude Code 明明配置了 Skill,为什么还是会跳过?我连夜写了一个本地验证器
github
王大虎9 小时前
一语成美图的 SKILL
人工智能·github·设计
m4Rk_10 小时前
【论文阅读】Agent 记忆机制(59):Synapse——让相关记忆沿情景—语义图被逐步激活
论文阅读·人工智能·学习·开源·github
Phil3231 天前
开源一个 Windows 实时面试助手:听译、置顶提词、按需生成英文稿
面试·github
千纸鹤1901 天前
Kafka vs RabbitMQ:在秒杀场景下如何选型与
github