Sound Design: echte Klänge auf einem fertigen Video
Das Ziel: Der Film klingt, als hätte ein Cutter mit einer guten Bibliothek ihn geschnitten. Jeder Sound ist eine echte Datei aus EditAtlas, auf einem Frame platziert, den du angesehen hast, mit einer Lautstärke, die du in Zahlen begründen kannst.
Zwei Dinge gelten während des gesamten Prozesses, also plane entsprechend:
- Du kannst nicht hören. Du wählst Sounds anhand ihrer Beschreibungen und gemessenen Zahlen aus (
sounds.py info), prüfst Platzierung und Lautstärke mitcheck.pyund übergibst der Person eine kurze Liste von Momenten zum Anhören. Sage niemals, ein Sound „klingt gut"; sage, was gemessen wurde und was noch Ohren braucht. - Du darfst nicht erfinden. Arbeite nur mit dem Video, das dir die Person gegeben hat. Wenn es kein Video gibt, frage danach. Wenn ein Moment einen Sound benötigt, den die Bibliothek nicht hat, lasse ihn still und erwähne das im Bericht.
Alle Skripte befinden sich in scripts/ (Python 3.9+, numpy, Pillow für die Einzelbildtafeln, FFmpeg mit ffprobe im PATH). Führe sie
mit dem Pfad des Skill-Ordners aus, von einem eigenen Arbeitsverzeichnis aus (work/, result/); schreibe niemals in das Projekt der
Person oder in diesen Skill-Ordner.
python SKILL/scripts/moments.py FILM.mp4 --out work/moments # moments.json, sheet.png, overview.png
python SKILL/scripts/moments.py FILM.mp4 --at 10.4 --out work/at # Frames alle 0,1 s um eine Zeit
python SKILL/scripts/sounds.py search "Glas klirrt" --max-dur 2 # IDs aus dem öffentlichen Index
python SKILL/scripts/sounds.py info sfx-ID sfx-ID # einmal herunterladen, SHA-256, gemessene Zahlen
python SKILL/scripts/sounds.py sheet sfx-ID sfx-ID --out work/c.png # Wellenform + Spektrogramm der Kandidaten
python SKILL/scripts/mix.py work/cues.json --out result/FILM_sfx.mp4 # MP4 + _track.wav + _resolved.json
python SKILL/scripts/check.py result/FILM_sfx_resolved.json --moments work/moments/moments.json --listen-out result/listen.wav
Sounds stammen von https://raw.githubusercontent.com/EditAtlas/sfx/main/ und werden in
~/.cache/editatlas-sfx zwischengespeichert (EDITATLAS_SFX_CACHE verschiebt ihn). Mit einem lokalen Clone von EditAtlas/sfx übergibst du
--mirror PATH (vor dem Unterbefehl für sounds.py) und es wird nichts heruntergeladen.
1. Betrachte den Film und seinen Ton
Führe moments.py aus. Es meldet den vorhandenen Ton (has_audio, LUFS, wie viel davon still ist) und findet drei Arten von
Momenten anhand von Pixeldifferenzen: cut (Szenenwechsel), move (Bewegung beginnt oder erreicht ihren Höhepunkt), land (Bewegung stoppt:
etwas kommt zur Ruhe). Öffne dann overview.png und sheet.png mit dem Read-Tool: Die Zahlen übersehen weiche Animationen
(ein Badge, das über ein stilles Gesicht skaliert, erzeugt keinen Schnitt) und melden Verwacklungen übermäßig. Wo es darauf ankommt,
zeichne die Frames um eine Zeit mit --at T und finde den genauen Frame, an dem das Objekt erscheint, landet oder sich dreht.
Entscheide, was der eigene Ton des Films ist:
| Was du in den Zahlen hörst und siehst | Cue-Sheet |
|---|---|
Kein Ton, oder silent_share nahe 1 | "keep_audio": false: die Sounds tragen den Film; er wird auf etwa -16 LUFS gebracht |
| Nur Musik | "keep_audio": true: Sounds liegen etwa 3 LU darunter; setze Akzente möglichst auf den Beat |
| Jemand spricht (Untertitel, ein Gesicht, ein Ansteckmikrofon) | "keep_audio": true, "under_voice": true: etwa 8 LU unter der Stimme; weniger, leisere Sounds |
| Synthetische Pieptöne bereits im Mix eingebrannt | Frage nach: Ersetzen benötigt die Stems; das Überlagern mit echten Sounds verdoppelt sie |
Frage die Person, wenn nicht klar ist, ob der Ton des Films erhalten bleiben soll.
2. Schreibe die Ereignisliste basierend auf dem, was du gesehen hast
Eine Zeile pro Moment, der einen Sound verdient: Zeit, was passiert, welche Art von Sound. Denke wie ein Cutter:
- Ein Objekt, das erscheint (Badge, Chip, Button, Bildunterschrift): ein kurzer Pop, Tick oder sanfter Ding,
anchor: start. - Ein Objekt, das quer bewegt oder ein Übergang: ein Whoosh, dessen lautester Punkt auf der Ankunft liegt,
anchor: peak. - Ein Objekt, das mit Gewicht landet (Logo, Produkt, Stempel): ein Hit oder dumpfer Schlag auf dem Frame, an dem es stoppt,
anchor: peak. - Ein reales Objekt auf dem Bildschirm (Glas, Eis, Papier, Schlüssel, ein Getränk): der passende Foley-Sound, kein UI-Sound.
- Erfolgs-/Fehlerzustände: ein Ding für Ja, ein kurzer Summer oder Alarm für Nein. Eine Familie von Interface-Sounds pro Film.
- Etwas, das sich aufbaut: ein Riser, dessen Ende auf dem Höhepunkt landet,
anchor: end.
Nicht jede Bewegung braucht einen Sound. Tempo- und Geschmacksregeln mit Zahlen findest du in references/taste.md; lies es vor dem
ersten Cue-Sheet einer Sitzung.
3. Wähle Sounds: lies, messe, vergleiche
- Suche. Wenn der EditAtlas MCP verbunden ist, rankt
search_sfxbesser (es versteht auch Vietnamesisch); andernfallssounds.py search. Titel vermeiden bewusst die Wörter ihrer Quelldateien („Kameraauslöser" ist „Lens Aperture Tick"), also suche nach dem, was der Sound ist, und probiere Synonyme und den Kategoriefilter. sounds.py infoauf 2–4 Kandidaten. Lese:audible_s(wie lange er wirklich zu hören ist; die Datei kann länger sein),attack_s(0,0x = schneidet ein, 0,3+ = schwillt an),peak_t_s,centroid_hz(unter ~1500 dunkel, über ~6000 hell),mono_loss_db(unter -6 heben sich die Kanäle auf einem Telefon auf;mix.pyspielt dann den lauteren Kanal ab).sounds.py sheet, wenn zwei Kandidaten gleich klingen: eine scharfe vertikale Linie ist ein Klick, eine Verschmierung ist ein Whoosh, Energie am Boden ist Gewicht.- Wähle nach dem, was sich bewegt und was es berührt, dann nach der Länge: Ein 0,3 s Chip-Pop darf kein 1,8 s Cartoon-Pop sein. Verwende
max_len, um eine lange Datei mit einem Fade zu verkürzen. - Wiederholte Momente einer Art (drei Chips) möchten verschiedene Aufnahmen einer Familie (Tiny Plop 05, 06, Empty Plop 06), nicht dreimal dieselbe Datei.
Die Bibliothek ist an manchen Stellen dünn (gemessen 2026-11-07): kein Flüssigkeitsgießen oder Zischen, kein Raumton, kein Stempel, wenige Wassertropfen und dumpfe Schläge. Wähle den nächstgelegenen ehrlichen Sound und nenne die Lücke im Bericht, anstatt einen falschen zu erzwingen.
4. Schreibe das Cue-Sheet und rendere
{
"video": "work/film.mp4",
"keep_audio": false,
"under_voice": false,
"cues": [
{"t": 0.30, "id": "sfx-988dafbd36", "role": "whoosh", "label": "Titel landet"},
{"t": 0.62, "id": "sfx-mi630472", "role": "foley", "anchor": "start", "max_len": 0.9, "gain_db": -2, "label": "Eis ins Glas"},
{"t": 8.30, "id": "sfx-fs339114", "role": "hit", "label": "Flasche landet"},
{"t": 0.00, "id": "sfx-c7d271e90f", "role": "ambience", "bed": true}
]
}
tist der Frame des Moments in Sekunden.rolesetzt die Lautstärke und den Standard-Anker (references/taste.md).anchor:startsetzt den hörbaren Start auft,peakden lautesten Punkt,enddas hörbare Ende.- Pro Cue:
gain_db(relativ zur Rollenlautstärke),max_len,fade_in,fade_out,offset_in,pan(-1..1). "bed": true: eine lange, gleichmäßige Atmo unter dem gesamten Film bei -54 dBFS (kaum hörbar). Nur für Filme, deren Ton nur aus SFX besteht; niemals unter Sprache oder Musik. Sie überblendet in sich selbst, wenn der Film länger ist.
Führe mix.py aus. Es gibt jeden Sound mit seiner Landezeit und Spitzenlautstärke aus und notiert, wenn ein Moment so früh war,
dass der Sound innerhalb seiner Datei beginnen musste.
5. Prüfe, behebe, prüfe erneut
Führe check.py nach jedem Rendering aus; Exit-Code 1 bedeutet, dass es etwas beanstandet hat. Es liest die WAV-Titel, die
mix.py neben _resolved.json geschrieben hat, also bewahre diese Dateien zusammen, wenn du Ergebnisse kopierst. Es findet jeden Sound im gerenderten
Track anhand seiner eigenen Wellenform, daher ist sync real: Alles, was um mehr als einen Frame abweicht, ist ein Fehler im Sheet. Es misst auch
Gesten pro 10 s, die längste Lücke, schwere Hits, Wiederholungen, digitale Stille, Master-Lautstärke und True
Peak, Mono-Fold-Down und wie viele starke Bildmomente einen Sound erhalten haben.
Behebe jede Beanstandung (füge einen Sound in die Lücke ein, tausche eine Wiederholung aus, verschiebe ein Cue) oder entscheide, dass sie richtig ist, und begründe dies
im Bericht („Die 7,8 s Lücke ist ein Sprechabschnitt, die Stimme trägt ihn"). Hinweise auf langsame Angriffe sind Tipps:
Wenn der Moment der Höhepunkt des Sounds ist, wechsle dieses Cue zu anchor: peak. Zwei oder drei Durchgänge sind normal.
6. Liefere
Gib der Person:
FILM_sfx.mp4undFILM_sfx_track.wav(nur Sounds, volle Länge, zum Unterlegen unter ihren eigenen Schnitt).- Eine kurze Tabelle: Zeit, Moment, Soundtitel und ID, warum dieser Sound.
- Die Zahlen von
check.py(Tempo, längste Lücke, LUFS, True Peak) und was jede verbleibende Beanstandung bedeutet. - Die Hörliste (
listen.wavschneidet diese Momente in eine Datei): „Auf Kopfhörern und einmal auf einem Telefon hören". - Die Lücken: stille Momente und Sounds, die die Bibliothek nicht hatte.
Schreibe den Bericht in der Sprache der Person. Behaupte nicht, dass du zugehört hast.
Optional: die echte-SFX-Engine
Clipwings real-sfx-Skill (MIT-Skripte, von Alexander Korbanov) erledigt die gleiche Aufgabe mit einer schwereren Engine: getippte Cue-
Listen, Synth-Layer-Entfernung, Beat-Raster, eine 9-Achsen-Kritik. Er kann die gesamte EditAtlas-Bibliothek als sein Hauptpaket verwenden.
Siehe references/real-sfx.md für den Adapter und was verifiziert wurde.