Communitygithub.com

ruodou233/sound-skill

视频声音全流程技能:从多个免费音源检索/下载音效与 BGM 素材,离线合成可循环背景音乐,清理人声并做侧链闪避混音与响度归一。用于音效选材、背景音乐、配音处理、混音、响度规范等需求。

sound-skill とは?

このスキルは、動画にサウンドを追加するための完全なツールチェーンを提供します。Python 3 と FFmpeg のみを必要とし、サードパーティのパッケージや API キーは不要です。スキルは 3 つの主要な機能ラインで構成されています。まず「効果音素材の選定」では、Freesound、Wikimedia Commons、Mixkit、Kenney などの複数の無料音源からキーワード検索を行い、人間のフィードバックシグナル(評価人数、ダウンロード数など)に基づいて素材をフィルタリングし、ダウンロードおよび分析を行います。次に「BGM(背景音楽)」では、オフラインでループ可能な楽曲を合成する方法と、素材ライブラリから長尺オーディオを検索して敷く方法の 2 つのオプションを提供します。最後に「ボーカル処理とミキシング」では、ノイズ低減、EQ、ディエッサー、コンプレッション、サイドチェインダッキング、ステータスミックス、2 パスのラウドネスノーマライゼーションを実行します。すべての機能は MIT ライセンスの下でオープンソース化されており、自由に変更および配布できます。

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

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

sound(完全版)

動画に音を付けるための完全なツールチェーン。3 つの機能ラインがあります。

  1. 効果音の選定 — 複数ソースからの検索、人間のフィードバックシグナルによるフィルタリング、ダウンロード、測定。
  2. BGM(背景音楽) — 2 つのルート:オフラインでシームレスループ可能な音楽を合成するか、素材ライブラリから長尺オーディオを検索して敷く。
  3. ボーカルとミキシング — ノイズ低減/EQ/歯擦音除去/コンプレッション、サイドチェインダッキング、静的ミックス、2 パスのラウドネスノーマライゼーション。

環境は Python 3 + FFmpeg(ffmpeg / ffprobe が PATH にあること)のみ。純粋な標準ライブラリで、サードパーティパッケージ、API キー、ログインは不要です。

このスキルのすべての機能は、このリポジトリでオープンソース(MIT ライセンス)として実装されています:すべてのコマンド、ルール、パラメータは以下のドキュメントと references/ にあり、自由に変更および配布できます。

インストール後、実際の場所に合わせて変数を設定します。以下はプロジェクト内にインストールした場合の書き方です。

S=.claude/skills/sound/scripts/sfx.py       # 検索 / ダウンロード / 分析
V=.claude/skills/sound/scripts/vocal.py     # ボーカル / ミキシング
C=.claude/skills/sound/scripts/compose.py   # オフラインでの BGM 合成

グローバルインストールの場合は、.claude/skills/sound/ を ~/.claude/skills/sound/ に置き換えます。


一、効果音の選定

ワークフロー

  1. 画面のアクションを英語のキーワードに変換します(「カードが飛び込む」→ short whoosh、「スイッチの切り替え」→ soft click)。
  2. all で複数ソースを横断して候補を検索し、必要に応じて単一ソースで補足検索します。--urls でユーザーに試聴リンクを提供します。
  3. まず画面に合っているかを判断し、次に人気度を確認します。候補と推奨理由を示し、数字を「実際に聴いた」とは捉えないでください。
  4. 用途に応じてライセンスを決定し、ダウンロードし、analyze で長さとエネルギー分布を確認します。
  5. 納品時には、ソース URL、作者、ライセンスを保持します。CC0 以外のものにはクレジットを追加します。
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

選材ルール(人間のフィードバックシグナルを踏襲)

  • 評価人数 > 平均点:★4.4(380) は ★4.9(6) よりも強力な証拠です。
  • アップロード者の説明が試聴に最も近い:「内蔵マイク」/「口で鳴らした」といった記述はローファイを意味します。レコーダー(Zoom、Sound Devices)や明確な音源(「ワインのコルク」)への言及は制御されていることを示します。説明にある音源が画面と一致しない場合、どんなに人気があっても採用しません。
  • 人気度は適合性とイコールではない:ダウンロード数が最も多い「thud」が、3 秒の映画のような低音の轟音である可能性があります。長さを必ず確認し、analyze でエネルギーがどこにあるか、テールがどのくらいかを確認し、トリミングするかどうかを決定します。
  • 先に候補を提示し、その後ダウンロード:ユーザーが試聴を希望する場合は --urls を追加し、代わりに決定しないでください。
  • 利用可能なシグナルはソースによって異なる:Freesound にはダウンロード数と評価人数があります。Commons には実際の長さとライセンスがあります。Mixkit には長さはありますが人気度はありません。Kenney はパッケージ全体の素材です。欠落しているフィールドを 0 点とみなさないでください。

