Video durch Code Fähigkeit
Ein ausführbares Toolkit und Produktionsworkflow für Mensch-KI-Teams, die deterministische Videos in Code erstellen. Der gesamte Szenencode verbleibt im Repository oder Projektarbeitsbereich; alle generierten Medien, Audioaufnahmen, Standbilder und Verifikationsbelege werden in einem expliziten externen $PROD-Verzeichnis abgelegt.
Arbeitsablauf: Brief → Audio & Timing → Stil & Prompt → 3 Design-Standbilder → Szenencode → Determinismus- & Textbegrenzungs-Gate → Vollrender → Verifikation & Kontaktbogen → Lieferbeleg
1. Umgebung & Rauchtest
Stelle vor dem Bau eines neuen Films sicher, dass die Starter-Abhängigkeiten installiert sind und der 4-Sekunden-Rauchtest vom Repository-Root aus bestanden wird:
cd starter && npm ci && cd ..
node tests/runtime-contract.mjs
2. Produktionsverzeichnis & Absicht (RUNBOOK.md §1–2)
- Wähle ein absolutes Produktionsverzeichnis außerhalb des Code-Checkouts:
PROD="/absolute/path/to/video-outputs/<project-slug>" mkdir -p "$PROD"/{audio,analysis,stills,renders,checks} - Kopiere
templates/brief.mdnach"$PROD/brief.md"und fülle Zielgruppe, Kernaussage, Seitenverhältnis (1920x1080Querformat oder1080x1920Hochformat), Dauer, Sprach-/Musikquelle und Sicherheitsbereich-Ränder aus.
3. Audio-Identität & Timing (docs/04-music-audio-and-timing.md, docs/05-narration-and-captions.md)
Animiere niemals mit geschätzten Zeitstempeln. Messe zuerst die tatsächliche Audiodatei und zeichne ihren SHA-256-Hash auf:
uv run tools/timing/audio-identity.py "$PROD/audio/source.wav" \
--out "$PROD/analysis/identity.json" --copy-wav "$PROD/analysis/analysis.wav"
- Gesprochene Erzählung:
- Synthetisiere mit lokalem Kokoro ONNX TTS (mit
< 4Wortfragment-Zusammenführung und--say say.jsonphonetischem Wörterbuch):uv run tools/timing/kokoro-narrate.py script.txt --out-dir "$PROD/audio" --voice af_heart --say say.json - Verifiziere die gesprochene Audio-Rückführung mit lokalem
whisper-cli:uv run tools/verify/verify-narration.py "$PROD/audio/narration.wav" "$PROD/audio/timing.json" - Überprüfe Skripte/Texte auf wörtliche N-Gramm-Übernahme im Vergleich zum Referenztext:
python3 tools/verify/check-lift.py candidate.txt reference.txt
- Synthetisiere mit lokalem Kokoro ONNX TTS (mit
- Musik-/Lyrik-/Stem-reaktive Spuren:
- Trenne 6 Stems mit Demucs (
vocals, drums, bass, guitar, piano, other) und normalisiere auf 44,1 kHz WAV:uv run --python 3.12 tools/timing/separate-stems.py "$PROD/audio/song.mp3" --out-dir "$PROD/analysis" - Extrahiere 120 Hz Stem-Hüllkurven, monotone musikalische Zeit
tau, Beat/Takt-Phase, Stille,features.f32und 100 fps Gitarren-Tonhöhe/Vibrato:uv run --python 3.12 tools/timing/analyze-stems.py "$PROD/analysis" --fps 120 --stem-pitch - Richte Wort-für-Wort-Text aus (
whisper-cli,mlx-whisper,faster-whisperoderacousticGesangsband-Energie-Warping):uv run tools/timing/align-words.py "$PROD/analysis/stems/vocals.wav" --script lyrics.txt --backend whisper-cli --out "$PROD/analysis/words.json" - Leichte Single-File-Cues / Beat-Grid / Visualizer-Hüllkurve:
uv run tools/timing/cue-extract.py "$PROD/audio/song.mp3" --out "$PROD/analysis/cues.json"uv run --python 3.12 tools/timing/beat-grid.py "$PROD/analysis/analysis.wav" --out "$PROD/analysis/beats.json"python3 tools/build-visualizer.py "$PROD/analysis/analysis.wav" --out "$PROD/analysis/features.js"
- Trenne 6 Stems mit Demucs (
4. Stilauswahl & Prompt-Erstellung (prompts/README.md)
Durchstöbere prompts/styles/INDEX.md (86 verfasste visuelle Stilkarten in 13 Familien) und prompts/briefs/ (5 Format-Briefs: explainer-voiceover, vertical-short, lyric-video, instrumental-visualizer, data-story).
Stelle die kombinierte Spezifikation für den gewählten Stil und das Brief zusammen:
python3 tools/build-prompt.py <style-id> --brief <brief-id> --out "$PROD/style-prompt.md"
5. Szenen-Erstellungsvertrag (lib/API.md, docs/06-building-scenes.md, docs/12-advanced-engines-and-benchmarks.md)
Jede Szenen-HTML-Seite lädt lib/harness.js (window.H) und optional:
lib/sound.js(window.SOUND) — prozedurale Web Audio Syntheselib/features.js(window.FEATURES) — 120 Hz binärerfeatures.f32Stem-Cursor, refraktärer Onset-Puls, monotonestau(t)undwords.jsonLyrik-Nachschlagewerklib/ink-doodle.js(window.INK) — 8 fps deterministisches Line-Boil, gewackelte Doodle-Primitive, linksbündiges GROSSSCHRIFT-Einblendenmarkerund Ken BurnsplateKameralib/webgl-post.js(createPost) — 4-stufige Three.js Post-Processing (FxOverShader,UnrealBloomPass,FinalGradeShadermit ACES /paperMode, Luma-only Impact-Inversion, Glitch, Shake, Grain und crisp UI Overlay)
Jede Seite stellt bereit:
<canvas id="c" width="1920" height="1080"></canvas>(oder1080×1920für Hochformat)window.DURATION(Sekunden) undwindow.FPS(Standard30)window.__ready(Promise, das nach dem Laden von Schriftarten und gecachten Offscreen-Platten auflöst)window.__renderFrame = (t) => { ... }— reine Funktion vontin Sekunden.- Starte jeden Frame mit
ctx.reset()(oder balanciertemsave()/restore()). - Verwende
H.rng(seed)undH.noise(seed)außerhalb der Frame-Schleife; verändere niemals den veränderlichen Zustand über Frames hinweg. - Cache Papier-/Oberflächentexturen einmal mit
H.paperTexture(...)oderH.offscreen(key, w, h, fn). - Stelle
window.__textBounds = () => [...]für geschichtskritischen Text bereit ({text, critical: true, left, right, top, bottom}), damit automatisierte Sicherheitsbereich-Prüfungen jeden Frame verifizieren können.
- Starte jeden Frame mit
window.scoreSound = (k) => { ... }— plant prozedurale Soundereignisse zu festen Timeline-Zeitstempeln (unterdrückt automatisch Hintergrund-/Musik, wenn--voiceangegeben wird).
Wichtige Produktionsregeln aus Tests
- Sicherheitsbereich-Ränder & Schriftstärken: Auf macOS Chrome bietet
Arialnur die Stärken400und700(600wird auf700Bold gesetzt und verbreitert Zeilen um ~9 %). Überprüfe immermeasureText(s).actualBoundingBox*über alle Frames (x: 80..960, y: 190..1640für1080x1920vertikale Kurzfilme). - Durchgehende Kamerastile (
transit-map, pan-and-zoom): Starte die Kamera-Interpolation beibeat[i].start(niemalsbeat[i].start - preRoll, wennibeibeat[i].startwechselt, was einen 1-Frame-Sprung verursacht), blende Beat-lokale Overlays über0,20 sein und schütze Weltraum-Beschriftungen, sodass sie nur gezeichnet werden, wenn sie sich innerhalb des beschnittenen Karten-Viewports befinden.
6. Render-Standbilder, Determinismusprüfung & Master-Render (docs/07-rendering.md)
- Determinismus beim Springen Gate:
node starter/determinism.mjs path/to/film.html - Design-Standbilder Gate (überprüfe Eröffnungs-, mittlere dichte und Endframes vor dem Vollrender):
node starter/render.mjs path/to/film.html --stills 1.5,12.0,24.0 --outdir "$PROD/stills" - Voll-MP4-Render:
- Referenz-Single-Worker Playwright Renderer (Standard 30 fps Canvas2D + prozedurales Audio):
node starter/render.mjs path/to/film.html \ --out "$PROD/renders/master.mp4" --fps 30 --audio page \ --voice "$PROD/audio/narration.wav" - Multi-Worker GPU WebSocket Renderer (60 fps Three.js / WebGL / kinetische Typografie):
node tools/render/parallel-ws-render.mjs \ --url "http://127.0.0.1:5173/?capture=1" --duration <DURATION> --fps 60 --workers 4 \ --audio "$PROD/analysis/analysis.wav" --out "$PROD/renders/master.mp4" - Browserloser Python + Pillow
rawvideoRenderer (Untertitel-Arbeitsmappen & Tutorials):uv run tools/render/workbook-render.py \ --spec workbook.json --audio "$PROD/audio/narration.wav" --out-dir "$PROD/renders"
- Referenz-Single-Worker Playwright Renderer (Standard 30 fps Canvas2D + prozedurales Audio):
7. Obligatorische Verifikations-Gates (docs/08-verification.md)
Jede Produktion muss diese Prüfungen ausführen und die Ergebnisse in "$PROD/checks/" aufzeichnen, bevor sie übergeben wird:
- Stream-, Decode-, Sync- & Loudness-Gate:
uv run tools/verify/verify-video.py "$PROD/renders/master.mp4" \ --expect-seconds <DURATION> --fps 30 --width <W> --height <H> \ --json "$PROD/checks/verify-video.json" - Kontaktbogen visuelle Inspektion:
Überprüfeuv run tools/verify/contact-sheet.py "$PROD/renders/master.mp4" \ "$PROD/checks/contact-sheet.jpg" --n 16 --cols 4 --tile-width 270contact-sheet.jpgund die Szenen-Standbilder visuell auf Textabschneidungen, Beschriftungskollisionen oder unbeabsichtigte leere/eingefrorene Frames. - Übergangs- & Schnitthärte-Audit:
uv run tools/verify/cut-harshness.py "$PROD/renders/master.mp4" \ --top 15 --json "$PROD/checks/cut-harshness.json" - Look- & Palette-Diagnostik:
uv run tools/verify/measure-look.py "$PROD/renders/master.mp4" \ --samples 16 --json "$PROD/checks/measure-look.json" - All-Frame-Textbegrenzungs-Audit:
Folge dem Muster in
tests/layout.mjs, umfillTextTintengrenzen undwindow.__textBounds()über jeden Frame0 .. frames-1zu verifizieren.
8. Verpackung & Lieferung (RUNBOOK.md §12)
Vervollständige "$PROD/qa.md" (aus templates/qa.md) und "$PROD/delivery.md" (aus templates/delivery.md). Melde Maschinenverifikation (PASS/WARN-Status) getrennt von der menschlichen kreativen Betrachtung und Hörfreigabe.
Wichtige Referenzen
README.md— Schnellstart und KapitelübersichtRUNBOOK.md— 12-Schritte-Mensch-KI-Produktionschecklistelib/API.md— ExakterHGrafik- undSOUNDprozeduraler Audiovertragexamples/README.md— Ausgearbeitete Querformat-, Hochformat- und Stilstudienbeispieledocs/10-pitfalls.md— Symptom → Ursache → Reparaturtabelle