Communitygithub.com

danbaruka/ai-video

从一个小小的 video.json 文件生成简短竖版视频(TikTok、Reels、YouTube Shorts,30 到 90 秒),风格干净、动态、白板化,Token 消耗极低。支持三种模式,全程无需手写 HTML 或 CSS。

ai-video 是什么?

ai-video 是一个面向 AI 代理的轻量级视频生成技能,专为 TikTok、Reels、YouTube Shorts 等竖屏平台设计。它通过一个 JSON 文件描述完整的视频脚本、场景和语音,自动合成配音(免费神经语音 edge-tts)、逐字同步字幕、动画化每个场景,并最终渲染出 MP4 文件。该技能提供三种工作模式:'Generated' 模式完全基于 JSON 自动生成,包含动态设计和免费语音;'Images' 模式允许将截图、照片或网页嵌入模拟的 iPhone、浏览器或全屏中;'Filmed' 模式则对真人出镜的片段自动添加字幕和动画场景。ai-video 支持英语、法语等多种语言,可在 Claude Code、Cursor 等开发工具中使用。其核心设计理念是极致的低 Token 消耗:通常一个 60 秒视频仅消耗约 65,000 个 Token,远低于手写 HTML/CSS/动画的 250-400 行代码。技能内置 16 种场景类型(标题、数字、列表、步骤、对比等),并自动检查文字溢出、运行时错误,确保输出质量。用户只需定义脚本和场景,其余工作(语音合成、动画编排、音乐音效、出版文案)全部自动化。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/danbaruka/claude-code-ai-video/tree/main/skills/ai-video

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

ai-video 是做什么的?

一个视频对应一个 video.json 文件:包含语音说出的句子,以及每个核心想法对应的一个场景(从 16 种类型中选择)。 脚本 scripts/make.mjs 负责其余所有工作。绝不要手动编写 HTML、CSS 或动画代码。唯一例外是需要定制视觉效果的单个时刻(类型 html)。

创意 ─► 脚本 (句子) ─► video.json ─► make.mjs ─► 联系表 (审查) ─► --rendu ─► MP4 + 封面 + 发布文案

JSON 键名是法语的 (phrases, texte, scene, voix, marque…),场景类型也是法语的 (titre, chiffre, liste…)。请完全按照本技能文档的写法来编写。语音所说的文本可以是任何语言。

首次使用前(一次性)

sh <skill>/scripts/install.sh      # 检查 node ≥ 18、ffmpeg、python3;在 <skill>/.venv 中安装 edge-tts

<skill> 是本文件所在的文件夹。首次运行将下载 HyperFrames(通过 npx)、GSAP 和 logo。之后所有内容都会被缓存。

工作流程

  1. 主题,一句话概括。 如果用户没有给出,建议 3 个主题供其选择。
  2. 脚本。 阅读 references/writing.md:有效的钩子、结构、长度。
    • 目标:9 到 14 个句子,110 到 170 个单词。
    • 按大约每秒 2.7 个单词计算,加上句子间 0.35 秒的停顿:130 个单词约 50 秒。
  3. 文件。 在用户的项目中写入 videos/<id>.json。格式如下,完整目录见 references/scenes.md。将媒体文件放入 videos/medias/。
  4. 构建。 node <skill>/scripts/make.mjs videos/<id>.json 生成语音、页面、检查和联系表,不进行渲染(约 1 分钟)。
  5. 审查。 只打开一张图片:videos/rendus/<id>-planche.jpg。
    • 它显示第 1 帧,然后每个场景结束时的状态(其所有元素都出现后),最后是结束卡片。
    • 修正 JSON 并重新运行命令。语音会被缓存:只有被修改的句子会重新生成。
  6. 渲染。 添加 --rendu。对于 45 秒的视频,大约需要 1 分钟。你将得到:
    • videos/rendus/<id>.mp4;
    • -couverture.jpg,封面,即第 1 帧;
    • <id>.txt,包含标题、字幕、标签和置顶评论。
  7. 发布。 阅读 references/publishing.md,了解按目标国家/地区划分的发布时间、发布频率和字幕。未经用户明确许可,切勿发布任何内容。

