/motion — Skript → Motion-Graphics-Video mit Voice-Over
Eingabe: ein Skript (eingefügter Text oder .txt/.md/.docx-Datei). Kein Kamerabild: alles sind animierte Vollbild-Szenen.
Ausgabe: <Ordner>/<NAME>_MOTION/ mit <NAME>.mp4 (H.264 + AAC, −14 LUFS), <NAME>.srt, <NAME>_premiere.xml (bearbeitbares Projekt), Assets/{Szenen,Untertitel,Overlay,Stimme,Musik,SFX}, LEEME.md und .work/ (persistent, ermöglicht v2).
Mit dem Benutzer auf Spanisch (Rioplatense, mit Voseo) sprechen. Fortschritt zwischen langen Schritten mitteilen.
Pfade: SK = Ordner dieses Skills (Claude Code: ~/.claude/skills/motion; Codex: ~/.codex/skills/motion).
PY = Python dieses Skills: $SK/.venv/bin/python -I (Windows: $SK\.venv\Scripts\python.exe -I). Für alle .py-Skripte verwenden.
Szenenkatalog: $SK/reference/szenen.md · Vollständiges Beispiel: $SK/reference/beispiel/ (script.json + story.js).
Wenn doctor.py etwas mit ✗ markiert: bash $SK/scripts/install.sh (Windows: powershell -ExecutionPolicy Bypass -File $SK\scripts\install.ps1).
0 · Erste Fragen (IMMER vor der Produktion)
Zuerst das Skript lesen und $PY $SK/scripts/brand.py list (gespeicherte Marken) ausführen. Danach alles in einer einzigen Runde fragen (in Claude Code mit dem AskUserQuestion-Tool; in Codex oder anderen, eine einzelne nummerierte Nachricht). Nicht fragen, was der Benutzer bereits gesagt hat.
- Stimme — Frau oder Mann. Standardmäßig argentinisch (edge-tts:
es-AR-ElenaNeural/es-AR-TomasNeural). Wenn der Benutzer eine andere Aussprache wünscht, die Stimme dieses Landes verwenden (tts.py voices eslistet alle auf: es-UY, es-MX, es-ES, es-CL, es-CO…). WennELEVENLABS_API_KEYvorhanden ist und mehr Realismus gewünscht wird, ElevenLabs anbieten (tts.py voices eleven argentine). - Marke — eine der gespeicherten (nach Namen anzeigen) oder Neue Marke.
- Format — Hochformat 9:16 (Reels/TikTok/Shorts, Standard) · Quadrat 1:1 · 4:5 (Feed) · Querformat 16:9 (YouTube).
- Musik — Energisch (Upbeat 110–140 BPM) · Warm/inspirierend (Medium 90–110) · Corporate/ruhig · Ich habe eigene Musik (nach Pfad fragen).
Bei neuer Marke, zweite Runde (ebenfalls alles zusammen):
- Markenname und Logo (Pfad zu PNG/SVG, oder „kein Logo“) und Social-Media-Benutzername (z. B.
@consultorio). Wenn Logo vorhanden:$PY $SK/scripts/brand.py colors <logo>und darauf basierende Palette vorschlagen. - Farben — Optionen: Aus Logo extrahieren · Schwarz + Orange (editorial) · Tiefblau + Hellblau (Gesundheit/Vertrauen) · Grün + Creme (Wellness); oder eigene Hex-Werte. Benötigt werden 4:
dark(dunkler Hintergrund),light(heller Hintergrund),accent(primäre Hervorhebung),accent2(sekundär, optional). - Schriftarten —
brand.py fontslistet Kombinationen auf: Editorial kondensiert · Modern geometrisch · Impact · Elegant (oder jede beliebige Google-Fonts-Familie nach Namen). - Stil — Untertitel ja/nein (Standard ja), Hintergrunddeko: Körnung + Raster + Farbflecken (Standard) · Ringe · Punkte · sauber.
$SK/brands/<slug>/brand.jsonerstellen, indembrands/editorial/brand.jsonkopiert wird (bei jeder Schriftart nurfamily,weightund für Titelupper/stretch/tracking/leading; für Akzenteitalic),logomit absolutem Pfad eintragen und$PY $SK/scripts/brand.py setup <slug>ausführen (lädt die Schriftarten herunter, kopiert das Logo, prüft Kontrast: ⚠️ korrigieren). Vorschau anzeigen:node $SK/scripts/render.js --brand-preview=<slug> --out=<work>/marke.jpg --format=<format>→ Bild betrachten und dem Benutzer zeigen; vor dem Fortfahren bestätigen lassen (schnell anpassbar). Die Marke bleibt für das nächste Mal gespeichert.
1 · Vorbereitung
NAMEin GROSSBUCHSTABEN_MIT_BINDESTRICHEN aus dem Thema. Ordner: der Ordner der Skriptdatei oder das Arbeitsverzeichnis, falls es eingefügt wurde.work=<Ordner>/<NAME>_MOTION/.work.$PY $SK/scripts/timing.py start "<work>"(Stoppuhr) und$PY $SK/scripts/doctor.py.config.json:
{ "name": "NAME", "out_dir": "/abs/<Ordner>/NAME_MOTION", "edit_dir": "/abs/<Ordner>/NAME_MOTION",
"format": "9:16", "fps": 30, "brand": "<slug>", "tail": 1.6, "keywords": ["wort","schlüssel"], "sfx_max": 6,
"music": {} }
keywords = 3–6 Wörter aus dem Skript, die in den Untertiteln hervorgehoben werden. Optional: "captions": false, "logo_corner": false.
2 · Skript → Beats → Stimme
Das Skript gehört dem Benutzer: den Inhalt nicht umschreiben. Nur aufteilen und die Aussprache anpassen.
- In Beats aufteilen (1 Satz oder Idee, jeweils 2–6 s; 10–18 Beats für 1 Minute). Jeder Beat entspricht in der Regel einer Szene.
say(optional) = wie etwas ausgesprochen wird, wenn der geschriebene Text die Stimme verwirrt: große Zahlen („70 %“ → „siebzig Prozent“), Akronyme („OMS“ → „o eme ese“), Symbole, Jahreszahlen, Abkürzungen.textbleibt wie geschrieben.pause= Stille nach dem Beat (Standard 0,38 s, wenn mit Punkt/Frage endet, 0,18 s, wenn nicht. Mehr Pause (0,6) vor einem Höhepunkt oder CTA.<work>/script.json:{"voice":{"engine":"edge","id":"es-AR-ElenaNeural","rate":"+5%"},"lead":0.35,"target":60,"beats":[{"id":"b01","text":"…"},…]}$PY $SK/scripts/tts.py "<work>"→voice.wav+words.json(Zeit jedes Wortes) und die Dauer. Zieldauer ≈ 60 s:- über 66 s →
rateerhöhen (maximal+15%); wenn es immer noch zu lang ist, dem Benutzer konkrete Kürzungen vorschlagen und auf Antwort warten. - kürzer → in Ordnung, das Skript nicht verlängern (rate kann auf bis zu
-5%gesenkt werden, wenn es gehetzt klingt).
- über 66 s →
- Den Rhythmus mental anhören: Wenn ein Beat sehr lang wird (> 7 s), teilen. Nur die geänderten Beats werden neu generiert (Cache).
3 · Musik
- Wenn der Benutzer Musik bereitgestellt hat:
"music": {"path": "/abs/track.mp3", "offset": 0}. - Wenn nicht, Envato (immer instrumental):
$PY $SK/scripts/envato.py search "<work>" music "<Stil auf Englisch>" --mood <Stimmung> --tempo "<Tempo>" [--genre <Genre>]. Nach Klang und Energieprofil auswählen (gleichmäßig, ohne lange Abfälle in der ersten Minute) und$PY $SK/scripts/envato.py use "<work>" music <Suche>#<n>ausführen.offsetsetzen (Sekunde, in der der energiegeladene Teil beginnt; das Profil ▁▂▃█ betrachten). - Automatische Pegel in mix.py: lauter vor der Stimme (
intro−8 dB), leiser unter der Stimme (bed−21 dB), lauter im Abspann (outro−10 dB) und Fade-Out. Einstellbar inconfig.music. - Die Envato-Vorschau hat ein Wasserzeichen: Bei der Auslieferung darauf hinweisen, dass es lizenziert werden muss. Mit einem Browser mit Envato-Sitzung: einmalige Bestätigung einholen, mit dem Videotitel lizenzieren und als WAV herunterladen; andernfalls den Link an den Benutzer weitergeben. Dann
$PY $SK/scripts/envato.py collect "<work>"ausführen und nurmix.pyerneut ausführen (kein Neu-Rendering erforderlich).
4 · Storyboard → <work>/story.js
Basierend auf reference/szenen.md und reference/beispiel/story.js. Ein Aufruf S(typ, start, params) pro Szene, in Reihenfolge:
start: Beat-ID ('b03') oderw('wort')(beginnt bei diesem Wort). Die Szene dauert bis die nächste beginnt; die erste beginnt bei 0.- Innerhalb von params werden alle internen Zeitpunkte mit der Stimme synchronisiert mit
w('wort')(oderw('wort', 1)für das 2. Vorkommen): Listenelemente, Zählungen, Siegel, Nachrichten, CTA-Button. - Für alle gemeinsam:
bg('dark'|'light'|'accent'|'accent2'; wenn nicht angegeben, wechselt es),tr('wipe'|'slide'|'circle'|'push'|'zoom'|'cut'; wenn nicht angegeben, rotiert),cap:false(keine Untertitel),sfx(null= kein Sound ·'pop'·[['ding',1.2]]). - Text-Helfer:
H('text')= Hervorhebung in Farbbox ·A('text')= Text in Akzentfarbe.
Regieanweisungen (obligatorisch):
- Hook in den ersten 2 s:
question,bigword,kineticoder starkertitleaufaccent-Hintergrund. Erster Szenenwechsel vor 3–4 s. - Rhythmus: eine Szene alle 3–5 s (12–18 Szenen pro Minute). Nichts länger als ~5 s ruhig: Wenn die Szene lang ist, sich nach und nach aufbauen lassen (synchronisierte Elemente).
- Abwechslung: Szenentyp nicht hintereinander wiederholen; maximal 2
kinetichintereinander; Text-Szenen mit grafischen abwechseln (stat,bars,donut,icons,steps,compare,phone). - Zeigen, nicht wiederholen: Der Text auf dem Bildschirm sind Schlüsselwörter, Daten und Struktur, nicht der ganze Satz (außer
kinetic/quote, die den Satz zeigen, während er gesprochen wird, und die Untertitel ausblenden). - Daten →
stat/bars/donut. Aufzählungen →list/steps/icons. Kontraste (Mythos/Realität, vorher/nachher) →compare. Fragen →question. Gespräche/Nachrichten →phone. Höhepunkte →bigword. Benutzerfotos →image. - Abschluss mit
cta(folgen / ein Wort kommentieren / speichern / Link), synchronisiert mit dem, was das Skript sagt. - Kurze Texte: Titel mit 1–3 Wörtern pro Zeile, Elemente mit ≤ 6 Wörtern.
5 · Plan, Test und Rendern
node $SK/scripts/render.js "<work>" --plan→ Szenen mit Zeitangaben, SFX und Regie-Hinweisen. Alle ⚠️ korrigieren und wiederholen.node $SK/scripts/render.js "<work>" --test --at=0.3,mitte,ende→<work>/sheet.jpg(3 Frames pro Szene: beginnend, in der Mitte, fertig). Das Blatt betrachten und korrigieren: Texte, die zu klein skaliert wurden (Hinweis „wurde auf N % verkleinert“), Schnitte, Überlappungen mit den Untertiteln, Farben mit zu geringem Kontrast, leere Szenen in der Mitte (der Inhalt muss schnell erscheinen).- Finales Rendern (im Hintergrund, ~1 min pro Minute Video):
node $SK/scripts/render.js "<work>"→<work>/video.mp4. $PY $SK/scripts/mix.py "<work>"→<NAME>.mp4+<NAME>.srtinout_dir.- Projekt für Premiere (standardmäßig immer; nur überspringen, wenn
config.premierefalseist):node $SK/scripts/render.js "<work>" --premiere(im Hintergrund, ~2–3 min) und$PY $SK/scripts/build_xml.py "<work>". Spuren: V1 Szenen (ein Clip pro Szenen, mit bereits komponiertem Eingangsübergang) · V2 Untertitel mit Alpha · V3 Logo · A1 Stimme (ein Satz pro Clip) · A2 Musik mit Volume-Keyframes · A3+ SFX. Markierungen pro Szene. - 3–4 Frames des finalen MP4 betrachten (
ffmpeg -ss <t> -i <mp4> -frames:v 1 x.jpg) zur Bestätigung.
6 · Auslieferung
$PY $SK/scripts/timing.py report "<work>".LEEME.mdinout_dir: Wie man es in Premiere öffnet (Datei → Importieren →<NAME>_premiere.xml; Ordner nicht verschieben oder umbenennen; Tabelle der Spuren; was dort bearbeitet werden kann — Szenen schneiden/verschieben/löschen, Sätze der Stimme neu timen, Musik und Lautstärken ändern, SFX entfernen, die.srtals native Untertitel verwenden — und was nicht: der Text in jeder Grafik, der geändert wird, indem man Claude darum bittet), verwendete Stimme, Marke, Format, Dauer, Struktur (Tabelle Szene → Text → Zeit), Musik (mitenvato.py reportund ob Lizenz fehlt), SFX, Verarbeitungszeit, wie man Änderungen anfordert.- Kurz antworten: Pfad der MP4 und XML, Dauer, gewählte Stimme und Musik (hinweisen, wenn die Musik eine nicht lizenzierte Vorschau ist), herausragende Szenen, Gesamtzeit.
Versionen (v2, Anpassungen)
.work wiederverwenden: script.json ändern (Stimme/Text: nur die geänderten Beats werden neu generiert) und/oder story.js, out_dir auf <NAME>_MOTION_v2 setzen und ab dem entsprechenden Schritt wiederholen (Musik- oder Lautstärkeänderung → nur mix.py + build_xml.py; visuelle Änderung → Render + Mix + render.js --premiere --only=<Szenen-Nr.> + build_xml.py; Textänderung → tts + alles).
Text einer bereits in Premiere importierten Grafik ändern: story.js bearbeiten und render.js --premiere --only=N ausführen (rendert nur diese Szene mit dem gleichen Dateinamen neu), das MP4 wenn gewünscht, und den Benutzer informieren, dass er in Premiere mit Rechtsklick auf den Clip → Verknüpfte Medien ersetzen/neu verknüpfen (oder das Projekt schließen und wieder öffnen) die Änderung sehen kann. Wenn sich die Szenenlänge ändert, das XML neu generieren und neu importieren. Neue Szenen: zu engine/engine.html hinzufügen gemäß szenen.md.
Technische Hinweise
- Ebenen für Premiere: Szenen in ProRes 422 HQ (ohne Transparenz); Untertitel und Logo in ProRes 4444 mit Alpha. Der Audiopegel in Premiere ist ~2 dB niedriger als der MP4 (der MP4 hat eine endgültige Normalisierung auf −14 LUFS).
- Engine:
engine/engine.htmlFrame für Frame mit Chrome (puppeteer-core) parallel gerendert, H.264 yuv420p. Alle Szenen sind reine Funktionen der Zeit. - Der Inhalt jeder Szene wird automatisch skaliert, um in den sicheren Bereich (je nach Format) zu passen, ohne überzulaufen; wenn er zu klein wird, wird eine Warnung ausgegeben.
- SFX: verwendet die Skill-Bibliothek
edicion, falls installiert (oder eigenesassets/sfxmit dem gleichencatalog.json); wenn keine Sounds vorhanden sind, läuft es ohne weiter. - Stimme: edge-tts nutzt den Microsoft-Edge-Sprachdienst (erfordert Internet, kein Schlüssel). ElevenLabs:
{"engine":"eleven","id":"<voice_id>"}+ VariableELEVENLABS_API_KEY. - Kein
rm -rfmit relativen Glob-Mustern verwenden.