Communitygithub.com

Klip: prompt → TikTok 视频生成器(印尼语)

将印尼语主题提示转换为完整的 TikTok 视频(1080x1920 MP4,含画外音和词语同步字幕)。当用户说 /klip、"buat video tentang …"、"make a TikTok about …" 或要求渲染 Klip 规格时使用。

Klip: prompt → TikTok 视频生成器(印尼语) 是什么?

这是一个针对 AI 代理(如 Claude Code、Cursor、Codex)的专业技能,旨在将印尼语主题提示自动生成完整的 TikTok 视频(1080x1920 MP4,含画外音和词语同步字幕)。该技能遵循严格的管线流程:解析请求 → 读取合同 → 研究事实 → 编写场景规格 JSON → 验证 → 人工审核 → 后台渲染(约 2-2.5 分钟/45 秒视频)→ 报告。支持男性(Ardi)和女性(Gadis)两种语音,默认时长 45 秒,最长 60 秒。视频支持多种模板场景(hook、explain、list_item、myth_fact、stat、compare、cta),并可选择素材库视频、分镜、图标、纯色背景等视觉元素。内置 QA 检查和缓存机制,渲染失败时可运行医生诊断。也支持批量处理多个主题。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aliflazuardi/klip/tree/HEAD/.claude/skills/klip

在你喜欢的 AI 中提问

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

文档

Klip:prompt → TikTok 视频

你是脚本作者。你编写场景规格 JSON,用户审核通过后,管线进行渲染。规格是合同:重新渲染相同的规格会得到相同的视频。

流程

  1. 解析请求。 主题(印尼语)、语音(male = Ardi, female = Gadis;默认 female;"suara cowok" = male,"suara cewek" = female)、目标时长(默认 45 秒,最大 60 秒)。
  2. 读取合同(如果本次会话尚未读取):schema/spec.schema.json 和黄金示例 examples/menguap.json。
  3. 研究事实:针对健康/科学/金融声明,将每个事实放入 facts[] 中,并附上真实的来源 URL。不要引用你无法指向的内容。
  4. 编写规格 到 specs/<slug>.json(slug = 主题的 kebab-case,仅限 ASCII)。
  5. 验证:uv run klip validate specs/<slug>.json --voice <voice>。修复每个错误,并调整字数,直到预估时长在目标的 ±15% 范围内。
  6. 审核门 — 停止并向用户显示 脚本:每个场景的旁白和屏幕文本、预估时长以及带来源的事实。请求批准或修改。在用户说“是”之前不要渲染(仅当他们明确说不要审核时才跳过)。
  7. 渲染(45 秒视频约需 2–2.5 分钟;在后台运行): uv run klip render specs/<slug>.json --voice <voice> 输出文件位于 projects/<slug>/:final.mp4、cover.png(设计的封面)、post.txt(含 B-roll 致谢)、credits.json。
  8. 报告 路径、时长以及来自 post.txt 的 TikTok 说明。提醒用户启用 TikTok 的 AI 生成内容标签(语音是合成的)。

同时处理多个主题? 编写一个 YAML 文件(参见 examples/batch.yaml),运行 uv run klip batch topics.yaml --scripts-only,向用户显示规格,然后使用 uv run klip batch topics.specs.yaml 渲染(在后台;每段视频约 3–4 分钟)。

如果 klip render 失败,运行 uv run klip doctor 并修复报告的问题。klip run <stage> 重新运行单个阶段(voice | assets | compose | render | post | qa)。

QA: klip render 以 QA 报告结束,如果检查失败则退出 1。修复原因(例如,时长超出范围 → 缩短/加长旁白或调整 target_duration_s)并重新渲染;未更改的阶段会被缓存。将你无法修复的任何检查告知用户。

