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)
| Art | Was du siehst | Felder |
|---|---|---|
title | Großer Titel Wort für Wort, gezeichnete Unterstreichung, optionales Symbol oben | title, subtitle, symbol (opt.) |
bullets | Titel + Elemente nacheinander, jedes mit einem Icon | title, bullets: ["text", {"text": "…", "icon": "fa-rocket"}] |
terminal | Terminalfenster, das tippt | lines: ["$ Befehl", "Ausgabe"] |
quote | Großes Anführungszeichen, Wörter blenden ein, Autor gleitet herein | title (das Zitat), subtitle (Autor) |
cta | Abschließender Aufruf: Titel springt, Untertitel in einem leuchtenden Button | title, subtitle, symbol (opt.) |
symbol | EIN riesiges Symbol, Strich für Strich gezeichnet, dann gefüllt + Glühen, Halo-Ring | symbol, title, subtitle, spin (true/false) |
geometry | Heilige Geometrie, schrittweise gezeichnet, dann glühend | shape (ein Name oder eine Liste), title, subtitle, labels (nur bei arrows) |
wheel | N Knoten (2–12) auf einem Kreis, einer nach dem anderen mit Linien zur Mitte enthüllt; der aktuelle leuchtet | title, nodes: ["a", {"label": "b", "icon": "fa-cog"}], center (Wort oder Symbol), active (1..N: diesen Knoten hervorheben) |
icons | Raster mit 1–8 Icons und Beschriftungen, die einpoppen | title, items: [{"icon": "fa-cogs", "label": "Motor"}] |
kinetic | Große Wörter erscheinen synchron zur Stimme; *Wort* = Akzentfarbe + Glühen | text |
split | Textspalte + Illustration auf der anderen Seite | title, 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 erneutwheelmit"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.