Back to skills
extension
Category: Content & MediaNo API key required

手绘视频生成

根据口播搞生成自媒体视频

personAuthor: jaykakahubModelScope

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. 收口播稿

问用户稿子怎么给,接受三种形式,任选其一即可

  1. 已经放在 input/draft/ 了 → 你去读(先 ls input/draft/
  2. 直接粘贴在对话里 → 你替他写进 input/draft/draft.md
  3. 只有一个选题方向(还没稿子)→ 让他用一两句话说清楚「想讲什么概念 + 给谁看」,你先写一版稿子进 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 配置我已经记住了,可以从第一阶段直接开始。

引导期的四条硬规矩

  1. 一次只问一批(G1 的三要素算一批)——不要连环追问把用户问烦
  2. 每个阶段结束必须停,等用户确认再进下一阶段,禁一口气跑到底
  3. 不要让用户读 skill 内部文档(phase1/2/3、brand-dna 是给你看的)——用户只需要知道「给稿子」「录音」「确认」三个动作
  4. 进度可见:长步骤(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.htmlinput/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做的」。