项目详情

SRT 白板动画

把一段字幕变成一支笔在暖米黄纸上画画的手绘视频——AI Skill 范式的教科书样本

GitHub 地址 MIT 2.8k Stars Python · OpenCV AI Skill(配 Codex / Claude 用)

更新于 2026-09-02

← 返回汇总
项目速览

一句话定位

字幕进,手绘视频出

一个把 SRT 字幕文件转成白板手绘动画 MP4 的 AI Skill:读字幕出分镜 → 确认后生成统一风格线稿 → 按叙事语义标注分区 → 预览台调整时序 → 渲染成片。技术上分两层——「分区遮罩编排」控制每个元素何时出场,「流式笔迹」让笔尖在区域内连续落墨(先 ink 铺线稿、再 color 添彩)。适合知识讲解、故事口播、课程字幕的内容创作者,以及想学「AI Skill 该怎么写」的开发者。

项目速览

核心数据

2,789
Stars
438
Forks
1
Commit(首发即 v1.0.0)
0 天
创建 → 发布间隔
60 fps
渲染帧率
25-35s
单幕建议时长
2:1
ink : color 权重
#F5EBD7
纸张底色

数据来源:GitHub API,采集于 2026-09-02。2026-07-27 创建当天即发布 v1.0.0;一个多月无新 commit,4 个 open issues。

它做了什么

成片的三个段落

① 起笔 ink 笔尖沿墨迹流铺下深灰线稿 网格 grid 或骨架 skeleton 路径 权重 2 —— 为观察笔迹留足时间 ② 添彩 color 同一条轨迹回头走一遍 笔尖换上原色点亮画面 contour-wipe 轮廓扫描 / brush 轨迹刷 ③ 凝视 gaze 收笔后停留 ≥ 0.5s 展示完整画面 多幕在此衔接合并 与逐格跳变的区别 相邻落点之间做插值,墨刷随笔尖滑动连续落墨 —— 60fps 高频输出让笔迹接近真实书写,而非幻灯片式擦除
线稿段(主体) 上色段(点睛) 收尾段(留白)
架构

两层解耦:mask 管顺序,stream 管画法

编排层 · 分区遮罩(mask)—— 决定「什么、何时、在哪」 annotation.json region 矩形 · sequence 顺序 startMs/durationMs 时序 subtitle 字幕关联 允许掩码计算 掩码 = 本区域矩形 − 后续区域 − protectedRegions 未开始区域完全隐藏 重叠保护 大猴压着小猴时:小猴先画, 重叠部分标进 protectedRegions, 防止后面的内容提前露出 ↓ 每个区域拿到掩码后,交给绘制层 绘制层 · 流式笔迹(stream)—— 决定「怎么画得像人」 笔迹路径 --ink-path grid 网格(稳)/ skeleton 骨架 插值落墨 笔尖运动折线 · 相邻落点插值 · 连续墨刷 持久画布 所有区域共享一张画布 · 画完的保留在画上
编排层(时间轴 / 顺序 / 掩码) 绘制层(笔迹质感 / 画布状态)
核心洞察

按字幕事件排序,不按画面位置

最容易被忽略但最值钱的设计:每个元素的 sequence 不按「从左到右、从上到下」排,而按字幕里的叙事事件先后排。

  • narrativeRole 语义角色:场景铺垫 → 关键人物/物体 → 动作冲突 → 反应/结果,四段式叙事模板
  • subtitle 双向关联:标注里存对应字幕原文,预览台选中区域自动高亮字幕
  • 标注前强制双读:先读字幕、再看原图,缺一不许生成标注——防止只按视觉位置机械排序
  • 效果:观众听到的每一句,恰好对应画面里正在画的那一笔
猴子山抢香蕉示例(官方案例)
#元素叙事角色对应字幕
1假山场景铺垫「小猴子坐在猴子山顶」
2小猴+香蕉关键人物「手里拿着香蕉」
3大猴扑来动作冲突「大猴抢走香蕉」
4围观小朋友反应/结果「孩子们在旁观看」

若按视觉位置排(假山→大猴→小猴→人群),观众会在听到「小猴」时看到大猴先出现——叙事断裂。

源码解剖

annotation.json:一切的契约

{
  "sceneId": "scene-01",
  "canvas": { "width": 1672, "height": 941 },      // 必须等于原图像素尺寸
  "sceneDurationMs": 9000,                     // 来自该幕字幕时间跨度
  "elements": [
    {
      "id": "rockery",
      "label": "猴子山场景",
      "sequence": 1,                            // 叙事顺序,从 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" }
    }
  ]
}

人(或 LLM)只写这一份 JSON;预览台编辑它,渲染器消费它。图片与标注必须同名:foo.png ↔ foo.annotation.json。

工作流

七步七道确认关卡