节省 Token:重要规则

本技能很廉价,因为模型每个视频只写 60 到 120 行 JSON,而不是 250 到 400 行 HTML 和动画代码。在盲测中,一个新的代理(包括阅读本技能文档)完成一个 60 秒的成品视频,仅消耗约 65,000 个 Token。要保持这种效率:

  • 不要打开 make.mjs、lib/*.mjs、style.css 或生成的 index.html。场景目录就足够了。只有当命令失败且错误信息不足时,才打开代码。

  • 只在需要时阅读参考文件:

    步骤参考文件
    写作writing.md
    选择场景scenes.md
    语音、素材或截图modes.md
    发布publishing.md

    在对话中不要重复阅读已经读过的参考文件。

  • 一张联系表,不需要截图。 要检查视频,查看一次 <id>-planche.jpg。不要每秒抓取一帧,也不要逐帧检查 MP4。

  • 信任检查。 命令运行 HyperFrames 检查(溢出文本、隐藏文本、运行时错误)并用几行总结。

    • "aucun débordement, aucune erreur" 表示一切干净。
    • 带 ✗ 的行必须修复。
    • 带 ⚠ 的行值得阅读:如果影响文本则修复它。
  • 批处理只需一条命令。 先编写 N 个文件。然后在后台运行 node make.mjs videos/a.json videos/b.json … --rendu,等待它完成,无需观看其输出。

  • 原地编辑。 要修复某些内容,只需修改 JSON 中有问题的句子或场景。不要重写整个文件。

  • 不要寻找素材。 Logo(logo:bitcoin、logo:metamask…)和 45 个图标(icone:cle…)是内置的。只有在用户要求时才搜索网络上的图片。

video.json 格式

{
  "id": "wallet-key",
  "titre": "Your crypto is not in your wallet",
  "langue": "en",
  "voix": { "nom": "en-US-AndrewMultilingualNeural", "debit": "+4%" },
  "marque": { "nom": "BDan", "visuel": "icone:etincelle" },
  "prononcer": { "USDT": "U S D T" },
  "phrases": [
    { "texte": "Your crypto is not in your *wallet*.",
      "scene": { "type": "titre", "lignes": ["Your crypto", "is not in", "your *wallet*"], "visuel": "icone:portefeuille" } },
    { "texte": "The key fits in *twelve words*.",
      "scene": { "type": "chiffre", "valeur": "12", "apres": "words", "au": "twelve", "couleur": "accent" } },
    { "texte": "It's called the recovery phrase." }
  ],
  "fin": { "texte": "I'm BDan.", "sous": "Let's talk new tech.", "audio": "medias/signature.wav" },
  "publication": { "titre": "…", "legende": "…", "hashtags": ["crypto"], "commentaire": "…" }
}
  • phrases[].texte:语音说出的文本,逐字对应。

    • *word* 标记强调词:以彩色斜体显示,说话时脉动,并且镜头会推近。
    • 每个句子最多使用一个。
  • scene:开始一个新场景。

    • 没有 scene 的句子会延续上一个场景,这给了读者阅读的时间。
    • 在拍摄模式下,没有场景的句子显示脸部;此时,"scene": "suite" 延续场景。
  • au("at"):该元素在句子的那个单词处出现,例如 "au": "Ledger"。

    • 如果没有 au,元素会自动分布:当元素数量和句子数量相同时,每个句子一个元素;否则均匀分布。
  • 视觉效果,用于需要的地方:"logo:binance"、"icone:cadenas"、"emoji:🔑",或者路径如 "medias/screenshot.png"(.svg 文件会被内联)。

  • voix:语音。nom 是语音名称,debit 是语速。fichier 指向你自己的录音。

  • langue:默认为 "fr"。英语设置为 "en",并搭配英语语音。

  • marque:左下角的小品牌标签。nom 是品牌名称,visuel 是其标志。

  • prononcer:口语化形式。它改变语音如何说出某个单词,绝不改变屏幕上显示的文本。

  • fin:结束卡片,包含 marque 标志、texte 和 sous(副标题)。

    • audio 在卡片上播放录制的结束语。
    • 没有 audio,卡片停留 2 秒,无声。
  • titre:视频在文件中的名称。YouTube 标题放在 publication 中。

  • 可选:

    键效果
    musique音乐文件,语音时自动降低音量
    couleurs颜色,例如 {"accent": "#2f6bff", "accent2": "#5fa3ff"}
    sons: false过渡时不使用嗖嗖声
    blanc句子间的静默,默认 0.35 秒
    pause在某个句子后额外增加静默
    sousTitres: false无字幕
  • 句子 1 必须有场景。 第 1 帧是用户在信息流中看到的封面,因此要使用简短、有钩子的 titre。

16 种场景(参数和示例见 references/scenes.md):

用于展示…类型
钩子、有力的句子titre
数字(价格、记录、百分比)chiffre
2 到 6 个要点、工具或技巧liste
2 到 5 个步骤的方法etapes
A 与 B 对比、之前/之后、误区/事实duel
品牌、币种、应用logos
应用截图或录屏telephone
网站、页面navigateur
照片,以卡片或全屏形式image
对话(AI、支持、诈骗)chat
危险、诈骗、好消息alerte
趋势、数字比较graphique
命令、安装terminal
某人的引言citation
概念及其解释carte
需要定制视觉效果的那个时刻html

场景要多样化。

  • 为每个核心想法分配一个独立的场景:每个视频 6 到 10 个场景。
  • 绝不在连续两个场景中使用相同类型,并且要改变视频之间场景类型的顺序。
  • 固定的风格不能成为模板。如果连续三个视频的场景顺序相同,观众会流失。

三种模式(详情见 references/modes.md)

  • Generated:只需要 JSON。
    • 语音来自 edge-tts:免费、无需密钥、支持多种语言。
    • 设置 voix.nom 可以更改语音或口音。
  • Images:你的截图和照片放入 telephone、navigateur 或 image,来自 videos/medias/。
    • 录制或克隆的语音放在 "voix": { "fichier": "medias/voice.wav" } 中。
    • 语音会被本地转录(whisper)并与你的句子同步。
  • Filmed:设置 "rush": "medias/clip.mp4"。片段的音频就是语音。
    • 没有场景的句子显示脸部,字幕在底部。
    • 场景在其想法持续的时间内覆盖屏幕。
    • 根据转录编写句子:技能会逐字同步它们。

渲染前检查清单

  • 句子 1 清晰陈述主题,其标题在一秒内可读。
  • 每个技术词汇都在同一句或下一句中解释。
  • 每个句子最多一个强调词,并且有 6 到 10 个不同类型的场景。
  • 数字来自真实、经过核实的来源。当数字来自他人时,chiffre 场景应带有 source。
  • 联系表已审查,检查结果为干净,没有留下 "mot introuvable"(单词未找到)的警告。
  • 结尾给出一个留下的理由(接下来会发生什么、值得记住的一句话),而非一个模糊的问题。
  • 展示品牌是为了讨论它们,绝不暗示合作关系。
  • 虚构对话带有 "mention": "Exemple fictif",或英文的 "Example"。

遇到问题怎么办

消息操作
voix : … edge_tts运行 sh <skill>/scripts/install.sh
mot « x » introuvableau 必须引用其场景所在句子中的某个单词,写法要一致
logo « x » introuvable提供文件("medias/x.svg"),或尝试不带空格的品牌名称
文本溢出缩短文本,或切换到更宽的场景(carte 或 liste 而不是 duel);不要修改 CSS
单词发音错误将其添加到 prononcer,例如 {"Ledger": "Ledjer"}

相关技能