Was macht sound (Vollversion)?
Vollständige Toolkette für Video-Audio, drei Fähigkeitslinien:
- Soundeffekt-Auswahl – Mehrquellensuche, Filterung nach menschlichen Feedback-Signalen, Download, Messung.
- BGM (Hintergrundmusik) – Zwei Wege: Offline-Synthese nahtlos loopbarer Musik oder Extraktion langer Audiospuren aus der Materialdatenbank.
- Sprache & Mischung – Rauschunterdrückung/EQ/De-Esser/Kompression, Sidechain-Ducking, statisches Mischen, zweistufige Loudness-Normalisierung.
Umgebung: Nur Python 3 + FFmpeg (ffmpeg / ffprobe im PATH). Reine Standardbibliothek, keine Drittanbieterpakete, keine API-Keys, keine Anmeldung.
Alle Fähigkeiten dieses Skills sind in diesem Repository unter MIT-Lizenz quelloffen implementiert: Alle Befehle, Regeln und Parameter sind in der folgenden Dokumentation und in references/ enthalten, frei veränderbar und weiterverteilbar.
Nach der Installation die Variablen je nach tatsächlichem Speicherort setzen. Unten wird die Schreibweise für eine Installation innerhalb des Projekts verwendet:
S=.claude/skills/sound/scripts/sfx.py # Suche / Download / Analyse
V=.claude/skills/sound/scripts/vocal.py # Sprache / Mischung
C=.claude/skills/sound/scripts/compose.py # Offline BGM-Synthese
Bei globaler Installation .claude/skills/sound/ durch ~/.claude/skills/sound/ ersetzen.
1. Soundeffekt-Auswahl
Arbeitsablauf
- Bildschirmaktionen in englische Schlüsselwörter übersetzen („Karte fliegt ein“ →
short whoosh, „Schalter umlegen“ →soft click). allquellenübergreifend nach Kandidaten suchen, bei Bedarf einzelne Quelle ergänzen;--urlsfür Hörbeispiele an den Benutzer.- Zuerst prüfen, ob es zum Bild passt, dann die Popularität bewerten; Kandidaten und Empfehlungsgrund nennen, Zahlen nicht als „ich habe gehört“ ausgeben.
- Je nach Verwendungszweck Lizenz festlegen, herunterladen, mit
analyzeDauer und Energieverteilung prüfen. - Bei Übergabe Quell-URL, Autor und Lizenz beibehalten; bei Nicht-CC0 die Namensnennung ergänzen.
python3 $S all "short whoosh" --license cc0 -n 10 --urls
python3 $S freesound "paper slide" --license by -n 5 --sort short
python3 $S commons "bell" -n 5 --json
python3 $S mixkit "whoosh" -n 5
python3 $S kenney "impact" -n 5
python3 $S get sfx/ fs:167563 wm:131079817 mk:1489
python3 $S analyze sfx/*.mp3 --loudness --silence --json
Auswahlregeln (basierend auf menschlichen Feedback-Signalen)
- Bewertungsanzahl > Durchschnittsbewertung:
★4,4(380)ist ein stärkerer Beleg als★4,9(6). - Beschreibung des Uploaders am nächsten am Hörbeispiel: „built-in mic“ / „made with my mouth“ bedeutet geringe Wiedergabetreue; Nennung von Rekordern (Zoom, Sound Devices) und konkreten Quellen („Korken einer Weinflasche“) zeigt Kontrollierbarkeit. Passt die beschriebene Quelle nicht zum Bild, wird sie trotz Popularität verworfen.
- Popularität bedeutet nicht Passgenauigkeit: Der meist heruntergeladene „thud“ könnte ein 3-Sekunden-Film-Bassdröhnen sein. Dauer prüfen, mit
analyzeEnergieverteilung und Ausklang messen, dann über Zuschneiden entscheiden. - Erst Kandidaten zeigen, dann herunterladen: Wenn der Benutzer Hörbeispiele möchte,
--urlshinzufügen, nicht eigenmächtig entscheiden. - Verfügbare Signale je nach Quelle unterschiedlich: Freesound hat Downloadzahlen und Bewertungsanzahl; Commons hat echte Dauer und Lizenzfelder; Mixkit hat Dauer aber keine Popularität; Kenney ist ein ganzes Paket. Fehlende Felder nicht als 0 Punkte werten.
Lizenzregeln (streng abgestuft, nicht aufweichen)
| Parameter | Freigabe | Typische Verwendung |
|---|---|---|
--license cc0 | Nur CC0 / PDM | Kommerziell, keine Namensnennung gewünscht |
--license by | CC0 / PDM / BY / BY-SA | Namensnennung akzeptabel (BY-NC, BY-NC-SA, BY-ND bereits ausgeschlossen) |
--license any | Alle, Ergebnis zeigt aber Lizenz an | Nur Kandidaten sichten wollen |
- BY-NC niemals für kommerzielle Nutzung, Skript schließt es unter
cc0/bybereits aus; unteranyselbst prüfen. - Mixkit verwendet eine eigene „Mixkit Free License“ (tatsächlich kommerziell nutzbar ohne Namensnennung), gehört aber nicht zum CC0/BY-Tag-System, daher unter
cc0/byausgeschlossen; bei Bedarf explizit--license anyverwenden und Lizenznamen im Ergebnis angeben. - Bei Nicht-CC0 gibt
getAutor und Lizenzhinweis aus; dies ist nur ein Hinweis, bei Übergabe Quelle und ursprüngliche Lizenz beibehalten. - Kenney ist alles CC0, aber der Download ist ein komplettes Zip-Paket, kein einzelner Soundeffekt, daher selbst entpacken und Datei auswählen.
Aufgabenverteilung der Quellen
| Quelle | Stärke | Einschränkung |
|---|---|---|
| Freesound | Einzige mit Downloadzahl/Bewertungsanzahl | Lädt nur Vorschau-MP3 herunter, nicht Originaldatei; einzelne Verbindung ca. 80 KB/s |
| Wikimedia Commons | Echte Dauer + Lizenzfelder vollständig, Umgebungsaufnahmen/Glocken/lange Audiodateien | Sucht nach Dateibeschreibung, bei ungewöhnlichen Keywords nichts gefunden; keine Popularität |
| Mixkit | Kommerziell nutzbar ohne Namensnennung, UI-Soundeffekte gleichbleibend gut | Seitenstruktur-Analyse; keine Popularität; Dauer als ganze Sekunden angegeben |
| Kenney | CC0 Game-/UI-Soundeffekt-Pakete | Komplettes Zip-Paket, keine einzelne Dauer |
Detaillierte Abrufmethoden und Lizenz-Tag-Zuordnung siehe references/sources.md.
2. BGM: Synthese oder Hintergrund
Zunächst prüfen, ob der Benutzer „Musik haben“ oder „ein zum Gefühl passendes Stück komponieren“ möchte:
| Szenario | Weg | Befehl |
|---|---|---|
| Loopbar, null Abhängigkeiten, kontrollierbare Stimmung, kein Urheberrecht | Offline-Synthese | compose.py |
| Echte Instrumente/Gesang/Umgebungsatmosphäre | Extrahieren für Hintergrund | sfx.py music |
| Bereits kurzes BGM, das auf Videolänge gebracht werden soll | Loopen/Zuschneiden | vocal.py loop / trim |
Offline-Synthese (bevorzugt, entspricht tatsächlich „BGM-Synthese“)
python3 $C bgm.wav --style ambient --duration 30 --bpm 90 --key Am
python3 $C bgm.wav --style lofi --duration 30 --bpm 85 --key C
python3 $C bgm.wav --style upbeat --duration 30 --bpm 120 --key G
ambient: Langsame Pads (Akkordteppich), kein Schlagzeug, geeignet für Kommentare/Produktvorführungen;lofi: Verstimmter Chorus + lockerer Kick/Hat + Bandrauschen;upbeat: Helle kurze Akkorde + Bassdrum-Viertel + Basslinie.- Ausgabe 44,1 kHz / 16-Bit / Stereo-WAV, phasenausgerichtet an Start/Ende + akkordisch ringförmiges Crossfade, nahtlos loopbar.
- Dauer wird auf den nächsten ganzen Takt gerundet (z. B. 30s @ 90 BPM tatsächlich 29,333s); für exakte Sekunden BPM wählen, das durch 4 Schläge teilbar ist (z. B. 120).
- Skript gibt direkt einfügbaren
--bgm-gain-Vorschlag in dB aus, passend zuvocal.py-Parametern, sofort verwendbar. --seedgarantiert identische Ausgabe bei gleichen Parametern, hilfreich für Versionsverwaltung.
Extraktion für Hintergrund
python3 $S music "ambient" --duration long --max-seconds 600 -n 8 --urls --json
python3 $S get bgm/ wm:123456
python3 $V trim bgm/xxx.ogg bed.wav --start 0 --end 30
musicdurchsucht Commons mitfiletype:audio,--duration longsetzt default ≥30 Sekunden, unbekannte Dauer wird default ausgeschlossen (für Freigabe--allow-unknownhinzufügen).- Commons liefert oft stundenlange Feldaufnahmen/Hörbücher; bei Hintergrund zwingend
--max-seconds 600setzen, sonst werden hunderte MB heruntergeladen. - Lange Audiodateien müssen meist mit
trimauf einen Abschnitt gekürzt oder mitloopauf die gewünschte Videolänge gebracht werden.
3. Sprachbereinigung & Mischung
Standardkette
# 1. Sprache: Rauschunterdrückung → Hochpass → (De-Esser) → Kompression → zweistufige Loudness-Normalisierung → Ein-/Ausblenden
python3 $V clean voice.wav clean.wav --deesser
# Standardziel -16 LUFS; für keine Normalisierung --no-loudnorm hinzufügen
# 2. BGM auf Videolänge anpassen (eine von zwei Optionen)
python3 $V loop bgm.wav bed.wav --duration 30 # Kurzes Material auf Länge bringen, nahtloses Crossfade
python3 $V trim bgm.wav bed.wav --start 0 --end 30
# 3. Mischen: BGM automatisch senken, wenn gesprochen wird (Sidechain-Ducking)
python3 $V duck clean.wav bed.wav mixed.wav --bgm-gain -12 --threshold -30 --ratio 8
# Bei keiner Sprache/reiner Atmosphäre statisches Mischen verwenden
python3 $V mix bed.wav clean.wav mixed.wav --bgm-gain -18
# 4. Endprodukt-Lautstärke prüfen / normalisieren
python3 $V report mixed.wav
python3 $V loudnorm mixed.wav final.wav --target-lufs -16
Parameterregeln
| Parameter | Standard | Wann anpassen |
|---|---|---|
--bgm-gain | duck -12 / mix -18 dB | Vorschlag von compose.py verwenden; wenn BGM Sprache überdeckt, um 3–6 dB senken |
--threshold | -30 dB | Sidechain-Schwelle ist Pegelschwelle, keine Spracherkennung; bei sehr leiser Sprache auf -36, bei sehr lautem BGM erhöhen |
--ratio | 8 | Zu auffälliges Ducking/starker Atem-Effekt: auf 4 senken |
--target-lufs | -16 LUFS | Für Sprache/Video -16; für reine Musik-Streaming -14; Podcast bis -16 |
--true-peak | -1,5 dBTP | Bei Plattform mit explizitem Limit entsprechend anpassen |
--fade | duck 0,3 / clean 0,05 s | Für Ein-/Ausblendungen, Loop-Übergänge |
- Maßeinheiten nicht verwechseln:
Iist LUFS (integrierte Lautstärke),TPist dBTP (True Peak),LRAist LU (Loudness Range);mean_volumeist dBFS-Durchschnittspegel,reportkennzeichnet dies deutlich, nicht als LUFS verwenden. duck/mixbeide Pfade ergänzenapad(Stilleauffüllung) und verwendenduration=longest, BGM kürzer als Sprache wird nicht abgeschnitten;--durationkann Endlänge festlegen.cleanzweistufiges Loudnorm läuft nach der gesamten Vorverarbeitungskette und I/TP/LRA des Messteils sind mit dem zweiten Durchlauf identisch; Ein-/Ausblenden erfolgt vor Loudnorm, damit Messsignal und Normalisierungseingabe identisch sind, sonst passenmeasured_*nicht.loudnorminterne Messung kann um ca. 1 LU vonebur128abweichen; Skript führt nach dem Endprodukt Closed-Loop-Prüfung und einmalige Verstärkungskorrektur durch und gibt im Summary „Closed-Loop ±X.X dB“ aus; dies ist für exakte Zielerfüllung notwendig, nicht entfernen.- Bei sehr kurzem/stillem Material ohne messbare LUFS wird automatisch auf einfaches Loudnorm zurückgegriffen und im Output „einfach“ vermerkt; Closed-Loop wird dann übersprungen, um nicht auf Stille Verstärkung zu addieren.
Filterkette-Original, zweistufiges Loudnorm-Prinzip und Parametertabelle siehe references/mixing.md.
4. Häufige Rezepte
A. 30-Sekunden-Produktdemo (vollständig offline, kein Material)
python3 $C bgm.wav --style ambient --duration 30 --bpm 120 --key Am
python3 $V clean voice.wav clean.wav --deesser
python3 $V duck clean.wav bgm.wav mixed.wav --bgm-gain -13
python3 $V loudnorm mixed.wav final.wav --target-lufs -16
python3 $S all "soft whoosh" --license cc0 -n 6 --urls
B. Vorhandene Sprachaufnahme mit echter Atmosphäre unterlegen
python3 $S music "rain ambience" --duration long --max-seconds 600 --license by -n 6 --urls
python3 $S get bgm/ wm:xxx
python3 $V trim bgm/xxx bed.wav --start 10 --end 40
python3 $V clean voice.wav clean.wav
python3 $V duck clean.wav bed.wav mixed.wav --bgm-gain -18
C. Nur einen Übergangssound, kommerziell nutzbar
python3 $S all "paper slide" --license cc0 -n 8 --sort short --urls
python3 $S get sfx/ fs:xxx
python3 $S analyze sfx/*.mp3 --loudness --silence --json
D. Lautstärkehüllkurve, die dem Bild folgt (Remotion-Rendering)
Endprodukt-Mastering mit obiger FFmpeg-Kette; frame-genaue Ein-/Ausblendungen und Takt-Lautstärkeänderungen im Remotion-Rendering durchführen, siehe references/remotion-audio.md.