Communitygithub.com

aliflazuardi/klip

Verwandle ein indonesisches Themen-Prompt in ein fertiges TikTok-Video (1080x1920 MP4 mit Voiceover und wortgenauen Untertiteln) mithilfe der Klip-Pipeline in diesem Repository. Verwende es, wenn der Benutzer /klip sagt, „buat video tentang …

Was ist klip?

Klip ist ein KI-gestütztes Tool, das aus einer indonesischen Themenvorgabe ein vollständiges TikTok-Video erstellt. Die Pipeline umfasst die automatische Drehbucherstellung als JSON-Spezifikation, die auf Wunsch validiert und dann zu einem 1080x1920 MP4-Video mit Sprachausgabe und wortgenauen Untertiteln gerendert wird. Es unterstützt verschiedene Vorlagen wie 'hook', 'explain', 'list_item', 'myth_fact', 'stat', 'compare' und 'cta', die automatisch an den Inhalt angepasst werden. Besonders nützlich ist die Faktentrecherche für Gesundheits-, Wissenschafts- oder Finanzbehauptungen, bei der reale Quellen angegeben werden müssen. Entwickler können den gesamten Workflow über die Befehlszeile steuern, von der Validierung bis zum Rendern, und erhalten am Ende eine Qualitätssicherung. Das Tool ist ideal für Content-Ersteller, die schnell und konsistent indonesischsprachige TikTok-Videos produzieren möchten, ohne jedes Mal manuell schneiden und gestalten zu müssen.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aliflazuardi/klip/tree/HEAD/.claude/skills/klip

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Klip: Prompt → TikTok-Video

Du bist der Drehbuchautor. Du schreibst eine Szenen-Spezifikation (JSON) , der Benutzer prüft sie, danach rendert die Pipeline das Video. Die Spezifikation ist der Vertrag: Das erneute Rendern derselben Spezifikation ergibt dasselbe Video.

Ablauf

  1. Anfrage parsen. Thema (Indonesisch), Stimme (male = Ardi, female = Gadis; Standard female; „suara cowok“ = männlich, „suara cewek“ = weiblich), Ziel-Dauer (Standard 45 s, max. 60).
  2. Den Vertrag lesen, falls du ihn noch nicht in dieser Sitzung gelesen hast: schema/spec.schema.json und das goldene Beispiel examples/menguap.json.
  3. Fakten recherchieren für Gesundheits-/Wissenschafts-/Finanzbehauptungen und jede in facts[] mit einer echten Quellen-URL ablegen. Zitiere nichts, auf das du nicht verweisen kannst.
  4. Die Spezifikation schreiben nach specs/<slug>.json (slug = Kebab-Case des Themas, nur ASCII).
  5. Validieren: uv run klip validate specs/<slug>.json --voice <voice>. Korrigiere jeden Fehler und passe die Wortanzahl an, bis die geschätzte Dauer innerhalb von ±15 % der Ziel-Dauer liegt.
  6. Prüf-Schleuse – anhalten und dem Benutzer das Skript zeigen: die Erzählung und der Bildschirmtext jeder Szene, die geschätzte Dauer sowie die Fakten mit Quellen. Um Genehmigung oder Bearbeitungen bitten. Nicht rendern, bevor der Benutzer zustimmt (nur überspringen, wenn er explizit gesagt hat, nicht zu prüfen).
  7. Rendern (ca. 2–2,5 min für 45 s; im Hintergrund ausführen): uv run klip render specs/<slug>.json --voice <voice> Die Ausgaben landen in projects/<slug>/: final.mp4, cover.png (gestaltetes Cover), post.txt (mit B-Roll-Credits), credits.json.
  8. Die Pfade melden, die Dauer und die TikTok-Bildunterschrift aus post.txt. Den Benutzer daran erinnern, das KI-generierte Inhaltslabel von TikTok zu aktivieren (die Stimme ist synthetisch).

Mehrere Themen auf einmal? Eine YAML-Datei schreiben (siehe examples/batch.yaml), uv run klip batch topics.yaml --scripts-only ausführen, dem Benutzer die Spezifikationen zeigen, dann mit uv run klip batch topics.specs.yaml rendern (im Hintergrund; ~3–4 min pro Video).

Wenn klip render fehlschlägt, uv run klip doctor ausführen und beheben, was gemeldet wird. klip run <stage> führt eine einzelne Stufe erneut aus (voice | assets | compose | render | post | qa).

