CommunityCodierung & Entwicklunggithub.com

Salt-555/SaltySkills

Hier veröffentliche ich unterhaltsame Fähigkeiten für Hermes-Agent. Nimm, was du brauchst, überschütte mich nur mit Lob, wenn ich im Gespräch erwähnt werde.

Was ist SaltySkills?

Diese Fähigkeit definiert einen vollständigen Produktionsworkflow für kinematische Video-Beats, bei dem visuelle Elemente die zeitliche Abstimmung bestimmen und Audio ihnen folgt. Sie ist für KI-Agenten wie Hermes-Agent konzipiert und strukturiert Projekte in einer `~/videos/[Projektname]/`-Hierarchie mit einer lebenden `project.md`-Datei, einzelnen Beat-Ordnern und einer `output/`-Strecke. Die Fähigkeit schreibt harte Schnitte, TTS mit einem Satz pro Clip und benutzerdefinierte Musik mit automatischem Ducking während Sprachpassagen vor. Unterstützte visuelle Typen sind Standbilder mit Ken-Burns-Effekt, p5js/manim/ascii-Animationen und Untertitel-Beats, jeweils mit spezifischen Werkzeugen und Laufzeiten. Der Produktionsprozess ist in fünf Phasen unterteilt: Beat-Skripterstellung, Skript-Genehmigung, Generierung von Visuals (mit VHS-Filter und Ken Burns), TTS-Audio (mit einem charakteristischen Bitcrush-Effekt für die Stimme) und finale Komposition mit Pausen zwischen den Beats. Wichtige Gate-Checks nach jeder Phase erfordern eine Benutzerfreigabe, bevor fortgefahren wird, und es gibt detaillierte FFmpeg/Shell-Befehle für jeden Schritt. Die Fähigkeit betont eine natürliche Laufzeit für Animationen, das Batch-Generieren von Bildern in Gruppen von 6 und die Verwendung von MP3 für Audio aufgrund von Kompatibilitätsproblemen mit OGG.

Funktioniert mit~Claude Code✓Codex CLI~Cursor
npx skills add Salt-555/SaltySkills

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

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

Dokumentation

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

TypWerkzeugLaufzeitAm besten geeignet für
imageimage_generate + Ken Burns4-6sFotos, Szenen, Porträts, Einstiegsshots
p5jsp5js-FähigkeitNatürlich (8-15s)Generative Kunst, Partikel, Datenvisualisierung, Strömungsfelder
manimmanim-video-FähigkeitNatürlich (8-20s)Mathematikanimationen, Diagramme, technische Erklärungen
asciiascii-video-FähigkeitNatürlich (6-12s)Terminal-Ästhetik, Retrocomputing, Hacking-Themen
captionffmpeg drawtext4-8sZentrierter 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)

  1. Generiere Bild via image_generate
  2. 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.

  1. 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:

EffektWas es tutVisuelles Ergebnis
Chromatische AberrationR/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
ScanlinesJede 4. Zeile auf 96% abgedunkeltCRT-Phosphorgitter-Overlay
CRT-VignetteRandabdunklung (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:

  1. Telegram-Kanal – sende Datei via Telegram-Nachricht
  2. Lokal speichern – belasse in ~/videos/[projektname]/output/final.mp4
  3. 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

Verwandte Skills