Communitygithub.com

mohdkhatab/shorts-video-studio

Erstelle professionelle vertikale (9:16) YouTube Shorts / Reels / TikTok Erklär- und Tech-News Videos vollständig in Python (kein Editor nötig) – inklusive recherchiertem Skript (Hinglish/Hindi/Englisch), ElevenLabs Voiceover, Wort-für-Wort-Synchronisation, Multi-Font + Multi-Palette Bewegungsgrafiken, echten Color-Emoji-Icons, 8 verschiedenen Übergängen, kinetischen Untertiteln, synthetisierter Musik + Soundeffekten mit Sprach-Ducking und einer visuellen QA-Prüfung.

Was ist shorts-video-studio?

Dieses Skill produziert 30-60 Sekunden lange, vertikale 1080x1920 MP4-Videos mit Untertiteln (SRT) und Skript. Die gesamte Erstellung erfolgt prozedural in Python unter Verwendung von OpenCV, PIL und ffmpeg. Es wird eine cue-basierte Animations-Engine eingesetzt, die sicherstellt, dass die visuellen Elemente exakt auf das gesprochene Wort abgestimmt sind. Das Skill eignet sich besonders für die Erstellung von Erklärvideos, Tech-News, Reels oder Shorts, die nicht wie KI-generierte oder schablonenhafte Inhalte aussehen sollen. Der gesamte Workflow ist in der SKILL.md-Dokumentation detailliert beschrieben und umfasst Schritte wie Recherche, Skripterstellung, Szenenplanung, Sprachsynthese über die ElevenLabs API, Videokonstruktion mit einem Template, Test-Rendering und eine mehrstufige Qualitätskontrolle. Plattformen wie Claude Code, Cursor und Codex werden unterstützt.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/mohdkhatab/shorts-video-studio/tree/HEAD/skills/shorts-video-studio

In Ihrer bevorzugten KI fragen

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

Dokumentation

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ötigt ELEVENLABS_API_KEY). --check und --list-voices zuerst 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. Danach source .venv/bin/activate ausführen.
  • assets/fonts/ – 15 OFL-1.1-Schriftartdateien / 12 Familien + Noto Color Emoji (echte Icons). Lizenzen enthalten, indiziert in assets/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)

  1. 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").
  2. 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. Als script.txt speichern (ein Absatz pro Szene).
  3. 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.md schreiben.
  4. Stimme – EINEN Sprach- Take des gesamten Skripts generieren (tts_elevenlabs.py oder das ElevenLabs MCP). Als voice.mp3 speichern. Wenn Audio nicht heruntergeladen werden kann (Sandbox), den Benutzer bitten, die Datei hochzuladen; in der Zwischenzeit mit geschätzter Zeitangabe bauen.
  5. Bauen – Die Vorlage nach video.py kopieren, SZENEN-Text ersetzen, bgN- / dN-Funktionen schreiben, HIT und TRANS setzen. Cue-Nachschlagefunktion C(szenen_index, "gesprocheneswort", vorkommen, standard_sekunden) für jeden Animationsstart verwenden.
  6. TEST-Rendering – TEST=1 python video.py schreibt PNGs (Endzustand, Zwischenzustand und ein Frame pro Übergang). review_frames.py ausführen / ansehen. Alles beheben, was die QA-Prüfung beanstandet.
  7. 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 auf LUFS (-16) lautstärkenormalisiert.
  8. QA-Prüfung (unten) auf dem finalen mp4, dann video.mp4, captions.srt, script.txt, plan.md, qa_report.md ausliefern.

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_peaks erkennt Silben-Energiespitzen und DP-matched sie mit den Silben des Skripts (stabil innerhalb von ~0,2 s). ALIGN=pauses ist 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 occurrence verwenden.
  • 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)

  1. python scripts/review_frames.py out/video.mp4 out/contact.png 12 MUSS PASS ausgeben (andernfalls mit Fehler beenden). Lautstärke und Spitzenwerte stammen daraus, nicht aus volumedetect.
  2. Dauer 30-60 s, 1080x1920, h264+aac, integrierte Lautstärke etwa -18 bis -13 LUFS, True Peak < -1 dBTP (kein Clipping).
  3. 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.
  4. Varietätsregeln erfüllt (die tatsächlich verwendeten Schriftarten, Paletten, Hintergründe und Übergänge in plan.md auflisten).
  5. Fakten: Jede Zahl/jedes Datum/jeder Name im Skript auf eine in plan.md notierte Quelle zurückführbar; Behauptungen abgeschwächt, wo nicht verifiziert; keine Formulierungen wie "copy"/"stole" ohne Quellenangabe; Alpha-/Einschränkungen bei Relevanz genannt.
  6. 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 install in das systemweite Python schlägt auf modernem Debian/Ubuntu fehl (externally-managed-environment, PEP 668). scripts/setup.sh (erstellt .venv) und source .venv/bin/activate verwenden; nicht zu --break-system-packages greifen.
  • Der Vergleich von ffmpeg volumedetects mean_volume (ungewichteter dBFS) mit einem LUFS-Zielwert ist sinnlos und hat frühere Builds ihre eigene Prüfung nicht bestehen lassen. Immer mit ebur128 messen (review_frames.py macht das bereits).
  • Image.fromarray auf 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ändern b > a prüfen.
  • Ohne setsid nohup gestartete 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 mit INTER_AREA nach unten / INTER_CUBIC nach 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.

Verwandte Skills