Communitygithub.com

video-lite

Erstelle kurze, vertonte Videos mit echten Bewegungsgrafiken (animierte Titel, kinetischer Text, Symbole, heilige Geometrie, Diagramme, Icon-Raster, Übergänge, Partikel) mit Python + pycairo + ffmpeg + espeak-ng – kein Node, kein Browser, keine GPU. Entwickelt für alte 32-Bit-Maschinen (i686, 2 GB RAM). Verwende es für Erklärvideos, Geschichten, Listen, Werbung oder Demo-MP4s mit Sprachausgabe, Musikbett und Soundeffekten.

Was ist video-lite?

Video Lite ist ein reines Python-Tool zur Erstellung animierter, vertonter Videos ohne moderne Hardwareabhängigkeiten. Es generiert MP4-Dateien aus einem Storyboard-JSON, wobei jedes Bild mit Cairo als Vektorgrafik gerendert wird (Texte, Symbole, Geometrie, Glüheffekte, Partikel, Kamerabewegungen, Übergänge). Die Sprachausgabe erfolgt über espeak-ng/MBROLA (Unterstützung für pt-BR und Englisch) mit einem automatisch generierten Musikbett, das unter der Stimme geduckt wird, sowie Soundeffekten (Whoosh/Pop) bei Schnitten und Einblendungen. Es ist speziell für alte 32-Bit-PCs (Pentium M, 2 GB RAM) optimiert und benötigt kein Node.js, Chromium, GPU, maschinelles Lernen oder Netzwerk.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/jazzautomations/video-lite/tree/HEAD

In Ihrer bevorzugten KI fragen

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

Dokumentation

Video Lite v2

Eine fertige MP4-Datei aus einem kleinen Storyboard-JSON. Jeder Frame besteht aus Vektorgrafiken, die mit Cairo gezeichnet werden (antialiasierte Texte, Symbole, Geometrie, Glüheffekte, Partikel, Kamerabewegungen, Szenenübergänge) und mit ffmpeg kodiert werden; die Sprachausgabe erfolgt über espeak-ng/MBROLA (pt-BR und Englisch) über einem sanften, prozeduralen Musikbett, das unter der Stimme geduckt wird, mit Whoosh-/Pop-Soundeffekten bei Schnitten und Einblendungen. Läuft auf einem alten Pentium M: ~90 s 720p-Video in etwa 7–8 min (Entwurf 480p: ~4 min). Kein Node, Chromium, GPU, Modelle oder Netzwerk.

<skill-dir> unten ist der Ordner dieser SKILL.md. Führe jeden Befehl aus dem Projektordner des Benutzers aus; Ausgaben gehen dorthin.

Goldener Pfad – genau so, in dieser Reihenfolge

# 1. Überprüfe die Maschine EINMAL (misst auch ihre Geschwindigkeit, ~1 Min). Sagt, was fehlt und wie es zu beheben ist.
python3 <skill-dir>/scripts/doctor.py
#    Keine Stimme? Auf Debian/Ubuntu/antiX installiert dies espeak-ng + MBROLA pt-BR in ~/.local, ohne root:
bash <skill-dir>/scripts/setup_voice.sh

# 2. Beginne mit einem FORMAT (dem Auftrag) und einem THEMA (der Stimmung):
python3 <skill-dir>/scripts/compose.py formats   # explainer-motion / story / listicle / explainer / promo / demo
python3 <skill-dir>/scripts/compose.py themes    # mystic, neon, terminal-green, sunset, ocean, paper, mono
python3 <skill-dir>/scripts/compose.py new --format explainer-motion --theme neon --out storyboard.json
#    Bearbeite dann storyboard.json: Jeder "TROQUE:"-Platzhalter muss durch echten Inhalt für DIESES
#    Video ersetzt werden (Rendering verweigert Überreste). Du kannst Szenen frei hinzufügen, entfernen oder neu anordnen.
#    Sprechgeschwindigkeit: etwa 14 Zeichen pro Sekunde. Eine Idee pro Szene, 1–2 Sätze.