此版本可渲染的内容(Phase 3)

  • 模板(选择适合每个节拍的模板;变化使用,因为整个视频都用 explain 会很枯燥):
    • hook:始终是第一个场景。on_screen_text 为 2–5 个有力词汇。
    • explain:旁白的默认模板。on_screen_text 是一个短标题。
    • list_item:技巧("Satu, …","Dua, …")。使用 2–4 个连续的 list_item 场景;编号和 "1/3" 是自动的。on_screen_text = 技巧,不超过 5 个词。
    • myth_fact:需要 myth 和 fact(每个 ≤ 8 个词)。旁白先陈述误区,然后 "Faktanya, …"。设置 reveal_at 为该词("Faktanya,"),使事实卡在提示时出现。
    • stat:需要 stat: {value, suffix?, prefix?, decimals?, label?}。一个引人注目的数字,例如 {"value": 20, "suffix": " menit", "label": "durasi ideal tidur siang"}。该数字必须出现在旁白中,并有 facts[] 支持。
    • compare:需要 compare: {left: {label, text?, icon?}, right: {...}}。标签 ≤ 3 个词,文本 ≤ 3 个词。on_screen_text 是一个可选标题("Power nap vs tidur lama")。
    • cta:始终是最后一个场景。设置 cta_type 来选择要求(参见写作指南):follow | save | comment | share。它会在标题下添加一个操作芯片(图标 + "Follow" / "Simpan" / "Komen di bawah" / "Kirim ke teman");对于 comment,on_screen_text 是问题并成为标题。
  • 样式:除非用户指定了样式或 CLAUDE.md / CLAUDE.local.md 说明了使用哪种样式,否则将 "style" 留空(默认)。uv run klip styles 列出它们(klip.yaml 样式和 brands/<name>/ 中的品牌包)。品牌包的系列标签来自其 brand.yaml(series_pill.labels)。
  • 进度条:顶部的细条跟随样式(默认开启)。如果用户要求不带进度条的视频("tanpa progress bar","no progress bar"),则在规格中设置 "progress_bar": false(或 true 强制开启);否则留空。
  • 音乐:将 music.mood 保持为 "calm"(或 assets/music/ 下的另一个文件夹名);设置 "mood": null 表示无音乐。如果渲染提示没有音乐,说明用户可以添加曲目到 assets/music/<mood>/。
  • 视觉元素:
    • stock_video(大多数场景的默认选择)/ stock_photo:query = 2–4 个英文词,描述具体的、可拍摄的镜头("woman yawning","family hugging","person reading book")。避免抽象查询("empathy theory"):素材库匹配具体主体。始终添加 name(一个 Lucide 图标)作为未找到内容时的后备。
    • 节拍(快速切换): 一个剪辑不会在视频中出现两次,因此长场景需要多个剪辑。为每个长于约 4 秒的场景提供 beats:后续镜头,按旁白顺序,每个 {at, query},其中 at 是切换发生的旁白词(该词命名了新剪辑显示的内容),query 是具体的英文素材查询。目标是每约 2–3 秒一个新剪辑(间隔小于 1.4 秒的节拍会被丢弃)。示例:旁白 "Rupiah melemah, barang impor jadi mahal: kedelai, pakan, sampai BBM" → query: "rupiah banknotes",beats: [{"at": "impor", "query": "container ship port"}, {"at": "kedelai", "query": "soybeans closeup"}, {"at": "BBM", "query": "gas station fuel pump"}]。选择旁白中改变主题的 at 词,并变化主题:四段关于钱的镜头看起来像一段长镜头。没有可用结果的节拍会被跳过(上一个镜头继续播放),因此当场景依赖一个剪辑超过约 6 秒时,validate 会警告。如果没有节拍,场景会根据计时器被切割成与其不同剪辑数量相同的镜头。(queries 是较旧的定时切割形式;优先使用 beats。)max_shots: 1 保持一个连续镜头(很少需要)。
    • stage(图解式解说,90secondslab 风格):无素材镜头。一个持久的 background(desk,paper,kraft,board,或图像路径),在其上 elements 逐步构建,每个在它的 at 词上弹出并停留。用于涉及金钱、数字、因果或素材镜头难以表现的主题(本地食物、印尼机构)。种类:cutout(query = 一个英文物体/人物,例如 "soybeans","stressed businessman";背景移除,贴纸外观)、photo(照片卡)、icon(Lucide name)、label(text,1–4 个词)、number(显示的 text,≤ 9 个字符,例如 "-11%","Rp18rb";tone up/down 为其着色)、bar(2–4 个 bars {label, value, text})、stack(name × count,例如硬币堆积)、highlight(围绕元素编号 target 的黄色框)。cutout/photo/icon 带有一个短 label 标签。规则:每个旁白主题一个元素,每约 1–2 秒一个;at 词按旁白顺序;舞台上同时最多 6 个元素(在元素上设置 "clear": true 会先清空舞台);布局自动进行(pos tl…br 仅用于强制一个插槽)。与 hook、explain 和 list_item 配合使用(on_screen_text 变为纸张标题条)。保持连续的 stage 场景使用相同的背景:它保持显示,只有道具变化。示例:旁白 "Rupiah melemah, jadi barang impor mahal: kedelai, pakan ayam, dan BBM" → {"type": "stage", "background": "desk", "elements": [{"at": "Rupiah", "kind": "stack", "name": "coins"}, {"at": "impor", "kind": "number", "text": "Rp18rb", "tone": "down"}, {"at": "kedelai", "kind": "cutout", "query": "soybeans", "label": "Kedelai", "clear": true}, {"at": "pakan", "kind": "cutout", "query": "chicken"}, {"at": "BBM", "kind": "icon", "name": "fuel", "label": "BBM"}]}。素材搜索对印尼食物较弱:当道具必须完全准确时,优先使用图标或指向用户自己照片的 path。
    • icon:Lucide name(检查 renderer/node_modules/lucide-static/icons/<name>.svg)。适用于 CTA 和没有良好素材的抽象概念。
    • local:指向用户自己剪辑的 path。当他们提到自己的素材时使用。assets/broll/ 也会被自动按标签搜索。
    • solid:渐变背景。ai_image 当前变为素材照片(prompt 被用作查询)。
  • 渲染后,检查输出中的 assets: 行和警告。如果场景回退到图标或得到了不相关的剪辑,建议更合适的查询。对于 stage 场景,以相同方式检查 projects/<slug>/media/<scene>_el<n>.*(剪切图)。

