Cinematic Beats Video-Stil
Kernphilosophie
Visuelles führt Timing. Audio folgt. Animationen und ASCII-Szenen laufen in ihrer natürlichen Laufzeit ab – sie werden NICHT abgeschnitten, beschleunigt oder auf dem letzten Frame gehalten, um an die Audiolänge anzupassen. Stille zwischen den Beats ist beabsichtigtes Design, keine Lücke, die gefüllt werden muss.
- TTS: Ein Satz pro Clip. Maximale Signal-Rausch-Verhältnis. Keine Füller-Narration.
- Visuelles: Volle natürliche Laufzeit. Lasse Animationen atmen.
- Schnitte: Nur harte Schnitte. Keine Überblendungen.
- Musik: Benutzerbereitgestellte Tracks mit automatischem Ducking während Sprachpassagen.
- Check-ins: Nach jeder Produktionsphase die Assets dem Nutzer zur Überprüfung vorlegen, bevor fortgefahren wird.
Projektstruktur
~/videos/[projektname]/
project.md # Lebendes Dokument – Storyboard, Entscheidungen, Revisionsnotizen
beats/ # Einzelne Beat-Assets
beat-01/
visual.mp4 # Generiertes Visuell (Bild mit Bewegung oder Animation)
audio.mp3 # TTS-Clip für diesen Beat (nur MP3 – siehe kritische Regeln)
note.txt # Einzeilige Beschreibung, was dieser Beat zeigt
beat-02/
...
music/ # Vom Benutzer bereitgestellte Hintergrundmusiktitel
output/ # Zwischen- und finale Renderings
Phase 1: Beat-Skript
project.md mit der Beat-Aufschlüsselung erstellen. Jeder Beat = eine visuelle Darstellung + ein TTS-Satz.
Beats schreiben
TTS-Regeln:
- EIN Satz pro Beat. Punkt.
- Maximale Signal-Rausch-Verhältnis – jedes Wort verdient seinen Platz.
- Wenn ein Gedanke zwei Sätze braucht, sind es zwei Beats.
- Ziel: 5-15 Wörter pro Clip. Kürzer ist besser.
- Keine einleitenden Füller ("Also...", "Schauen wir uns jetzt an..."). Beginne mit dem Punkt.
Visuelle Regeln:
- Beschreibe, was das Visuelle zeigt – nicht wie lange es dauert.
- Die visuelle Laufzeit wird durch seinen natürlichen Abschluss bestimmt, NICHT durch die TTS-Länge.
- Bildschnitte: Standbild mit Ken-Burns-Bewegung (langsamer Zoom/Schwenk). Laufzeit: mindestens 4-6s.
- Animierte Schnitte (p5js/manim/ascii): Die gesamte Animation läuft ab. Egal wie lange – 8s, 12s, 15s.
- Die Beat-Dauer = max(visuelle_dauer, audio_dauer) + Pause.
Beat-Vorlage in project.md:
# [Projektname]
## Konzept
[Ein Absatz – worum es in diesem Video geht und welches Gefühl wir vermitteln wollen]
## Musik
- Titel: [Dateiname oder Beschreibung der Musik, die der Nutzer bereitstellt]
- Stimmung: [Beschreibung]
## Beats
### Beat 01
**Visuell:** [Typ: image | p5js | manim | ascii] – [Prompt/Beschreibung]
**TTS:** "Ein prägnanter Satz."
**Status:** [ ] visuell [ ] audio [ ] genehmigt
### Beat 02
...
## Notizen
[Laufendes Protokoll der Entscheidungen, Überarbeitungen, Nutzerfeedback]
Schnitttypen
| Typ | Werkzeug | Laufzeit | Am besten geeignet für |
|---|---|---|---|
image | image_generate + Ken Burns | 4-6s | Fotos, Szenen, Porträts, Einstiegsshots |
p5js | p5js-Fähigkeit | Natürlich (8-15s) | Generative Kunst, Partikel, Datenvisualisierung, Strömungsfelder |
manim | manim-video-Fähigkeit | Natürlich (8-20s) | Mathematikanimationen, Diagramme, technische Erklärungen |
ascii | ascii-video-Fähigkeit | Natürlich (6-12s) | Terminal-Ästhetik, Retrocomputing, Hacking-Themen |
caption | ffmpeg drawtext | 4-8s | Zentrierter TTS-Text auf dunklem Hintergrund – lenkt den Fokus auf die Wörter |
KRITISCH: Bevor du einen p5js/manim/ascii-Beat produzierst, lade die Fähigkeit zuerst mit skill_view(name). Diese Fähigkeiten enthalten Markenpaletten, Schriftregeln und Implementierungsmuster, die genau befolgt werden müssen.
Phase 2: Skript-Genehmigungs-Gate
STOP. Präsentiere project.md dem Nutzer. Generiere keine Assets, bis sie explizit genehmigt wurden.
Aktualisiere den Abschnitt "Notizen" in project.md mit dem Genehmigungszeitstempel.
Phase 3: Visuelle Elemente generieren
Generiere alle visuellen Assets gemäß ihrem Typ. Speichere sie als beats/beat-XX/visual.mp4.
Bild-Beats (VHS-gefilterte Ken Burns)
- Generiere Bild via
image_generate - Wende VHS-Filter auf das Bild an (Korn, Scanlines, Vignette, chromatische Aberration):
python3 scripts/vhs-filter.py \
--input beat-XX-bild.png \
--output beat-XX-vhs.png \
--seed 42 \
--intensity 1.0
Anforderungen: pip install numpy Pillow (numpy für die Array-Effekte, Pillow für Bild-I/O).
Intensitätsstufen: 0.7 (dezent – nur Korn + Vignette), 1.0 (Standard – alle Effekte), 1.5 (stark – starke chromatische Aberration, sichtbare Scanlines). Standard ist 1.0.
- Wende Ken-Burns-Bewegung auf das VHS-gefilterte Bild an, um MP4 zu erstellen:
ffmpeg -loop 1 -i beat-XX-vhs.png -t 5 \
-vf "zoompan=z='min(zoom+0.001,1.3)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=125:s=1920x1080:fps=25" \
-c:v libx264 -pix_fmt yuv420p -r 25 beats/beat-XX/visual.mp4
Warum zuerst VHS, dann Ken Burns? Der Zoompan-Filter würde das Korn und die Scanlines verwischen. Wende VHS zuerst auf das Standbild an, dann füge Bewegung hinzu. Die Ken-Burns-Bewegung über dem VHS-gefilterten Bild erzeugt ein gelebtes, analoges Gefühl – wie das Ansehen alter Aufnahmen auf einer leicht degradierten CRT.
Animierte Beats (p5js/manim/ascii)
Lade zuerst die relevante Fähigkeit, dann generiere. Speichere die Ausgabe als beats/beat-XX/visual.mp4.
Auflösung: Alle visuellen Elemente müssen 1920x1080 bei 25fps sein. Skaliere manim-Ausgaben:
ffmpeg -y -i raw-manim.mp4 \
-vf "scale=1920:1080:flags=lanczos,setsar=1:1,fps=25" \
-c:v libx264 -pix_fmt yuv420p -r 25 beats/beat-XX/visual.mp4
Batch image_generate-Aufrufe in Gruppen von 6. Wenn markiert, formuliere neutral um und versuche es einmal erneut.
VHS-Filter-Referenz
Der VHS-Filter (scripts/vhs-filter.py) wendet diese Effekte auf ein einzelnes Bild an:
| Effekt | Was es tut | Visuelles Ergebnis |
|---|---|---|
| Chromatische Aberration | R/B-Kanalversatz (0-2px) | Farbstreuung an den Kanten, wie ein falsch ausgerichteter CRT |
| Analoges Rauschen | ±8 Körnung pro Kanal (intensitätsskaliert) | Filmähnliche Textur in Schatten und Mitteltönen |
| Scanlines | Jede 4. Zeile auf 96% abgedunkelt | CRT-Phosphorgitter-Overlay |
| CRT-Vignette | Randabdunklung (15-35% basierend auf Intensität) | Abgerundete Bildschirmecken, wie bei alten Fernsehern |
Für Bilder: Alle Effekte werden einmal mit einem einzigen Zufalls-Seed angewendet. Chromatische Aberration und Rauschen sind sichtbar; Jitter/Tracking-Linien sind dezent, da es nur einen Frame gibt.
Hinweis: Dieser Filter ist nur für Bilder – er verarbeitet keine Videoeingaben. Um Bewegung zu erhalten, wende den Filter zuerst auf einen statischen Frame an, dann füge Ken Burns/zoompan oben drauf.
Phase 3.5: Visuelles Check-in-Gate
STOP. Sende jeden visuellen Clip dem Nutzer zur Überprüfung.
Füge den Screenshot oder das MP4 mit MEDIA:-Pfaden bei. Präsentiere sie nummeriert:
Beat 01: [MEDIA-Pfad] — [kurze Beschreibung]
Beat 02: [MEDIA-Pfad] — [kurze Beschreibung]
...
Frage: "Sind Änderungen erforderlich, bevor wir mit dem Audio fortfahren?"
Generiere kein TTS, bis der Nutzer die visuellen Elemente genehmigt hat. Halte Feedback in den Notizen von project.md fest.
Wenn Änderungen gewünscht werden, generiere nur die betroffenen Beats neu und checke erneut ein.
Phase 4: TTS-Audio generieren
Generiere ALLE TTS-Clips – einen pro Beat. Verwende das Werkzeug text_to_speech mit output_path als .mp3. Speichere als beats/beat-XX/audio.mp3.
KRITISCH: Verwende für Audio immer das MP3-Format. OGG hat Codec-Kompatibilitätsprobleme mit der Telegram-Zustellung und ffmpeg concat-Operationen. Setze den TTS-Anbieter auf OpenAI mit MP3-Ausgabe.
Regeln:
- Ein Satz pro Aufruf. Keine Verkettung.
- Miss die Dauer jedes Clips nach der Generierung mit ffprobe.
- Trage die Dauern in project.md neben jedem Beat ein.
ffprobe -v error -show_entries format=duration -of csv=p=0 beats/beat-XX/audio.mp3
Phase 4.5: Audio-Check-in-Gate
STOP. Präsentiere dem Nutzer die Audio-Clips.
Sprachfilter anwenden (erforderlich)
Wende die Dry/Wet-Bitcrush-Kette auf jeden TTS-Clip an – das ist unsere charakteristische Stimme. Siehe references/dry-wet-bitcrush.md für die vollständige Technik und Fallstricke.
Zwei Ansätze verfügbar:
A) Statischer Mix (einfach, konsistent):
# Schritt 1: Erstelle gecrushte Version via wav-Zwischenstufe (bewahrt Dauer)
ffmpeg -y -i beats/beat-XX/audio.mp3 \
-af "aresample=resampler=soxr:osr=2000,aformat=sample_fmts=u8,aresample=resampler=soxr,lowpass=f=2500" \
temp-crushed.wav
# Schritt 2: Mische Dry + Wet mit Kompressions-Leim
ffmpeg -y -i beats/beat-XX/audio.mp3 -i temp-crushed.wav \
-filter_complex "[0:a]volume=0.7[dry];[1:a]volume=0.3[wet];[dry][wet]amix=inputs=2:duration=first:normalize=0,acompressor=threshold=0.05:ratio=4:attack=10:release=100[out]" \
-map "[out]" beats/beat-XX/audio-filtered.mp3
rm temp-crushed.wav
B) Dynamischer Mix (Signal-Verschlechterungs-Effekt – bevorzugt):
Verwendet Python-Skript (scripts/vibey-mix.py) mit Zero-Order-Hold-Upsampling für authentischen Bitcrush bei korrekter Tonhöhe.
Anforderungen: pip install numpy pydub (numpy für Array-Verarbeitung, pydub für MP3-Lesen/Schreiben).
Festgelegte Parameter (dec5-bit8-Variante):
- Dezimierung: 5× (lässt jedes 5. Sample aus, wiederholt dann via Zero-Order-Hold)
- Quantisierung: 8-Bit (konstant)
- Dry/Wet-Baseline: 80% dry / 20% wet
- Dip-Muster: Alle ~1,2s fällt dry auf ~35%, wet steigt auf ~65% (Dauer ~0,25s)
- Tremolo nur auf wet: 4Hz Dreieckwelle, Tiefe 70% (wet pulsiert zwischen 30-100%)
- Slapback-Delay: 80ms bei -18dB (~0,12 Lautstärke), angewendet auf den endgültigen Mix
python3 scripts/vibey-mix.py beats/beat-XX/audio.mp3
cp beats/beat-XX/audio-dynamic.mp3 beats/beat-XX/audio-filtered.mp3
Kettenaufschlüsselung: Sauberes Dry-Signal, überlagert mit extremen digitalen Artefakten (5× Dezimierung, 8-Bit-Quantisierung via Zero-Order-Hold-Upsampling), periodische Absenkungen, die den Wet-Pegel für einen "degradierenden Übertragungs"-Effekt anheben, Tremolo auf dem Wet-Signal für rhythmisches Pulsieren und Slapback-Delay für Räumlichkeit. Halte die Kettenstruktur intakt – passe nur einzelne Parameter an, falls nötig.
Verwende audio-filtered.mp3 in allen nachfolgenden Phasen. Behalte das Original audio.mp3 als Referenz.
Halte Entscheidungen in den Notizen von project.md fest.
Phase 5: Beats komponieren
Für jeden Beat: visuelles + Audio mit hartem Schnitt (kein Übergang) zusammenführen. Die Beat-Dauer wird durch die Länge des längeren von beidem bestimmt – visuell oder audio.
Wenn visuell >= audio:
Audio läuft unter dem gesamten visuellen Element. Keine Auffüllung nötig.
ffmpeg -i beats/beat-XX/visual.mp4 -i beats/beat-XX/audio-filtered.mp3 \
-c:v libx264 -pix_fmt yuv420p -c:a aac \
-shortest -r 25 output/beat-XX-komponiert.mp4
Wenn audio > visuell:
Visuelles hält seinen letzten Frame, um die verbleibende Zeit zu füllen. Verwende tpad für das Video:
AUDIO_DUR=$(ffprobe -v error -show_entries format=duration -of csv=p=0 beats/beat-XX/audio-filtered.mp3)
ffmpeg -i beats/beat-XX/visual.mp4 -i beats/beat-XX/audio-filtered.mp3 \
-vf "tpad=stop_mode=clone:stop_duration=$AUDIO_DUR" \
-c:v libx264 -pix_fmt yuv420p -c:a aac \
-t $AUDIO_DUR -r 25 output/beat-XX-komponiert.mp4
Wenn kein Audiofilter angewendet wurde, verwende audio.mp3 anstelle von audio-filtered.mp3.
Pause zwischen den Beats
Füge einen kurzen schwarzen Frame zwischen den Beats für Atempausen ein:
ffmpeg -f lavfi -i color=c=black:s=1920x1080:d=0.15:r=25 \
-c:v libx264 -pix_fmt yuv420p output/pause-XX.mp4
ASCII-Untertitel-Beats (Wortfokus)
Wenn die Erzählung selbst der Fokuspunkt ist – nicht das Visuelle – verwende einen ASCII-ähnlichen Beat mit dem TTS-Text zentriert auf dem Bildschirm. Markiere diese in project.md als [caption]-Typ:
Beat-Vorlage:
### Beat 03 [caption]
**Visuell:** ascii caption — Text zentrieren, dunkler Hintergrund, dezente Terminal-Ästhetik
**TTS:** "Die genauen Wörter, die auf dem Bildschirm erscheinen."
**Status:** [ ] visuell [ ] audio [ ] genehmigt
Generiere mit ffmpeg drawtext auf schwarzem/dunklem Hintergrund mit Monospace-Schriftart und ALLMIND-Gold (#C5A55A) Text:
TEXT="Dein TTS-Satz hier"
ffmpeg -f lavfi -i color=c=black:s=1920x1080:d=6:r=25 \
-vf "drawtext=text='${TEXT}':fontsize=42:fontcolor='#C5A55A':fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf:x=(w-tex
t_width)/2:y=(h-text_height)/2" \
-c:v libx264 -pix_fmt yuv420p output/beat-XX-caption.mp4
Phase 5.5: Beat-Kompositions-Check-in
STOP. Sende alle komponierten Beats dem Nutzer zur Überprüfung.
Präsentiere sie mit MEDIA:-Pfaden. Frage: "Sieht alles gut aus? Soll ich zur finalen Zusammenstellung übergehen?"
Phase 6: Finale Zusammenstellung
Konkateniere alle komponierten Beats und Pausen in die endgültige Ausgabe. Erstelle zuerst eine Dateiliste:
# Erstelle concat-Liste
for f in output/beat-*-komponiert.mp4 output/pause-*.mp4; do echo "file '$f'" >> concat-list.txt; done
# Konkateniere
ffmpeg -f concat -safe 0 -i concat-list.txt \
-c:v libx264 -pix_fmt yuv420p -c:a aac \
-r 25 output/final.mp4
rm concat-list.txt
Phase 7: Musik-Mix (optional)
Ducking während Sprache
Wenn der Nutzer einen Hintergrundmusik-Titel bereitstellt, wende Sidechain-Kompression an, um die Musik während der Sprachsegmente automatisch abzusenken:
ffmpeg -i output/final.mp4 -i pfad/zu/musik.mp3 \
-filter_complex "[1:a]volume=0.3[music];[0:a][music]amix=inputs=2:duration=first:normalize=0[out]" \
-map 0:v -map "[out]" -c:v libx264 -c:a aac -r 25 output/final-with-music.mp4
Für präzises Ducking (Sprache priorisieren):
ffmpeg -i output/final.mp4 -i pfad/zu/musik.mp3 \
-filter_complex "[1:a]volume=0.25[music];[0:a]aloudnorm=I=-16:LRA=1[voice];[voice][music]amix=inputs=2:duration=first:normalize=0[out]" \
-map 0:v -map "[out]" -c:v libx264 -c:a aac -r 25 output/final-with-music.mp4
Kritische Regel: Mische NIEMALS Musik ohne Sidechain-Ducking. Die Stimme muss über der Musik klar und deutlich sein.
Phase 7.5: Finales Check-in
STOP. Präsentiere dem Nutzer die endgültige Ausgabe.
Sende die finale MP4-Datei zur Überprüfung. Frage: "Gibt es letzte Änderungen, die vorgenommen werden sollen?"
Phase 8: Veröffentlichung (optional)
Wenn der Nutzer zufrieden ist, frage nach den Veröffentlichungsplattformen (nicht automatisch tun – frage).
Optionen:
- Telegram-Kanal – sende Datei via Telegram-Nachricht
- Lokal speichern – belasse in
~/videos/[projektname]/output/final.mp4 - Hochladen – frage nach Ziel (YouTube, Twitter, etc.)
Projektabschluss
Wenn abgeschlossen, aktualisiere project.md mit einem finalen Eintrag:
## Abschluss
- Datum: YYYY-MM-DD
- Endgültige Dauer: [Dauer in Sekunden]
- Musik enthalten: [Ja/Nein]
- Veröffentlicht auf: [Plattform(en)]
- Nutzerfeedback: [Zufrieden/Änderungen/etc]
Produktions-Checkliste
- Beat-Skript in project.md erstellt
- Genehmigung für Beat-Skript erhalten
- Alle visuellen Assets generiert
- Visuelle Überprüfung abgeschlossen (alle genehmigt oder Änderungen vorgenommen)
- Alle TTS-Audio-Clips generiert
- Sprachfilter auf alle Audio-Clips angewendet (Bitcrush-Kette)
- Audio-Überprüfung abgeschlossen
- Einzelne Beats komponiert
- Beat-Kompositions-Überprüfung abgeschlossen
- Finale Zusammenstellung konkateniert
- Musik-Mix angewendet (falls zutreffend)
- Finale Ausgabe überprüft und genehmigt
- Veröffentlicht (falls gewünscht)
- project.md abgeschlossen