设计动机:渲染是整个流程里最贵的环节。把所有便宜步骤(策略/线稿/标注)的确认前置,避免在未定稿时浪费渲染成本。「未回复 ≠ 确认」写进了 SKILL.md 强制条款。

渲染管线

五个脚本,一条流水线

parse_srt.py→ LLM 出线稿→ annotation.json→ preview.html→ render_stream_whiteboard.py→ merge_scenes.py
脚本职责要点
parse_srt.py字幕解析与分镜建议--target-sec 30 --min-sec 25 --max-sec 35
render_annotation_preview.py编号/方向检查图核对分区与叙事顺序一致性
render_stream_whiteboard.py流式笔迹渲染器(核心)--ink-path grid|skeleton · --color-fill contour-wipe|brush · 60fps
merge_scenes.py多幕合并--inputs 幕1.mp4 幕2.mp4 …
prepare_env.py独立 venv 准备--check 输出 ENV_PY 路径,依赖隔离

纯 Python + OpenCV + ffmpeg;中文路径兼容(np.fromfile + imdecode 绕过 cv2.imread 的非 ASCII 路径问题)。带 agents/openai.yaml 可直接被 Codex 识别为 skill。

视觉系统

一套强约束的手绘美学

纸张

暖米黄旧纸 #F5EBD7,渲染时从原图四角内缩取样染底,禁止纯白。首帧必须是干净纸面,不许提前露线。

线条与点缀

深灰素描线条;红、橙、蓝只作少量概念性点缀。Notion 式克制涂鸦美学,大量留白。

绝对禁止

场景内任何文字/标签;写实感、摄影细节、3D、复杂纹理、高饱和配色。


视觉规范不是装饰——它是「LLM 生成线稿」的可控性手段:约束越具体(底色 hex 值、禁用项清单、留白要求),不同幕之间风格越一致,拆分区域也越可靠。写死在 SKILL.md 里强制每幕出图前完整复述。

生态位

AI Skill 范式的教科书样本

  • 不是库,不是产品,是 Skill:本体是一份 169 行 README + 一份约束极细的 SKILL.md + 五个脚本。运行靠 Codex/Claude 这类 agent 读 SKILL.md 驱动
  • 把 LLM 当流程中的两个工位:出线稿(受视觉规范约束)+ 写标注(受语义排序规则约束),其余全是确定性 Python——LLM 干创造性脏活,脚本干精确活
  • 预览台是人机协作接口:浏览器里拖拽调整 JSON,人类审美兜底,机器渲染执行
  • 中文优先:所有面向用户的说明、分镜、配置和界面文字强制中文——罕见的非英文中心开源项目
作者

江哥是老登啊(geeklee)——「爱养鱼的老登 / AI Builder / 用 AI 团队打造一人公司」。抖音、B 站、公众号同名。2.8k stars 一天到位,一半功劳是作者的中文内容创作者社区影响力:这条传播路径(中文短视频圈 → 开源)本身就是样本。

对比坐标

同类思路:VideoPPT 类自动动画(结构固定)、whiteboard 视频 SaaS(人工模板)。本项目的差异点:叙事语义驱动的绘制顺序 + 任意 SRT 输入 + 完全本地渲染。

风险与局限

冷静看

潜力评估

打分

维度评分依据
创意设计
mask+stream 两层解耦、叙事语义排序、确认关卡,处处是巧思
工程质量
结构清晰、注释到位;但零测试零 CI
实用性
知识类视频创作者可直接吃;依赖 LLM 稳定性
维护活跃
单 commit 一月未动,社区 fork 自救(438 个)
知识价值
「怎么写一个可用的 AI Skill」最佳范本之一

综合 7.5/10。作为工具是「够用但停在 v1.0」;作为 AI Skill 方法论样本是顶级——确认关卡、语义排序、视觉规范锁定、人机协作接口四个模式可直接抄到任何 skill 里。

最终裁决

怎么用它

值得
  • 做知识口播/课程/故事视频,想低成本上手白板动画
  • 正在写自己的 AI Skill——抄它的确认关卡与契约设计
  • 研究「LLM 出图 + 确定性脚本」混合管线的工程模式
不必
  • 想要开箱即用、有售后、持续更新的产品(它是 skill 不是 SaaS)
  • 没有 Codex/Claude 等 agent 环境(脚本之外的核心环节靠 LLM 驱动)
  • 追求写实/复杂视觉(极简涂鸦美学是硬约束)

上一个
The Agency
下一个
Marble Skill Taxonomy
在线体验

白板动画时序模拟器

亲手编排一次「叙事揭示」:调整每个元素的出场顺序、开始时间与揭示方向,点播放看白板逐笔成形——保护区开关演示重叠元素怎么延后露出。这正是 mask 编排层在做的事。

进入 Playground →
1 / 15