# 3. Rendern. Blockiert, bis die MP4-Datei geschrieben ist. --draft = 480p, schneller: zuerst auf alten Maschinen verwenden.
python3 <skill-dir>/scripts/render.py storyboard.json --out video.mp4 --draft
python3 <skill-dir>/scripts/render.py storyboard.json --out video.mp4
#    Optional: Einen Rahmen vor einem langen Rendervorgang ansehen (schreibt video.png):
python3 <skill-dir>/scripts/render.py storyboard.json --out video.mp4 --still 12.5

# 4. Überprüfe die echte Datei (Dauer, Video+Audio-Streams) und schau dir das Kontaktblatt-PNG an.
python3 <skill-dir>/scripts/verify.py video.mp4 --require-audio

Schreibe NICHT von Hand ffmpeg-Pipelines oder zeichne Frames selbst: render.py kümmert sich um Layout, Textanpassung, Animation, Timing und Synchronisation. Wenn ein Schritt fehlschlägt, lies seine Nachricht – sie sagt, was geändert werden muss. Langsame Maschine und in Eile? render.py ... --fast (weniger Partikel, keine Kamerabewegung).

Storyboard

{
  "theme": "mystic",
  "voice": "mb-br3",
  "scenes": [
    {"kind": "title", "title": "O Caibalion", "subtitle": "os sete princípios herméticos", "symbol": "☿",
     "narration": "Conheça o Caibalion e seus sete princípios."},
    {"kind": "kinetic", "text": "O Todo é *Mente*",
     "narration": "O primeiro princípio diz: o Todo é mente."},
    {"kind": "bullets", "title": "Na prática", "bullets": ["observe seus pensamentos", "mude o foco", "repita"],
     "narration": ["Observe seus pensamentos.", "Mude o foco.", "E repita todo dia."]},
    {"kind": "wheel", "title": "Os sete princípios", "center": "☿",
     "nodes": ["Mentalismo", "Correspondência", "Vibração", "Polaridade", "Ritmo", "Causa e Efeito", "Gênero"],
     "narration": "Mentalismo, correspondência, vibração, polaridade, ritmo, causa e efeito e gênero."},
    {"kind": "cta", "title": "Leia o livro", "subtitle": "domínio público desde 1908",
     "narration": "Leia e tire suas conclusões."}
  ]
}

Oberste Ebene: theme, voice (pt-br, en-us, es… oder MBROLA mb-br3 / mb-br1 / mb-br4, weit weniger roboterhaft; bei pt-br wird mb-br3 verwendet, wenn installiert; "none" = stumm). Die Sprechgeschwindigkeit wird von render.py festgelegt (~14 Zeichen/s); "speed": 0.9–1.15 passt sie an (rate von v1 wird ignoriert). Optional: transition für jede Szene, "music": false (kein sanftes Akkordbett unter der Stimme), "sfx": false (keine Whoosh-/Pop-/Riser-Effekte), "captions": true (zeige die Erzählung als Untertitel; standardmäßig aus – der Bildschirm zeigt die Schlüsselwörter, die Stimme erzählt den Rest).

Jede Szene: kind (unten), narration, optional seconds (Standard: die Erzählung + eine kurze Pause; kann eine Szene nur verlängern), optional transition (fade | slide | zoom | wipe | iris | cut; Standard: die eigene Rotation des Themas), optional camera (auto langsamer Zoom/Schwenk, oder none).

Elemente mit der Stimme synchronisieren: narration kann eine Liste von Sätzen sein. Wenn eine bullets-, wheel-, icons- oder split-Szene N Elemente und die Erzählung N Sätze (oder N+1: eine Einleitung zuerst) hat, erscheint Element k genau dann, wenn Satz k beginnt:

{"kind": "bullets", "title": "Por quê", "bullets": ["roda em PC velho", "modelos grátis", "testa tudo"],
 "narration": ["Três motivos.", "Roda em computador velho.", "Usa modelos grátis.", "E testa antes de dizer pronto."]}

Setze keine Links, E-Mails oder Dateipfade in narration (Rendering verweigert): zeige sie auf dem Bildschirm an (cta-Untertitel). Halte jeden Satz unter ~110 Zeichen.

Szenenarten (compose.py kinds gibt diese Liste aus)