QA: klip render endet mit einem QA-Bericht und beendet sich mit Exit-Code 1, wenn eine Prüfung fehlschlägt. Die Ursache beheben (z. B. Dauer außerhalb des Bereichs → Erzählung kürzen/verlängern oder target_duration_s anpassen) und neu rendern; unveränderte Stufen werden zwischengespeichert. Den Benutzer über jede Prüfung informieren, die nicht behoben werden konnte.

Was dieser Build rendern kann (Phase 3)

  • Vorlagen (die auswählen, die zu jedem Takt passt; variieren, da ein ganzes Video aus explain langweilig ist):
    • hook: immer die erste Szene. on_screen_text 2–5 knackige Wörter.
    • explain: die Standardvorlage für Erzählung. on_screen_text ist eine kurze Überschrift.
    • list_item: Tipps („Satu, …“, „Dua, …“). 2–4 aufeinanderfolgende list_item-Szenen verwenden; die Nummerierung und „1/3“ sind automatisch. on_screen_text = der Tipp in ≤ 5 Wörtern.
    • myth_fact: erfordert myth und fact (jeweils ≤ 8 Wörter). Die Erzählung nennt den Mythos, dann „Faktanya, …“. reveal_at auf dieses Wort setzen („Faktanya,“), damit die Fakt-Karte zum passenden Zeitpunkt erscheint.
    • stat: erfordert stat: {value, suffix?, prefix?, decimals?, label?}. Eine auffällige Zahl, z. B. {"value": 20, "suffix": " menit", "label": "durasi ideal tidur siang"}. Die Zahl muss in der Erzählung vorkommen und durch facts[] belegt sein.
    • compare: erfordert compare: {left: {label, text?, icon?}, right: {...}}. Labels ≤ 3 Wörter, Text ≤ 3 Wörter. on_screen_text ist eine optionale Überschrift („Power nap vs tidur lama“).
    • cta: immer die letzte Szene. cta_type setzen, um die Aufforderung auszuwählen (siehe Schreibanleitung): follow | save | comment | share. Fügt ein Aktions-Chip (Symbol + „Follow“ / „Simpan“ / „Komen di bawah“ / „Kirim ke teman“) unter der Überschrift hinzu; bei comment wird on_screen_text zur Frage und zur Überschrift.
  • Stil: "style" nicht setzen (Standard), es sei denn, der Benutzer nennt einen oder CLAUDE.md / CLAUDE.local.md gibt an, welcher verwendet werden soll. uv run klip styles listet sie auf (klip.yaml-Stile und Markenpakete in brands/<name>/). Die Serienlabels eines Markenpakets stammen aus seiner brand.yaml (series_pill.labels).
  • Fortschrittsbalken: der dünne Balken oben folgt dem Stil (standardmäßig aktiviert). Wenn der Benutzer ein Video ohne verlangt („tanpa progress bar“, „no progress bar“), "progress_bar": false in der Spezifikation setzen (oder true, um es zu erzwingen); andernfalls nicht setzen.
  • Musik: music.mood als „calm“ belassen (oder einen anderen Ordnernamen unter assets/music/); "mood": null für keine Musik. Wenn der Renderer sagt, es gibt keine Musik, erwähnen, dass der Benutzer Titel zu assets/music/<mood>/ hinzufügen kann.
  • Visuelles:
    • stock_video (Standardwahl für die meisten Szenen) / stock_photo: query = 2–4 englische Wörter, die eine konkrete, filmbare Einstellung beschreiben („woman yawning“, „family hugging“, „person reading book“). Abstrakte Abfragen vermeiden („empathy theory“): Aktienbibliotheken finden konkrete Motive. Immer name hinzufügen (ein Lucide-Symbol) als Fallback, falls nichts gefunden wird.
    • Beats (schnelle Schnitte): Ein Clip wird nie zweimal in einem Video gezeigt, daher benötigt eine lange Szene mehrere Clips. Jeder Szene, die länger als ~4 s ist, beats geben: spätere Einstellungen, in Erzählreihenfolge, jeweils {at, query}, wobei at das Wort der Erzählung ist, auf das der Schnitt fällt (das Wort, das benennt, was der neue Clip zeigt) und query eine konkrete englische Stock-Abfrage dafür ist. Ziel ist ein neuer Clip alle ~2–3 s (Beats näher als 1,4 s werden verworfen). Beispiel: Erzählung „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-Wörter wählen, bei denen die Erzählung das Thema wechselt, und die Themen variieren: vier Aufnahmen von Geld wirken wie eine lange Einstellung. Ein Beat ohne verwendbares Ergebnis wird übersprungen (die vorherige Einstellung läuft weiter), daher warnt validate, wenn eine Szene für mehr als ~6 s auf einen einzigen Clip angewiesen wäre. Ohne Beats wird eine Szene zeitgesteuert in so viele Einstellungen geschnitten, wie es unterschiedliche Clips gibt. (queries ist die ältere, zeitgesteuerte Form; beats bevorzugen.) max_shots: 1 behält eine durchgehende Einstellung (selten nötig).
    • stage (illustrierte Erklärung, 90secondslab-Stil): kein Stock-Filmmaterial. Ein dauerhafter background (desk, paper, kraft, board oder ein Bildpfad), auf dem elements aufgebaut werden, die jeweils zu ihrem at-Wort erscheinen und bleiben. Verwenden für Szenen über Geld, Zahlen, Ursachen und Wirkungen oder Dinge, die Stock-Filmmaterial schlecht zeigt (lokale Gerichte, indonesische Institutionen). Arten: cutout (query = ein englisches Objekt/eine Person, z. B. „soybeans“, „stressed businessman“; Hintergrund entfernt, Sticker-Look), photo (Fotokarte), icon (Lucide-name), label (text, 1–4 Wörter), number (text wie angezeigt, ≤ 9 Zeichen, z. B. „-11%“, „Rp18rb“; tone up/down färbt es), bar (2–4 bars {label, value, text}), stack (name × count, z. B. sich stapelnde Münzen), highlight (gelbe Box um Elementnummer target). cutout/photo/icon erhalten ein kurzes label-Tag. Regeln: ein Element pro Erzählungsthema, alle ~1–2 s; at-Wörter in Erzählreihenfolge; höchstens 6 gleichzeitig auf der Bühne ("clear": true bei einem Element löscht zuerst die Bühne); Layout ist automatisch (pos tl…br nur, um einen Slot zu erzwingen). Funktioniert mit hook, explain und list_item (der on_screen_text wird zu einem Papier-Titelstreifen). Aufeinanderfolgende Bühnenszenen auf demselben Hintergrund belassen: Dieser bleibt auf dem Bildschirm, nur die Requisiten wechseln. Beispiel: Erzählung „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"}]}. Die Stock-Suche ist für indonesische Lebensmittel schwach: ein Symbol oder path zum eigenen Foto des Benutzers bevorzugen, wenn eine Requisite genau richtig sein muss.
    • icon: Lucide-name (prüfen unter renderer/node_modules/lucide-static/icons/<name>.svg). Gut für den CTA und für abstrakte Ideen ohne gutes Filmmaterial.
    • local: path zum eigenen Clip des Benutzers. Verwenden, wenn er eigenes Filmmaterial erwähnt. assets/broll/ wird ebenfalls automatisch nach Tags durchsucht.
    • solid: Verlaufshintergrund. ai_image wird derzeit zu einem Stock-Foto (prompt wird als Abfrage verwendet).
  • Nach dem Rendern die assets:-Zeilen in der Ausgabe und die Warnungen prüfen. Wenn eine Szene auf ein Symbol zurückfiel oder einen unpassenden Clip erhielt, eine bessere Abfrage vorschlagen. Bei Bühnenszenen projects/<slug>/media/<scene>_el<n>.* (die Ausschnitte) auf die gleiche Weise prüfen.

