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
- Anfrage parsen. Thema (Indonesisch), Stimme (
male= Ardi,female= Gadis; Standardfemale; „suara cowok“ = männlich, „suara cewek“ = weiblich), Ziel-Dauer (Standard 45 s, max. 60). - Den Vertrag lesen, falls du ihn noch nicht in dieser Sitzung gelesen hast:
schema/spec.schema.jsonund das goldene Beispielexamples/menguap.json. - 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. - Die Spezifikation schreiben nach
specs/<slug>.json(slug = Kebab-Case des Themas, nur ASCII). - 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. - 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).
- 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 inprojects/<slug>/:final.mp4,cover.png(gestaltetes Cover),post.txt(mit B-Roll-Credits),credits.json. - 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
explainlangweilig ist):hook: immer die erste Szene.on_screen_text2–5 knackige Wörter.explain: die Standardvorlage für Erzählung.on_screen_textist 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: erfordertmythundfact(jeweils ≤ 8 Wörter). Die Erzählung nennt den Mythos, dann „Faktanya, …“.reveal_atauf dieses Wort setzen („Faktanya,“), damit die Fakt-Karte zum passenden Zeitpunkt erscheint.stat: erfordertstat: {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 durchfacts[]belegt sein.compare: erfordertcompare: {left: {label, text?, icon?}, right: {...}}. Labels ≤ 3 Wörter, Text ≤ 3 Wörter.on_screen_textist eine optionale Überschrift („Power nap vs tidur lama“).cta: immer die letzte Szene.cta_typesetzen, 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; beicommentwirdon_screen_textzur Frage und zur Überschrift.
- Stil:
"style"nicht setzen (Standard), es sei denn, der Benutzer nennt einen oderCLAUDE.md/CLAUDE.local.mdgibt an, welcher verwendet werden soll.uv run klip styleslistet sie auf (klip.yaml-Stile und Markenpakete inbrands/<name>/). Die Serienlabels eines Markenpakets stammen aus seinerbrand.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": falsein der Spezifikation setzen (odertrue, um es zu erzwingen); andernfalls nicht setzen. - Musik:
music.moodals „calm“ belassen (oder einen anderen Ordnernamen unterassets/music/);"mood": nullfür keine Musik. Wenn der Renderer sagt, es gibt keine Musik, erwähnen, dass der Benutzer Titel zuassets/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. Immernamehinzufü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,
beatsgeben: spätere Einstellungen, in Erzählreihenfolge, jeweils{at, query}, wobeiatdas Wort der Erzählung ist, auf das der Schnitt fällt (das Wort, das benennt, was der neue Clip zeigt) undqueryeine 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 warntvalidate, 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. (queriesist die ältere, zeitgesteuerte Form;beatsbevorzugen.)max_shots: 1behält eine durchgehende Einstellung (selten nötig). stage(illustrierte Erklärung, 90secondslab-Stil): kein Stock-Filmmaterial. Ein dauerhafterbackground(desk,paper,kraft,boardoder ein Bildpfad), auf demelementsaufgebaut werden, die jeweils zu ihremat-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(textwie angezeigt, ≤ 9 Zeichen, z. B. „-11%“, „Rp18rb“;toneup/down färbt es),bar(2–4bars{label, value, text}),stack(name×count, z. B. sich stapelnde Münzen),highlight(gelbe Box um Elementnummertarget).cutout/photo/iconerhalten ein kurzeslabel-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": truebei einem Element löscht zuerst die Bühne); Layout ist automatisch (postl…br nur, um einen Slot zu erzwingen). Funktioniert mithook,explainundlist_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 oderpathzum eigenen Foto des Benutzers bevorzugen, wenn eine Requisite genau richtig sein muss.icon: Lucide-name(prüfen unterrenderer/node_modules/lucide-static/icons/<name>.svg). Gut für den CTA und für abstrakte Ideen ohne gutes Filmmaterial.local:pathzum eigenen Clip des Benutzers. Verwenden, wenn er eigenes Filmmaterial erwähnt.assets/broll/wird ebenfalls automatisch nach Tags durchsucht.solid: Verlaufshintergrund.ai_imagewird derzeit zu einem Stock-Foto (promptwird 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ühnenszenenprojects/<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_text2–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), optionalemphasis/visual. - Eine Idee pro Video. 4–6 Szenen. Lässiges Indonesisch („kamu“, „nggak“, „banget“ sind in Ordnung).
- Wortbudget (gemessen;
speech_ratenicht 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 validateschätzt es. - Kurze Sätze, 1–2 pro Szene. Jedes
on_screen_texteiner 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.calmfür einen traurigen oder ernsten Takt,emphaticfür die Auflösung. tts_overridenur, wenn die TTS etwas falsch ausspricht (z. B. „Follow“ → „Folo“). Allgemeine Korrekturen in denlexicon-Abschnitt vonklip.yaml(testen mituv run klip say "…").- Gesundheit / Finanzen / Sicherheit: nur allgemeine Informationen, keine individuelle Beratung, Quellen in
facts[]. - Mit einer
cta-Szene enden und ihrencta_typewä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 alson_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?“.savefü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“).followfü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 bereitssaveist, um doppeltes Fragen zu vermeiden). post.caption: ein Satz plus ein Emoji.post.hashtags: 3–5, einschließlich#edukasi.cover(optional; dascover.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), oderlines(2–3 explizite Zeilen, die letzte ist das Stichwort), plussubtitle(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 → dason_screen_textdes Hooks (seine betonte Endung wird zum Stichwort) ohne Untertitel; einen schreiben, wenn der Hook-Text allein kein guter Titel ist.