Communitygithub.com

gustavopascaner/motion

Erstelle ein ~1-minütiges Motion-Graphics-Video aus einem Skript (ohne Kamerabild) – animierte Szenen mit Markendesign, KI-Sprecherin/-Sprecher (argentinisch), dynamischen Untertiteln, Hintergrundmusik und Soundeffekten. Ausgabe: MP4 + SRT.

Was ist motion?

Dieses Skill wandelt ein reines Textskript (als eingegebener Text oder .txt/.md/.docx-Datei) in ein vollständig animiertes Motion-Graphics-Video um – ohne jegliches Kameramaterial. Der gesamte Inhalt wird als Vollbild-Animation dargestellt, angereichert mit einer KI-generierten Sprecherstimme (standardmäßig argentinische Spanisch-Stimmen von edge-tts, optional ElevenLabs für mehr Realismus). Das Skill unterstützt verschiedene Videoformate (9:16, 1:1, 4:5, 16:9), passt Markenfarben, Schriftarten und Logos an und wählt automatisch passende Hintergrundmusik von Envato (oder eine eigene Datei) sowie dezente Soundeffekte aus. Es erstellt dynamische Untertitel im SRT-Format und exportiert das fertige Video als MP4 (H.264 + AAC, normalisiert auf −14 LUFS). Zusätzlich wird ein bearbeitbares Premiere-Projekt (XML) generiert, das alle Ebenen (Szenen, Untertitel, Logo, Audiospuren) enthält, sodass Nachbearbeitungen ohne erneute KI-Interaktion möglich sind. Das Skill ist für Claude Code, Codex und andere KI-Agenten optimiert und erfordert vor der Produktion eine interaktive Abfrage von Stimme, Marke, Format und Musik. Bei Markenänderungen wird ein neues Markenprofil angelegt, einschließlich Farbpalette, Schriftarten und Vorschaubild. Der gesamte Arbeitsablauf ist in sechs Schritte unterteilt: Vorbereitung, Skriptaufteilung, Musikauswahl, Storyboard-Erstellung, Rendering und Auslieferung. Eine persistente `.work/-Verzeichnis` ermöglicht schnelle Iterationen (v2, Anpassungen) ohne vollständiges Neu-Rendering.

Funktioniert mit✓Claude Code✓Codex CLI~Cursor
npx skills add gustavopascaner/motion

In Ihrer bevorzugten KI fragen

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

Dokumentation

/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.

  1. 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 es listet alle auf: es-UY, es-MX, es-ES, es-CL, es-CO…). Wenn ELEVENLABS_API_KEY vorhanden ist und mehr Realismus gewünscht wird, ElevenLabs anbieten (tts.py voices eleven argentine).
  2. Marke — eine der gespeicherten (nach Namen anzeigen) oder Neue Marke.
  3. Format — Hochformat 9:16 (Reels/TikTok/Shorts, Standard) · Quadrat 1:1 · 4:5 (Feed) · Querformat 16:9 (YouTube).
  4. 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 fonts listet 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.json erstellen, indem brands/editorial/brand.json kopiert wird (bei jeder Schriftart nur family, weight und für Titel upper/stretch/tracking/leading; für Akzente italic), logo mit 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

  • NAME in 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. text bleibt 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 → rate erhö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).
  • 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. offset setzen (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 in config.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 nur mix.py erneut 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') oder w('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') (oder w('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, kinetic oder starker title auf accent-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 kinetic hintereinander; 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

  1. node $SK/scripts/render.js "<work>" --plan → Szenen mit Zeitangaben, SFX und Regie-Hinweisen. Alle ⚠️ korrigieren und wiederholen.
  2. 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).
  3. Finales Rendern (im Hintergrund, ~1 min pro Minute Video): node $SK/scripts/render.js "<work>" → <work>/video.mp4.
  4. $PY $SK/scripts/mix.py "<work>" → <NAME>.mp4 + <NAME>.srt in out_dir.
  5. Projekt für Premiere (standardmäßig immer; nur überspringen, wenn config.premiere false ist): 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.
  6. 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.md in out_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 .srt als 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 (mit envato.py report und 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.html Frame 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 eigenes assets/sfx mit dem gleichen catalog.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>"} + Variable ELEVENLABS_API_KEY.
  • Kein rm -rf mit relativen Glob-Mustern verwenden.

Verwandte Skills