Communitygithub.com

sound (Vollversion)

Vollständige Toolkette für Video-Audio: Suche/Download von Soundeffekten und BGM aus mehreren kostenlosen Quellen, Offline-Synthese von nahtlos loopbarer Hintergrundmusik, Sprachbereinigung, Sidechain-Ducking und Loudness-Normalisierung.

Was ist sound (Vollversion)?

Dieses Skill bietet eine komplette, lokale Pipeline zur Audiogestaltung für Videos. Es umfasst drei Hauptfunktionen: (1) **Soundeffekt-Auswahl**: Durchsucht mehrere kostenlose Quellen (Freesound, Wikimedia Commons, Mixkit, Kenney) parallel, filtert nach menschlichen Feedback-Signalen (Bewertungen, Downloadzahlen) und Lizenzen, misst Dauer/Lautstärke und lädt herunter. (2) **Hintergrundmusik (BGM)**: Zwei Wege – entweder **offline synthetisieren** (nahtlos loopbare Musik in Stilen wie Ambient, Lofi, Upbeat; vollständig deterministisch dank Seed) oder aus langen Commons-Audiodateien **extrahieren** und trimmen/loopen. (3) **Sprachbereinigung & Mischung**: Rauschunterdrückung, De-Esser, Kompression, zweistufige Loudness-Normalisierung (ITU-R BS.1770), Sidechain-Ducking und statisches Mischen – alles mit automatischer Closed-Loop-Korrektur für exakte Ziel-Loudness. Das Skill arbeitet komplett offline mit nur Python 3 und FFmpeg, benötigt kein Internet, keine API-Keys und keine Anmeldung. Es ist für Claude Code, Cursor und andere AI-Agenten konzipiert und unter MIT-Lizenz quelloffen.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ruodou233/sound-skill/tree/HEAD

In Ihrer bevorzugten KI fragen

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

Dokumentation

Was macht sound (Vollversion)?

Vollständige Toolkette für Video-Audio, drei Fähigkeitslinien:

  1. Soundeffekt-Auswahl – Mehrquellensuche, Filterung nach menschlichen Feedback-Signalen, Download, Messung.
  2. BGM (Hintergrundmusik) – Zwei Wege: Offline-Synthese nahtlos loopbarer Musik oder Extraktion langer Audiospuren aus der Materialdatenbank.
  3. 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

  1. Bildschirmaktionen in englische Schlüsselwörter übersetzen („Karte fliegt ein“ → short whoosh, „Schalter umlegen“ → soft click).
  2. all quellenübergreifend nach Kandidaten suchen, bei Bedarf einzelne Quelle ergänzen; --urls für Hörbeispiele an den Benutzer.
  3. 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.
  4. Je nach Verwendungszweck Lizenz festlegen, herunterladen, mit analyze Dauer und Energieverteilung prüfen.
  5. 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 analyze Energieverteilung und Ausklang messen, dann über Zuschneiden entscheiden.
  • Erst Kandidaten zeigen, dann herunterladen: Wenn der Benutzer Hörbeispiele möchte, --urls hinzufü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)

ParameterFreigabeTypische Verwendung
--license cc0Nur CC0 / PDMKommerziell, keine Namensnennung gewünscht
--license byCC0 / PDM / BY / BY-SANamensnennung akzeptabel (BY-NC, BY-NC-SA, BY-ND bereits ausgeschlossen)
--license anyAlle, Ergebnis zeigt aber Lizenz anNur Kandidaten sichten wollen
  • BY-NC niemals für kommerzielle Nutzung, Skript schließt es unter cc0/by bereits aus; unter any selbst 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/by ausgeschlossen; bei Bedarf explizit --license any verwenden und Lizenznamen im Ergebnis angeben.
  • Bei Nicht-CC0 gibt get Autor 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

QuelleStärkeEinschränkung
FreesoundEinzige mit Downloadzahl/BewertungsanzahlLädt nur Vorschau-MP3 herunter, nicht Originaldatei; einzelne Verbindung ca. 80 KB/s
Wikimedia CommonsEchte Dauer + Lizenzfelder vollständig, Umgebungsaufnahmen/Glocken/lange AudiodateienSucht nach Dateibeschreibung, bei ungewöhnlichen Keywords nichts gefunden; keine Popularität
MixkitKommerziell nutzbar ohne Namensnennung, UI-Soundeffekte gleichbleibend gutSeitenstruktur-Analyse; keine Popularität; Dauer als ganze Sekunden angegeben
KenneyCC0 Game-/UI-Soundeffekt-PaketeKomplettes 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:

SzenarioWegBefehl
Loopbar, null Abhängigkeiten, kontrollierbare Stimmung, kein UrheberrechtOffline-Synthesecompose.py
Echte Instrumente/Gesang/UmgebungsatmosphäreExtrahieren für Hintergrundsfx.py music
Bereits kurzes BGM, das auf Videolänge gebracht werden sollLoopen/Zuschneidenvocal.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 zu vocal.py-Parametern, sofort verwendbar.
  • --seed garantiert 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
  • music durchsucht Commons mit filetype:audio, --duration long setzt default ≥30 Sekunden, unbekannte Dauer wird default ausgeschlossen (für Freigabe --allow-unknown hinzufügen).
  • Commons liefert oft stundenlange Feldaufnahmen/Hörbücher; bei Hintergrund zwingend --max-seconds 600 setzen, sonst werden hunderte MB heruntergeladen.
  • Lange Audiodateien müssen meist mit trim auf einen Abschnitt gekürzt oder mit loop auf 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

ParameterStandardWann anpassen
--bgm-gainduck -12 / mix -18 dBVorschlag von compose.py verwenden; wenn BGM Sprache überdeckt, um 3–6 dB senken
--threshold-30 dBSidechain-Schwelle ist Pegelschwelle, keine Spracherkennung; bei sehr leiser Sprache auf -36, bei sehr lautem BGM erhöhen
--ratio8Zu auffälliges Ducking/starker Atem-Effekt: auf 4 senken
--target-lufs-16 LUFSFür Sprache/Video -16; für reine Musik-Streaming -14; Podcast bis -16
--true-peak-1,5 dBTPBei Plattform mit explizitem Limit entsprechend anpassen
--fadeduck 0,3 / clean 0,05 sFür Ein-/Ausblendungen, Loop-Übergänge
  • Maßeinheiten nicht verwechseln: I ist LUFS (integrierte Lautstärke), TP ist dBTP (True Peak), LRA ist LU (Loudness Range); mean_volume ist dBFS-Durchschnittspegel, report kennzeichnet dies deutlich, nicht als LUFS verwenden.
  • duck / mix beide Pfade ergänzen apad (Stilleauffüllung) und verwenden duration=longest, BGM kürzer als Sprache wird nicht abgeschnitten; --duration kann Endlänge festlegen.
  • clean zweistufiges 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 passen measured_* nicht.
  • loudnorm interne Messung kann um ca. 1 LU von ebur128 abweichen; 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.

Verwandte Skills