Shorts Video Studio
Produziert ein 30-60 s, 1080x1920 MP4 + SRT + Skript. Alles ist prozedural (Python + OpenCV + PIL + ffmpeg), gesteuert von einer cue-basierten Animations-Engine, sodass Bilder genau auf das gesprochene Wort treffen.
Dateien in diesem Skill
scripts/shorts_engine_template.py– funktionierende Referenz-Engine (9 Szenen, 9 Hintergründe, 8 Übergänge, Audio, Sprach-Synchronisation). Kopieren und bearbeiten; nicht von Grund auf neu schreiben.scripts/tts_elevenlabs.py– Sprachausgabe über die REST-API generieren (benötigtELEVENLABS_API_KEY).--checkund--list-voiceszuerst ausführen.scripts/review_frames.py– Kontaktbogen + QA-Nachweise: Dauer, Codec, Auflösung, integrierte LUFS, Lautstärkebereich, True Peak. Beendet sich mit einem Fehlercode bei Misserfolg.scripts/setup.sh– Erstellt.venv, installiert Abhängigkeiten, prüft ffmpeg + Schriftarten. Danachsource .venv/bin/activateausführen.assets/fonts/– 15 OFL-1.1-Schriftartdateien / 12 Familien + Noto Color Emoji (echte Icons). Lizenzen enthalten, indiziert inassets/fonts/LICENSES.md.references/design-bible.md– Paletten, Schriftarten, Icon-Vokabular, Hintergründe, Übergänge, Effekte, Layout-Raster. Vor dem Entwerfen der Szenen lesen.references/script-and-voice.md– Skript-Formel, Hinglish-Regeln, Faktenprüf-Regeln, Stimme + Ausrichtungs-Details. Vor dem Schreiben des Skripts lesen.
Pipeline (Schritte der Reihe nach ausführen)
- Recherche – Wenn das Thema News/Trend ist, 3+ Quellen im Web suchen, Fakten mit Daten und Zahlen sammeln ("Stand "). Nie Zahlen erfinden. Nicht überprüfbare Behauptungen markieren und die Formulierung abschwächen ("report ke mutabik").
- Skript – 120-140 Wörter für ~45-50 s, Hook in den ersten 2,5 s, 7-9 kurze Beats, CTA am Ende. Siehe
script-and-voice.md. Alsscript.txtspeichern (ein Absatz pro Szene). - Szenenplan – eine Szene pro Absatz. Für jede Szene festlegen: Hintergrundstil, Palette, 2 Schriftarten, Icons (Emoji), Helden-Animation, Cue-Wörter, Übergang zur nächsten. Die VARIETÄTSREGELN unten anwenden. Den Plan in
plan.mdschreiben. - Stimme – EINEN Sprach- Take des gesamten Skripts generieren (
tts_elevenlabs.pyoder das ElevenLabs MCP). Alsvoice.mp3speichern. Wenn Audio nicht heruntergeladen werden kann (Sandbox), den Benutzer bitten, die Datei hochzuladen; in der Zwischenzeit mit geschätzter Zeitangabe bauen. - Bauen – Die Vorlage nach
video.pykopieren, SZENEN-Text ersetzen,bgN- /dN-Funktionen schreiben,HITundTRANSsetzen. Cue-NachschlagefunktionC(szenen_index, "gesprocheneswort", vorkommen, standard_sekunden)für jeden Animationsstart verwenden. - TEST-Rendering –
TEST=1 python video.pyschreibt PNGs (Endzustand, Zwischenzustand und ein Frame pro Übergang).review_frames.pyausführen / ansehen. Alles beheben, was die QA-Prüfung beanstandet. - Finales Rendering –
VOICE=voice.mp3 python video.py. Im Hintergrund ausführen (setsid nohup ... &) und das Log abfragen; Vordergrund-Aufrufe können durch Tool-Timeouts abgebrochen werden. ~1,5-3 min pro 50 s auf einer CPU. Der Mix wird automatisch aufLUFS(-16) lautstärkenormalisiert. - QA-Prüfung (unten) auf dem finalen mp4, dann
video.mp4,captions.srt,script.txt,plan.md,qa_report.mdausliefern.
VARIETÄTSREGELN (das macht es menschlich gemacht, nicht KI-gemacht)
Ein Verstoß gegen eine dieser Regeln ist ein FEHLER in der QA-Prüfung.
- Jede Szene hat ihre eigene Hintergrundtechnik und Palette (Strahlen, Synthwave-Gitter, Halbton-Sonnenburst, Code-Regen, Farbverlauf + Blobs, Blaupausen-Gitter, Warnstreifen, Radar-Ringe, Konfetti ...). Nie zwei benachbarte gleich. Nie eine globale Farbe.
- >= 7 verschiedene Schriftarten im gesamten Video, gemischte Kategorien: Kondensierte Impact, klobige Display, breite Display, Grotesk, Serif, kursive Serif, Monospace, Pixel, Handschrift. Maximal 2-3 Schriftarten innerhalb einer Szene.
- >= 5 verschiedene Textbehandlungen: Farbverlaufsfüllung, dicke Kontur + harter Offset-Schatten, Glühen, Buchstaben-für-Buchstaben-Hüpfer, Schreibmaschine, Sticker/Pillen-Chips, gedrehter Stempel, Handschrift-Neigung.
- Echte Icons, keine geometrischen Formen: Farb-Emoji (Noto Color Emoji) als Icons, animiert (Aufploppen mit Überschwingen, Dreh-Rein, Schweben, Kreisen, Schwingen). Niemals szenen ohne Text ausliefern. Niemals Markenlogos verwenden (Adobe, GitHub Octocat usw.); generische Icons verwenden.
- 8+ verschiedene Übergänge, einer pro Szenenwechsel: Glitch, Whip-Pan-Weichzeichner, Zoom-Durch, Iris + Ring, Lamellen-Wipe, Blitz + Schütteln, Pixelisieren, Hochschieben. Niemals denselben zweimal.
- Impact-Momente erhalten kombinierte Effekte: Funkenausbruch + Schockwelle + Kameraerschütterung + RGB-Split + Boom-SFX.
- Untertitel: 2-3 Wörter auf einmal, groß und fett mit dicker Kontur, aktuelles Wort in der Szenenfarbe hervorgehoben, kleine Aufplopp-Skalierung bei jedem Wortbrocken.
- Bewegung auf allem: Nichts erscheint ohne Animation, nichts bleibt völlig still (Leerlauf-Wackeln / Schweben / langsamer Zoom 0 -> 3,5 %).
Layout und Sicherheitszonen (720x1280 Arbeitsleinwand, hochskaliert auf 1080x1920)
- Oben 0-130 px: freihalten (Platform-UI). Tag-Chip nur bei y~62.
- Inhaltszone y 150-830. Untertitel-Zone Mitte y = 950 (H-330). Untere 250 px: freihalten (Platform-UI).
- Breitenbudget 640 px.
TXF(text, größe, schriftart, maxw)für jede Zeile verwenden, die überlaufen könnte. Geschätzte Breite = Zeichen x 0,55-0,75 x Größe je nach Schriftart (breite Display-Schriften ~0,75). - Zähler: feste Schriftgröße, beim Zählen nie automatisch verkleinern (Zittern).
Stimme + Synchronisation (Zusammenfassung; Details in den Referenzen)
- Ein Take, dann ausrichten:
apply_voice_peakserkennt Silben-Energiespitzen und DP-matched sie mit den Silben des Skripts (stabil innerhalb von ~0,2 s).ALIGN=pausesist der Fallback für langsame Stimmen mit klaren Pausen. - Cues verwenden das erste Wort, dessen kleingeschriebener, zeichensetzungsbereinigter Text mit dem Token beginnt (Ziffern: exakte Übereinstimmung). Bei wiederholten Wörtern
occurrenceverwenden. - Szenenstart = erstes Wort der Szene - 0,45 s. Gesamtdauer folgt der Stimme (+1,2 s Nachlauf).
- Musik wird synthetisiert (Pad + Kick + Hi-Hat + Bass + Arp) und unter der Stimme um ~55 % geduckt; die Stimme erhält Hochpass + Kompression + Loudnorm (-15 LUFS). Whoosh bei jedem Übergang, Boom bei Impacts, Tipp-Geräusche, Ding bei Zählern, Plopp beim CTA.
QA-Prüfung (ein Prüfer/QA-Agent MUSS ALLE bestehen, bevor ausgeliefert wird)
python scripts/review_frames.py out/video.mp4 out/contact.png 12MUSS PASS ausgeben (andernfalls mit Fehler beenden). Lautstärke und Spitzenwerte stammen daraus, nicht ausvolumedetect.- Dauer 30-60 s, 1080x1920, h264+aac, integrierte Lautstärke etwa -18 bis -13 LUFS, True Peak < -1 dBTP (kein Clipping).
- Kontaktbogen von >= 9 Frames + jedem Übergangsbild angesehen: kein Text abgeschnitten/überlaufend, keine überlappenden Elemente, nichts in den oberen 130 px oder unteren 250 px außer Tag/Untertiteln, Untertitel auf jedem Hintergrund lesbar.
- Varietätsregeln erfüllt (die tatsächlich verwendeten Schriftarten, Paletten, Hintergründe und Übergänge in
plan.mdauflisten). - Fakten: Jede Zahl/jedes Datum/jeder Name im Skript auf eine in
plan.mdnotierte Quelle zurückführbar; Behauptungen abgeschwächt, wo nicht verifiziert; keine Formulierungen wie "copy"/"stole" ohne Quellenangabe; Alpha-/Einschränkungen bei Relevanz genannt. - Sync-Stichprobe: 5 Cues auswählen (Hook-Wort, eine Zahl, ein Name, ein Übergang, CTA) und bestätigen, dass das Bild innerhalb von 0,25 s des gesprochenen Wortes beginnt (SRT- /
SW-Zeiten mit Frame-Zeitstempeln vergleichen). Wenn eine Prüfung fehlschlägt: beheben, neu rendern, die Prüfung erneut ausführen. Verbleibende bekannte Probleme ehrlich melden.
Bereits aufgetretene Fallstricke (vermeiden)
pip installin das systemweite Python schlägt auf modernem Debian/Ubuntu fehl (externally-managed-environment, PEP 668).scripts/setup.sh(erstellt.venv) undsource .venv/bin/activateverwenden; nicht zu--break-system-packagesgreifen.- Der Vergleich von
ffmpeg volumedetectsmean_volume(ungewichteter dBFS) mit einem LUFS-Zielwert ist sinnlos und hat frühere Builds ihre eigene Prüfung nicht bestehen lassen. Immer mitebur128messen (review_frames.pymacht das bereits). Image.fromarrayauf einem PIL-Bild oder auf einem nicht zusammenhängenden Ausschnitt ->TypeError: expected string or buffer. Sprites als zusammenhängende numpy-Arrays behalten;rcard()gibt ein PIL-Bild zurück, kein Array.- Leere Array-Slices in
cv2.add-> Assertion-Fehler; vor dem Aufteilen von Bändernb > aprüfen. - Ohne
setsid nohupgestartete Hintergrundprozesse sterben, wenn der Tool-Aufruf zurückkehrt. - In der Sandbox generierte Audiodateien (MCP) können von der Sandbox nicht heruntergeladen werden: Benutzer bitten, die mp3/wav hochzuladen.
- Pausenbasierte Synchronisation versagt bei engen KI-Stimmen (nur 4 Pausen bei -35 dB gefunden); spitzenbasierte Ausrichtung ist daher der Standard.
- Überlappende Cue-Fenster: Wenn zwei Elemente ein gesprochenes Wort teilen, das zweite um 0,2-0,4 s versetzen.
- Emoji mit Variantenselektoren (z.B. Schild, Warnung) rendern einwandfrei mit
embedded_color=True; Größenänderung mitINTER_AREAnach unten /INTER_CUBICnach oben. - Eine fehlende Schriftart fällt lautlos auf DejaVu/Liberation mit einer
[warn]-Zeile zurück – das Render-Log auf[warn]prüfen, bevor das Layout beschuldigt wird.