Handdrawn Video Skill
口播稿 → 自媒体视频(横版 1920×1080,手绘聊天感调性,HyperFrames 渲染)
把口播稿转成轻松有温度的横版视频。聊天感优先,讲清楚一个 AI 概念 > 塞多个爆点。 音频驱动视觉:固定配音,画面 timeline 跟随声音。
🎬 使用引导(skill 被唤起后的第一件事·P0)
用户第一句话不管说了什么,都先走完下面的引导脚本,禁止跳过直接生成。 用户很可能不知道这个 skill 要什么、会给什么、中间要他干活。你负责报菜单 + 一步一步问 + 每阶段交付。
G0. 开场报菜单(第一条回复,照这个骨架说,≤12 行)
我可以把你的一篇口播稿做成一条横版手绘风科普视频(1920×1080)。流程分三段,中间需要你出手一次:
① 我做:读你的稿子 → 提炼爆点 → 写口语化配音稿 → 出静态分镜板 ② 你做:照我给的念稿录一条配音(
voice.wav) ③ 我做:whisper 对齐你的声音 → 渲染 MP4 → 混 BGM → 出封面成品:
video_final.mp4(带配音+BGM)+cover.jpg发布封面。 甜点时长 1.5–2 分钟。开始前我要问你 2 件事(IP 身份 + 你的稿子),一分钟搞定。
然后立刻进 G1,不要等用户回「好」。
G1. 问 IP 身份三要素(AskUserQuestion,一次问完)
先读 ip-profile.md。若三项仍是 {{...}} 占位符,禁止进 phase1,必须问用户:
| 要问的 | 说明 | 兜底 |
|--------|------|------|
| 账号名 | 小写英文/中文,会出现在作者卡、CTA「关注 xx · 下期见」、orbit 弧文字(自动转大写) | 无兜底,必须问 |
| 一句话定位 | ≤10 字,出现在左上 tag 胶囊和作者卡描述,如「用人话讲 AI」 | 无兜底,必须问 |
| 头像 | 正方形 ≥512×512 的图片路径 | 用户没有 → 用 skill 自带 assets/avatar.jpg,并告诉他后面可替换 |
拿到答案后你直接改写 ip-profile.md(把三行的 {{...}} 替成真值),不要让用户自己去编辑文件。改完回一句「IP 已配置:<name> · <tagline>」。
G2. 收口播稿
问用户稿子怎么给,接受三种形式,任选其一即可:
- 已经放在
input/draft/了 → 你去读(先ls input/draft/) - 直接粘贴在对话里 → 你替他写进
input/draft/draft.md - 只有一个选题方向(还没稿子)→ 让他用一两句话说清楚「想讲什么概念 + 给谁看」,你先写一版稿子进
input/draft/draft.md,给他确认后再往下走
收到稿子后先回读一次:用 3 句话说回「我理解你这期要讲的核心概念是 X,主线是 A→B→C,对吗?」等一个确认。方向错了在这里改,比出了分镜板再改便宜 10 倍。
G3. 跑第一阶段 → 交付分镜板 + 念稿
按下方「第一阶段详细步骤」执行(读 phase1-storyboard.md)。产出后停下,用这个格式交付:
✅ 第一阶段完成
- 分镜板:
output/full-storyboard.html(浏览器打开看,这就是视频的视觉终态)- 念稿:
output/voice-script.txt(共 N 段,预估 X 秒)接下来你要做的:照念稿录一条音,
[提问者]和[我]用语气区分(同一个人念,不用找第二个人)。录完存成input/voice/voice.wav,回来跟我说一声「配音好了」。想改分镜/改稿子的话现在说,改完再录不浪费。
G4. 等到用户说「配音好了」→ 跑第二阶段前先环境自检
第二阶段要用外部工具,先跑这一条自检并把缺的告诉用户:
ls input/voice/voice.wav && python3 -c "import faster_whisper" 2>&1 | tail -1; ffmpeg -version 2>&1 | head -1; npx --yes hyperframes --version 2>&1 | tail -1
缺什么给对应一句话解法:pip install faster-whisper / 装 ffmpeg / HyperFrames 未就绪(渲染步骤需要它,缺了就只能停在 timeline)。别自己静默 pip install,先问用户。
然后按「第二阶段详细步骤」执行,交付:
✅ 第二阶段完成 →
output/renders/video_final.mp4(配音 + BGM,X 秒) 建议你先看一遍,重点听 BGM 会不会盖人声、看字幕跟不跟得上嘴。 没问题我就去做封面了?
G5. 用户确认视频 → 跑第三阶段封面 → 收尾
按「第三阶段详细步骤」执行(c1 那步的 4 个问题用 AskUserQuestion 一次问完)。最后交付:
🎉 全部完成
- 视频:
output/renders/video_final.mp4- 封面:
output/renders/cover.jpg(1920×1080)- 念稿存档:
output/voice-script.txt下期直接把新稿子丢
input/draft/,IP 配置我已经记住了,可以从第一阶段直接开始。
引导期的四条硬规矩
- 一次只问一批(G1 的三要素算一批)——不要连环追问把用户问烦
- 每个阶段结束必须停,等用户确认再进下一阶段,禁一口气跑到底
- 不要让用户读 skill 内部文档(phase1/2/3、brand-dna 是给你看的)——用户只需要知道「给稿子」「录音」「确认」三个动作
- 进度可见:长步骤(whisper 对齐、render)开跑前说一句「这步大概要 X 分钟」
⚠ 开工前必读:ip-profile.md
每次进入 skill 的任何阶段前,先读 handdrawn-video-skill/ip-profile.md,把 ip.name / ip.tagline / ip.avatar_path 加载到会话上下文。
生成的所有 output/*.html output/*.txt 里的 IP 相关值必须按 ip-profile 替换:
- 占位符
{{IP_NAME}}→ip.name(小写形态:作者卡名、CTA「关注 <name> · 下期见」) - 占位符
{{IP_NAME_UPPER}}→ip.name.upper()(大写形态:orbit textPath 弧文字) - 占位符
{{IP_TAGLINE}}→ip.tagline(左上 tag 胶囊、作者卡描述) - 头像路径
assets/avatar.jpg/../../assets/avatar.jpg/../handdrawn-video-skill/assets/avatar.jpg→ 保留路径前缀但 basename 用ip.avatar_path的文件名
skill 内部(references/templates/、references/.md、scripts/.py 注释、示例)保留 EP.03 的 CSS 尺寸/角度/颜色硬编码不动 —— 这是给 claude 学参数魔法数字的活教材。但 IP 身份三项一律用 {{...}} 占位符,不写死任何品牌名。产出物里若残留 {{ 视为未完成。
定位
- 一句话定位由
ip-profile.tagline决定(模板中写作{{IP_TAGLINE}})——本 skill 的内容方向是用普通人能懂的人话讲 AI 应用、发展、科普。不是财经博主,不是技术教程。 - IP 人格:固定配音 + 手绘头像,不露脸。 声音 + 头像 = 完整虚拟 IP。
- 内容形态:场景驱动(AI 应用/发展/科普),每期讲清楚一个概念。
- 涨粉逻辑:「讲得清楚、以后再看」→ 收藏 → 算法推流。
- 横版 1920×1080,甜点 1.5-2 分钟,上限 3 分钟。
- 调性:可爱但有品质 · 手绘蜡笔感 · 有温度 · 聊天感 · 不像 AI(详见
brand-dna.md) - 节奏:聊天型、有呼吸,不是冲击型快节奏
三阶段流程
┌──────────────────────────────────────────────────────────────┐
│ 第零阶段(对话引导·见上方「使用引导」G0-G2) │
│ 报菜单 → 问 IP 三要素并写 ip-profile.md → 收口播稿 → 回读确认 │
└──────────────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────────────┐
│ 第一阶段(自动) │
│ 读口播稿 → 提取爆点 → 写配音文本 → 选场景 → 生成分镜板 │
│ 产出:output/full-storyboard.html + output/voice-script.txt │
│ ⏸️ 停止,等用户审阅分镜板 + 配音 │
└──────────────────────────────────────────────────────────────┘
↓
用户操作:① 审阅分镜板 ② 照 voice-script.txt 配音
③ 将 voice.wav 放入 input/voice/
↓
┌──────────────────────────────────────────────────────────────┐
│ 第二阶段(用户指令触发·主视频渲染) │
│ 读配音 → whisper 对齐 → 生成 timeline → 渲染 → 混音 │
│ 产出:output/renders/video_final.mp4 │
└──────────────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────────────┐
│ 第三阶段(用户确认视频后·独立封面生成) │
│ 四要素对齐 → 起 cover.html → playwright 截图 │
│ 产出:output/renders/cover.jpg(1920×1080 · JPEG q92) │
└──────────────────────────────────────────────────────────────┘
第一阶段详细步骤
📄 读 phase1-storyboard.md
| 步骤 | 做什么 | 关键产出 |
|------|--------|---------|
| 1 | 读稿 + 提取「原来是这样」时刻 + 写配音文本 + 导出 voice-script.txt | output/narrator_scripts.json + output/voice-script.txt |
| 2 | 读 brand-dna + scene-library 规范 | — |
| 4a | 选 3-5 种场景组合,逐锚点对八铁律 | — |
| 4b | 生成分镜板(门禁:不含字幕层/不含CTA/金句2行/头像本地化) | output/full-storyboard.html |
第二阶段详细步骤
📄 读 phase2-video.md
| 步骤 | 做什么 | 关键产出 |
|------|--------|---------|
| 3 | 拆分镜板为独立 1920×1080 composition | — |
| 5a | 用户照 voice-script.txt 配音 | input/voice/voice.wav |
| 5b | whisper 句级对齐(裁开头静音 → align) | output/alignment.json |
| 5c | 时间戳驱动手绘绘制 timeline | output/index.html |
| 6 | 自检 checklist(P0 不过打回) | — |
| 7a | HyperFrames render | output/renders/video.mp4 |
| 7b | BGM 混音 | output/renders/video_final.mp4 |
| 7c | ⚠️ 跳转第三阶段生成封面(独立于视频截帧,走 phase3-cover.md 独立流程)| → phase 3 |
第三阶段详细步骤
📄 读 phase3-cover.md
| 步骤 | 做什么 | 关键产出 |
|------|--------|---------|
| c1 | AskUserQuestion 与用户对齐四要素(画布比例/钩子方向/主视觉/风格) | — |
| c2 | 基于 references/templates/cover-template.html 骨架起 output/cover.html(只改标 ⚠ EP.03 例 的 6 处内容) | output/cover.html |
| c3 | 运行 python3 scripts/gen_cover.py 生成封面 | output/renders/cover.jpg |
| c4 | 肉眼审 3 秒 + 走 checklist 「封面生成门禁」段 P0 | — |
文件结构
handdrawn-video-skill/
├── SKILL.md ← 本文件(路由入口)
├── ip-profile.md ← **⚠ 开工前必读**:IP 身份配置(账号名/tagline/头像)· 用户唯一可编辑源
├── phase1-storyboard.md ← 第一阶段:步骤 1/2/4a/4b
├── phase2-video.md ← 第二阶段:步骤 3/5/6/7
├── phase3-cover.md ← 第三阶段:独立封面生成(c1-c4)
├── brand-dna.md ← 品牌基因(完整版)
├── references/
│ ├── quick-ref.md ← 速查卡(配色/字体/八铁律一页浓缩)
│ ├── burst-extraction.md ← 爆点提取方法论
│ ├── scene-library.md ← 视频场景库 20 种
│ ├── component-library.md ← 手绘绘制组件库
│ ├── handdrawn-animation.md ← 手绘绘制方法论 + 音频驱动三铁律
│ ├── bgm-guide.md ← BGM 选配指南(21 首 + 混音命令)
│ ├── checklist.md ← P0/P1/P2 自检门禁(含封面 7c 段)
│ └── templates/
│ ├── full-storyboard-template.html ← 分镜板 CSS 模板(步骤 4b 必读)
│ └── cover-template.html ← 封面骨架模板(步骤 c2 必读·保留 EP.03 v6 作例)
├── scripts/
│ ├── add_bgm.py ← BGM 自动混音(7b 步)
│ ├── align_whisper.py ← Whisper 句级对齐(5b 步)
│ ├── fix_alignment.py ← whisper 段级偏差修正(字数比例分配,5b 后处理)
│ ├── gen_bgm.py ← BGM manifest 扫描器
│ ├── gen_cover.py ← 封面截图脚本(c3 步 · playwright chromium)
│ └── gen_index.py ← 分镜板 → HF index.html + timeline 生成器(5c 步 · EP.03 v6 完整例)
└── assets/
├── components.js ← 手绘绘制组件权威源(生成场景时内联)
├── narrator-schema.json ← 配音文本 JSON Schema
├── narrator-example.json ← 配音文本示例(dual-role-qa)
├── avatar.jpg ← IP 头像
└── bgm/ ← 背景音乐池 21 首
├── bgm_manifest.json
└── social-media/{ambient,upbeat}/*.mp3
项目目录结构(必须遵守)
<project-root>/ ← 用户项目根目录
├── input/ ← 用户提供的素材(只读,skill 不写入)
│ ├── draft/ ← 口播稿(用户放入)
│ │ └── *.md / *.txt
│ └── voice/ ← 配音文件(第一阶段结束后放入)
│ └── voice.wav
│
└── output/ ← skill 产出(所有生成物放这里)
├── narrator_scripts.json ← 步骤 1:配音文本(=字幕文本)
├── voice-script.txt ← 步骤 1:纯文本念稿
│
│ ⏸️ ── 第一阶段分界线 ── ⏸️
│
├── full-storyboard.html ← 步骤 4b:全静态分镜板
├── alignment.json ← 步骤 5b:whisper 句级时间戳
├── index.html ← 步骤 5c:单一 composition + master timeline
├── assets/
│ └── avatar.jpg ← IP 头像(**仅第 5c 步 HF 渲染需要**:从 skill/assets/ 复制到此;分镜板不需要此本地文件,直接 `../handdrawn-video-skill/assets/avatar.jpg` 引用 skill 源)
└── renders/
├── video.mp4 ← 步骤 7a:HF render(含配音)
├── video_final.mp4 ← 步骤 7b:BGM 混音终版
└── cover.jpg ← 步骤 c3:独立封面(1920×1080·由 phase3-cover.md 独立流程生成,不再截视频帧)
├── output/cover.html ← 步骤 c2:封面 HTML(由 cover-template.html 骨架 + 本期 6 处内容)
路径规则:
- 所有路径相对项目根目录(如
output/full-storyboard.html、input/draft/选题.md) input/用户素材区,skill 只读不写output/skill 产出区,所有生成物放这里- 头像路径分场景:
- 分镜板
output/full-storyboard.html(浏览器静态预览):<img src="../handdrawn-video-skill/assets/avatar.jpg">直接引用 skill 源,不拷贝(浏览器可解析跨仓库相对路径,从output/回退 1 层到项目根your-project/) - HF 渲染的
output/index.html(第 5c 步):必须先把handdrawn-video-skill/assets/avatar.jpg拷贝到output/assets/avatar.jpg,HTML 用<img src="assets/avatar.jpg">(HF 沙箱不解析多层上级路径会 404)
- 分镜板
关键原则
- 开场黄金 3 秒钩子前置:第一句必须含钩子(反差/悬念/数字冲击),核心冲击前置到前 10 字,禁铺垫
- 讲清楚 > 塞爆点:一个视频讲透一个 AI 概念,收藏驱动涨粉
- 聊天感优先:配音语气像跟朋友聊天,有停顿有气口
- 分镜板即终态:第 4b 分镜板是唯一视觉真相源,第 5 步不重新创造画面
- 音频驱动视觉:固定配音,画面 timeline 事件时刻由 whisper 时间戳驱动
- timeline 不留空白:a1 必须 0s 入场 + 段间重叠 0.6s+ crossfade + 逐帧对比分镜板
- 字幕是视觉元素不是底部条:全文分句手绘风浮现,CTA 签名为字幕最后一句(Caveat 蓝色 76px)
- 配音文本 = 字幕文本:一份文本两用
- 单次 render:单一 composition + opacity crossfade,无 ffmpeg 合并
- BGM 是背景不是主角:默认 social-media/ambient 音量 0.06 + 配音 loudnorm I=-16 LUFS
- 每锚点 layout 必不同:相邻不重样,全片同 layout ≤2 次且不相邻
- 每屏必有非文字图形:每屏 ≥1 个手绘圈/vs印章/柱状图/飞轮等
- 全片统一奶白底:0 个整屏色块面板
- 禁 emoji:全部换手绘 SVG/CSS
禁忌
严格遵守 brand-dna.md 的禁忌清单,不在此重复。核心底线:截图发 Twitter 不会被说「又是AI做的」。
微信扫一扫