ArtWas du siehstFelder
titleGroßer Titel Wort für Wort, gezeichnete Unterstreichung, optionales Symbol obentitle, subtitle, symbol (opt.)
bulletsTitel + Elemente nacheinander, jedes mit einem Icontitle, bullets: ["text", {"text": "…", "icon": "fa-rocket"}]
terminalTerminalfenster, das tipptlines: ["$ Befehl", "Ausgabe"]
quoteGroßes Anführungszeichen, Wörter blenden ein, Autor gleitet hereintitle (das Zitat), subtitle (Autor)
ctaAbschließender Aufruf: Titel springt, Untertitel in einem leuchtenden Buttontitle, subtitle, symbol (opt.)
symbolEIN riesiges Symbol, Strich für Strich gezeichnet, dann gefüllt + Glühen, Halo-Ringsymbol, title, subtitle, spin (true/false)
geometryHeilige Geometrie, schrittweise gezeichnet, dann glühendshape (ein Name oder eine Liste), title, subtitle, labels (nur bei arrows)
wheelN Knoten (2–12) auf einem Kreis, einer nach dem anderen mit Linien zur Mitte enthüllt; der aktuelle leuchtettitle, nodes: ["a", {"label": "b", "icon": "fa-cog"}], center (Wort oder Symbol), active (1..N: diesen Knoten hervorheben)
iconsRaster mit 1–8 Icons und Beschriftungen, die einpoppentitle, items: [{"icon": "fa-cogs", "label": "Motor"}]
kineticGroße Wörter erscheinen synchron zur Stimme; *Wort* = Akzentfarbe + Glühentext
splitTextspalte + Illustration auf der anderen Seitetitle, text oder bullets, und symbol ODER shape, side (right/left: wo die Grafik platziert wird)

shape-Namen: circle, triangle, triangle-down, square, hexagon, hexagram, pentagram, flower (Lebensblume), seed (Lebenssamen), vesica, spiral (golden), eye (Auge im Dreieck), ouroboros, wave (Vibration), pendulum (Rhythmus), arrows (Ursache → Wirkung; verwende "labels": ["Ursache", "Wirkung", "Ursache"]). Kombiniere: "shape": ["circle", "hexagram"].

symbol / icon / center akzeptieren (compose.py symbols listet alle Namen auf):

  • Ein Zeichen: "☿", "☤", "☯", "✡", "⚖", "∞", "🜂" (Alchemie), "♀", "☉", "☽"…
  • Einen Font-Awesome-4-Namen: "fa-cogs", "fa-book", "fa-rocket", "fa-lightbulb-o", "fa-globe", "fa-terminal"…
  • Ein benanntes Symbol: "mercurio", "caduceu", "yin-yang", "balanca", "fogo", "agua", "olho"…
  • Ein Emoji: "🔥", "🚀", "💡" (Farbe; wird mit einem Pop angezeigt, nicht Strich für Strich gezeichnet).

Ein vollständiges ~90-s-Beispiel (Hermetismus, Thema mystic, jede Illustrationsart): <skill-dir>/examples/caibalion.json.

Guter Geschmack, schnell

  • Variiere die Arten: niemals 3 Szenen derselben Art hintereinander; wechsle zwischen textlastigen (bullets, split) und visuellen (symbol, geometry, kinetic, wheel) ab.
  • Titel kurz (≤ 5 Wörter), Untertitel ≤ 10 Wörter, Aufzählungspunkte ≤ 6 Wörter, maximal 5 Aufzählungspunkte.
  • Eine Liste von N Dingen: eine wheel-Übersicht, dann eine Szene pro Element (symbol/geometry) oder erneut wheel mit "active": k.
  • Themen: mystic (Indigo/Gold, Serif, Sterne), neon (Magenta/Cyan, Synth-Raster), terminal-green (Code), sunset, ocean, paper (hell, Serif), mono.

Tests

python3 <skill-dir>/scripts/selftest.py rendert jede Art für einen Moment im Entwurfsmodus und überprüft die MP4 mit ffprobe (Rückgabewert 0 = ok). --voice testet auch espeak + Untertitel.

Verwandte Skills