把一段字幕变成一支笔在暖米黄纸上画画的手绘视频——AI Skill 范式的教科书样本
更新于 2026-09-02
← 返回汇总字幕进,手绘视频出
一个把 SRT 字幕文件转成白板手绘动画 MP4 的 AI Skill:读字幕出分镜 → 确认后生成统一风格线稿 → 按叙事语义标注分区 → 预览台调整时序 → 渲染成片。技术上分两层——「分区遮罩编排」控制每个元素何时出场,「流式笔迹」让笔尖在区域内连续落墨(先 ink 铺线稿、再 color 添彩)。适合知识讲解、故事口播、课程字幕的内容创作者,以及想学「AI Skill 该怎么写」的开发者。
数据来源:GitHub API,采集于 2026-09-02。2026-07-27 创建当天即发布 v1.0.0;一个多月无新 commit,4 个 open issues。
最容易被忽略但最值钱的设计:每个元素的 sequence 不按「从左到右、从上到下」排,而按字幕里的叙事事件先后排。
| # | 元素 | 叙事角色 | 对应字幕 |
|---|---|---|---|
| 1 | 假山 | 场景铺垫 | 「小猴子坐在猴子山顶」 |
| 2 | 小猴+香蕉 | 关键人物 | 「手里拿着香蕉」 |
| 3 | 大猴扑来 | 动作冲突 | 「大猴抢走香蕉」 |
| 4 | 围观小朋友 | 反应/结果 | 「孩子们在旁观看」 |
若按视觉位置排(假山→大猴→小猴→人群),观众会在听到「小猴」时看到大猴先出现——叙事断裂。
{
"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 | 字幕解析与分镜建议 | --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 里强制每幕出图前完整复述。
江哥是老登啊(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 里。
亲手编排一次「叙事揭示」:调整每个元素的出场顺序、开始时间与揭示方向,点播放看白板逐笔成形——保护区开关演示重叠元素怎么延后露出。这正是 mask 编排层在做的事。
进入 Playground →