Schreibanleitung

  • Hook zuerst: Die ersten 2 Sekunden entscheiden alles. Szene 1 ist ≤ 12 Wörter und ihr on_screen_text 2–5 knackige Wörter. Die ersten Wörter müssen bereits die Spannung tragen; keine Begrüßung, kein „Hai guys“, kein „Di video ini…“. Starke Hook-Typen:
    • Frage, die eine alltägliche Erfahrung trifft: „Pernah nggak kamu…?“
    • Behauptung, die einer Überzeugung widerspricht: „Minum air dingin bikin gemuk? Salah besar.“
    • Kosten des Nichtwissens: „Kalau kamu nyimpan cabai begini, pantesan cepat busuk.“
    • Zahlen-/Listenversprechen: „3 kebiasaan pagi yang diam-diam bikin kamu ngantuk.“
  • Offene Schleife: Der Hook verspricht etwas, das erst gegen Ende eingelöst wird (die Antwort, „yang ketiga paling penting“, die überraschende Tatsache). In der letzten Inhalts-Szene vor dem CTA einlösen. Den Hook niemals in Szene 2 auflösen.
  • A/B-Hooks (hook_variants): Wenn nach Hook-Varianten gefragt wird (z. B. --hooks 3), alternative erste Szenen hinzufügen, die jeweils einen anderen Hook-Typ aus der obigen Liste verwenden, mit derselben Auflösung, damit der Rest des Videos noch passt. Jede Variante: narration (≤ 12 Wörter), on_screen_text (≤ 5 Wörter), optional emphasis/visual.
  • Eine Idee pro Video. 4–6 Szenen. Lässiges Indonesisch („kamu“, „nggak“, „banget“ sind in Ordnung).
  • Wortbudget (gemessen; speech_rate nicht setzen, um den Standard pro Stimme zu erhalten): weiblich (Gadis, +15 %) ≈ 1,97 Wörter/s, männlich (Ardi, +8 %) ≈ 2,35 Wörter/s. Für 45 s: ~85 Wörter weiblich, ~100 Wörter männlich. klip validate schätzt es.
  • Kurze Sätze, 1–2 pro Szene. Jedes on_screen_text einer Szene ist eine kurze Überschrift (≤ 6 Wörter), nicht die Erzählung.
  • emphasis: 1–3 Schlüsselwörter oder -phrasen pro Szene, genau so kopiert, wie sie in der Erzählung oder im Bildschirmtext erscheinen.
  • Lieferung ist automatisch: Hook energisch, stat/myth_fact nachdrücklich, CTA warm, alles andere neutral. Überschreiben einer Szene mit "delivery" (neutral | energetic | emphatic | warm | calm) nur, wenn ihre Stimmung abweicht, z. B. calm für einen traurigen oder ernsten Takt, emphatic für die Auflösung.
  • tts_override nur, wenn die TTS etwas falsch ausspricht (z. B. „Follow“ → „Folo“). Allgemeine Korrekturen in den lexicon-Abschnitt von klip.yaml (testen mit uv run klip say "…").
  • Gesundheit / Finanzen / Sicherheit: nur allgemeine Informationen, keine individuelle Beratung, Quellen in facts[].
  • Mit einer cta-Szene enden und ihren cta_type wählen. Kommentare und Speicherungen bewerten ein Video höher als Follows, daher diese bevorzugen:
    • comment, wenn das Video zwei Seiten oder eine Wahl hat (Vergleich, Mythos vs. Fakt, „which do you do?“): mit einer zweiseitigen Frage enden, die jeder mit einem Wort beantworten kann, und sie zweimal sagen: in der Erzählung und als on_screen_text (≤ 8 Wörter, endet mit „?“), z. B. Erzählung „Kamu tim kulkas atau tim freezer? Tulis di komentar.“ + on_screen_text „Kamu tim kulkas atau freezer?“. Kein Quiz mit einer richtigen Antwort, kein „ada pertanyaan?“.
    • save für Tipps, Schritte und Listen, die Benutzer später behalten wollen („Simpan biar nggak lupa“).
    • share, wenn es für jemand anderen nützlich ist („Kirim ke teman yang suka begadang“).
    • follow für Serien oder „Teil 2“-Teaser („Follow buat fakta lainnya!“). Eine Aufforderung pro Video; die Erzählung muss dasselbe sagen, was das Chip zeigt.
  • Speichern-Hinweis (automatisch): bei Listen-Videos (2+ aufeinanderfolgende list_item) erscheint ein „Simpan dulu biar nggak lupa“-Pill, wenn Punkt 2 beginnt. Nicht auch in der Erzählung sagen. Ausschalten mit "save_nudge": false (z. B. wenn der CTA bereits save ist, um doppeltes Fragen zu vermeiden).
  • post.caption: ein Satz plus ein Emoji. post.hashtags: 3–5, einschließlich #edukasi.
  • cover (optional; das cover.png, das im Profilraster angezeigt wird): title (3–5 Wörter, der Einstieg) + keyword (1–2 Wörter, die Auflösung, groß in der Akzentfarbe gezeichnet), oder lines (2–3 explizite Zeilen, die letzte ist das Stichwort), plus subtitle (ein kurzer Satz, der Neugier weckt, nicht die Antwort), z. B. "cover": {"title": "Kenapa Kita Ikut Ikutan", "keyword": "Menguap?", "subtitle": "Ternyata bukan karena bosan"}. Nicht gesetzt → das on_screen_text des Hooks (seine betonte Endung wird zum Stichwort) ohne Untertitel; einen schreiben, wenn der Hook-Text allein kein guter Titel ist.

Verwandte Skills