ライセンスルール(厳密に段階分け、緩めないこと)

パラメータ許可典型的な用途
--license cc0CC0 / PDM のみ商用、クレジット不要
--license byCC0 / PDM / BY / BY-SAクレジット受諾可能(BY-NC、BY-NC-SA、BY-ND は除外済み)
--license anyすべて、ただし結果にはライセンスを表示とりあえず候補を見たい場合
  • BY-NC は常に商用利用不可で、スクリプトは cc0/by ではすでに除外されています。any の場合は自分で判断する必要があります。
  • Mixkit は独自の「Mixkit Free License」(実際には商用利用可能でクレジット不要)を使用していますが、CC0/BY タグ体系に属さないため、cc0/by では除外されます。必要な場合は明示的に --license any を使用し、納品物にライセンス名を明記してください。
  • 非 CC0 素材の get では作者とライセンスの注意事項が表示されます。これは参考情報であり、納品時にはソースとライセンス原文を保持する必要があります。
  • Kenney はすべて CC0 ですが、ダウンロードされるのはパッケージ全体の zip ファイルであり、個々の効果音ではありません。自分で解凍してファイルを選択する必要があります。

音源の役割分担

ソース強み制限
Freesoundダウンロード数/評価人数がある唯一のソースプレビュー MP3 のみダウンロード可能、元ファイルは不可。単一接続で約 80 KB/s
Wikimedia Commons実際の長さ + ライセンスフィールドが充実。環境音/鐘/長尺オーディオファイルの説明に基づくマッチングのため、キーワードが特殊だと検索されない。人気度なし
Mixkit商用利用でクレジット不要。UI 効果音の品質が安定ページ構造の解析が必要。人気度なし。長さは秒単位で表示
KenneyCC0 のゲーム/UI 効果音パッケージパッケージ全体の zip、個別の長さなし

詳細な取得方法とライセンスタグのマッピングについては references/sources.md を参照してください。


二、BGM:合成または敷き込み

まずユーザーが求めているのは「音楽があること」なのか、それとも「雰囲気に合った曲を当てること」なのかを判断します。

シナリオルートコマンド
ループ可能、依存関係なし、雰囲気制御可能、著作権リスクなしオフライン合成compose.py
実際の楽器/ボーカル/環境音が必要検索して敷き込みsfx.py music
短い BGM はあるが、画面全体に敷き詰めたいループ/トリミングvocal.py loop / trim

オフライン合成(推奨、真の「BGM 合成」)

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:ゆっくりとしたパッド(敷き込みコード)、ドラムなし。ナレーション/製品デモに最適。lofi:デチューンドコーラス + ゆるいキック/ハット + テープノイズ。upbeat:明るい短いコード + 4 つ打ちキック + ベースライン。
  • 出力は 44.1 kHz / 16-bit / ステレオ WAV で、先頭と末尾の位相が揃い、コードがクロスフェードでループするため、シームレスにループできます。
  • 長さは最も近い小節数に揃えられます(例:30 秒 @ 90 BPM は実際には 29.333 秒)。正確な秒数が必要な場合は、4 拍で割り切れる BPM(例:120)を使用してください。
  • スクリプトは、vocal.py のパラメータと一致する、直接貼り付け可能な --bgm-gain 推奨値(単位 dB) を出力するので、そのまま使用できます。
  • --seed を使用すると、同じパラメータで完全に同一の出力が保証されるため、バージョン管理に役立ちます。

検索して敷き込み

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 は Commons の filetype:audio を検索します。--duration long はデフォルトで 30 秒以上を対象とし、長さ不明のものはデフォルトで除外します(許可する場合は --allow-unknown を追加)。
  • Commons は時間単位のフィールドレコーディングやオーディオブックを返すことが多いため、敷き込みの際は必ず --max-seconds 600 を追加してください。追加しないと数百 MB をダウンロードすることになります。
  • 長尺オーディオをダウンロードした後は、通常 trim で一部を切り出すか、loop で短いセクションを画面の長さまで敷き詰めます。