写作指南

  • 钩子优先:前 2 秒决定一切。 场景 1 不超过 12 个词,其 on_screen_text 为 2–5 个有力词汇。前几个词必须已经承载张力;不要问候,不要 "Hai guys",不要 "Di video ini…"。强钩子类型:
    • 击中日常体验的问题:"Pernah nggak kamu…?"
    • 反驳某种信念的声明:"Minum air dingin bikin gemuk?Salah besar."
    • 不知道的成本:"Kalau kamu nyimpan cabai begini, pantesan cepat busuk."
    • 数字/列表承诺:"3 kebiasaan pagi yang diam-diam bikin kamu ngantuk."
  • 开放循环: 钩子承诺了一些直到接近结尾才会兑现的东西(答案,"yang ketiga paling penting",令人惊讶的事实)。在 CTA 之前的最后一个内容场景中兑现它。永远不要在场景 2 中解决钩子。
  • A/B 钩子(hook_variants): 当要求钩子变体时(例如 --hooks 3),添加替代的第一个场景,每个使用上面列表中不同的钩子类型,具有相同的回报,以便视频的其余部分仍然合适。每个变体:narration(≤ 12 个词)、on_screen_text(≤ 5 个词)、可选的 emphasis/visual。
  • 一个视频一个想法。 4–6 个场景。随意的印尼语("kamu","nggak","banget" 都是可以的)。
  • 字数预算(经过测量;保持 speech_rate 未设置以获取每语种的默认值): 女性(Gadis,+15%)≈ 1.97 词/秒,男性(Ardi,+8%)≈ 2.35 词/秒。对于 45 秒:女性约 85 词,男性约 100 词。klip validate 会估算。
  • 短句,每个场景 1–2 句。每个场景的 on_screen_text 是一个短标题(≤ 6 个词),不是重复旁白。
  • emphasis:每个场景 1–3 个关键词或短语,照搬它们在旁白或屏幕文本中的样子。
  • 表达方式 是自动的:钩子充满活力,stat/myth_fact 强调,CTA 温暖,其他中性。仅在场景氛围不同时使用 "delivery"(neutral | energetic | emphatic | warm | calm)覆盖,例如悲伤或严肃的节拍用 calm,回报用 emphatic。
  • tts_override 仅在 TTS 误发音时使用(例如 "Follow" → "Folo")。一般性修复放在 klip.yaml 的 lexicon 部分(用 uv run klip say "…" 测试)。
  • 健康/金融/安全: 仅限一般信息,无个人建议,来源在 facts[] 中。
  • 以 cta 场景结束并选择其 cta_type。 评论和收藏比关注更能提高视频排名,因此优先考虑它们:
    • comment 当视频有两面或一个选择时(对比、误区与事实、"你选哪个?"):以一个任何人都可以用一个词回答的两面问题结尾,并在旁白和 on_screen_text(≤ 8 词,以 "?" 结尾)中都说两次,例如旁白 "Kamu tim kulkas atau tim freezer?Tulis di komentar." + on_screen_text "Kamu tim kulkas atau freezer?"。不是一个只有一个正确答案的测验,也不是 "ada pertanyaan?"。
    • save 用于人们以后想保存的技巧、步骤和列表("Simpan biar nggak lupa")。
    • share 当它对别人有用时("Kirim ke teman yang suka begadang")。
    • follow 用于系列或 "第二部分" 预告("Follow buat fakta lainnya!")。 每个视频一个请求;旁白必须说出与芯片相同的内容。
  • 保存提示(自动): 在列表视频上(2 个以上连续的 list_item),当项目 2 开始时会出现一个 "Simpan dulu biar nggak lupa" 药丸。不要在旁白中也说它。用 "save_nudge": false 关闭它(例如,当 CTA 已经是 save 时,以避免询问两次)。
  • post.caption:一句话加一个表情符号。post.hashtags:3–5 个,包括 #edukasi。
  • cover(可选;显示在个人资料网格上的 cover.png):title(3–5 个词,引子)+ keyword(1–2 个词,回报,用强调色大字绘制),或者 lines(2–3 行显式行,最后一行是关键词),加上 subtitle(一个增加好奇心的短句,不是答案),例如 "cover": {"title": "Kenapa Kita Ikut Ikutan", "keyword": "Menguap?", "subtitle": "Ternyata bukan karena bosan"}。未设置 → 使用钩子的 on_screen_text(其强调的结尾成为关键词),无副标题;每当钩子文本本身不是一个好标题时,就写一个。

相关技能