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。之后所有内容都会被缓存。
工作流程
- 主题,一句话概括。 如果用户没有给出,建议 3 个主题供其选择。
- 脚本。 阅读
references/writing.md:有效的钩子、结构、长度。- 目标:9 到 14 个句子,110 到 170 个单词。
- 按大约每秒 2.7 个单词计算,加上句子间 0.35 秒的停顿:130 个单词约 50 秒。
- 文件。 在用户的项目中写入
videos/<id>.json。格式如下,完整目录见references/scenes.md。将媒体文件放入videos/medias/。 - 构建。
node <skill>/scripts/make.mjs videos/<id>.json生成语音、页面、检查和联系表,不进行渲染(约 1 分钟)。 - 审查。 只打开一张图片:
videos/rendus/<id>-planche.jpg。- 它显示第 1 帧,然后每个场景结束时的状态(其所有元素都出现后),最后是结束卡片。
- 修正 JSON 并重新运行命令。语音会被缓存:只有被修改的句子会重新生成。
- 渲染。 添加
--rendu。对于 45 秒的视频,大约需要 1 分钟。你将得到:videos/rendus/<id>.mp4;-couverture.jpg,封面,即第 1 帧;<id>.txt,包含标题、字幕、标签和置顶评论。
- 发布。 阅读
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 » introuvable | au 必须引用其场景所在句子中的某个单词,写法要一致 |
logo « x » introuvable | 提供文件("medias/x.svg"),或尝试不带空格的品牌名称 |
| 文本溢出 | 缩短文本,或切换到更宽的场景(carte 或 liste 而不是 duel);不要修改 CSS |
| 单词发音错误 | 将其添加到 prononcer,例如 {"Ledger": "Ledjer"} |