三、ボーカル処理とミキシング

標準的なチェーン

# 1. ボーカル:ノイズ低減 → ハイパス → (歯擦音除去) → コンプレッション → 2 パスラウドネスノーマライゼーション → フェードイン/アウト
python3 $V clean voice.wav clean.wav --deesser
#    デフォルトターゲット -16 LUFS。ノーマライゼーションを行わない場合は --no-loudnorm を追加

# 2. BGM を画面の長さに合わせる(どちらかを選択)
python3 $V loop  bgm.wav  bed.wav  --duration 30     # 短い素材を敷き詰める、継ぎ目は真のクロスフェード
python3 $V trim  bgm.wav  bed.wav  --start 0 --end 30

# 3. ミックス:話しているときに自動的に BGM を下げる(サイドチェインダッキング)
python3 $V duck clean.wav bed.wav mixed.wav --bgm-gain -12 --threshold -30 --ratio 8
#    ボーカルなし/純粋な雰囲気の場合は静的ミックスに変更
python3 $V mix  bed.wav clean.wav mixed.wav --bgm-gain -18

# 4. 最終的なラウドネスの確認 / ノーマライゼーション
python3 $V report mixed.wav
python3 $V loudnorm mixed.wav final.wav --target-lufs -16

パラメータルール

パラメータデフォルト調整時期
--bgm-gainduck -12 / mix -18 dBcompose.py が出力する推奨値を使用。BGM がボーカルを覆い隠している場合は、さらに 3~6 dB 下げる
--threshold-30 dBサイドチェインのしきい値はレベルしきい値であり、音声検出ではない。ボーカルが非常に小さい場合は -36 に、BGM が非常に大きい場合は上げる
--ratio8ダッキングが目立ちすぎる/呼吸感が強い場合は 4 に下げる
--target-lufs-16 LUFSナレーション/動画は -16。音楽ストリーミングは -14。ポッドキャストは -16 でも可
--true-peak-1.5 dBTPプラットフォームに明確な上限がある場合は、それに合わせて変更
--fadeduck 0.3 / clean 0.05 秒先頭/末尾、ループの継ぎ目
  • 次元を混同しないこと:I は LUFS(統合ラウドネス)、TP は dBTP(トゥルーピーク)、LRA は LU(ラウドネスレンジ)。mean_volume は dBFS の平均レベルであり、report で明確にラベル付けされているため、これを LUFS とみなさないでください。
  • duck / mix の両方のパスは apad(無音補完)で補完され、duration=longest が使用されるため、BGM がボーカルより短くてもクリップされることはありません。--duration で最終的な長さを指定できます。
  • clean の 2 パス loudnorm 測定は、すべてのプリチェーン処理の後に実行され、測定パスの I/TP/LRA は 2 パス目と完全に一致します。フェードイン/アウトは loudnorm の前に行われ、測定信号とノーマライゼーションへの入力が同じであることを保証します。そうしないと measured_* が一致しなくなります。
  • loudnorm の内部測定口径は ebur128 と約 1 LU 異なる場合があります。スクリプトは最終処理後にクローズドループで再確認し、ゲインを補正し、サマリーに「クローズドループ補正 ±X.X dB」を出力します。これは正確なターゲット達成に必要な手順であり、削除しないでください。
  • 非常に短い/無音に近い素材では有効な LUFS を測定できない場合、自動的にシングルパス loudnorm にダウングレードし、出力に「シングルパス」と明記します。この場合、クローズドループは自動的にスキップされ、無音に対してゲインを過剰に追加することはありません。

フィルターチェーンの詳細、2 パス loudnorm の原理、パラメータ調整テーブルについては references/mixing.md を参照してください。


四、よく使うレシピ

A. 30 秒の製品デモ(完全オフライン、素材ゼロ)

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. 既存のナレーションにリアルな雰囲気を敷き込む

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. トランジション効果音が 1 つ欲しい、かつ商用利用可能なもの

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. 画面に合わせた音量エンベロープ(Remotion レンダリング)

最終的なマスタリングは上記の FFmpeg チェーンを使用します。フレームごとのフェードイン/アウトやビートに合わせた音量変更は Remotion レンダリング時に行います。references/remotion-audio.md を参照してください。


関連スキル