sound(完全版)
動画に音を付けるための完全なツールチェーン。3 つの機能ラインがあります。
- 効果音の選定 — 複数ソースからの検索、人間のフィードバックシグナルによるフィルタリング、ダウンロード、測定。
- BGM(背景音楽) — 2 つのルート:オフラインでシームレスループ可能な音楽を合成するか、素材ライブラリから長尺オーディオを検索して敷く。
- ボーカルとミキシング — ノイズ低減/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/ に置き換えます。
一、効果音の選定
ワークフロー
- 画面のアクションを英語のキーワードに変換します(「カードが飛び込む」→
short whoosh、「スイッチの切り替え」→soft click)。 allで複数ソースを横断して候補を検索し、必要に応じて単一ソースで補足検索します。--urlsでユーザーに試聴リンクを提供します。- まず画面に合っているかを判断し、次に人気度を確認します。候補と推奨理由を示し、数字を「実際に聴いた」とは捉えないでください。
- 用途に応じてライセンスを決定し、ダウンロードし、
analyzeで長さとエネルギー分布を確認します。 - 納品時には、ソース 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 cc0 | CC0 / PDM のみ | 商用、クレジット不要 |
--license by | CC0 / 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 効果音の品質が安定 | ページ構造の解析が必要。人気度なし。長さは秒単位で表示 |
| Kenney | CC0 のゲーム/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-gain | duck -12 / mix -18 dB | compose.py が出力する推奨値を使用。BGM がボーカルを覆い隠している場合は、さらに 3~6 dB 下げる |
--threshold | -30 dB | サイドチェインのしきい値はレベルしきい値であり、音声検出ではない。ボーカルが非常に小さい場合は -36 に、BGM が非常に大きい場合は上げる |
--ratio | 8 | ダッキングが目立ちすぎる/呼吸感が強い場合は 4 に下げる |
--target-lufs | -16 LUFS | ナレーション/動画は -16。音楽ストリーミングは -14。ポッドキャストは -16 でも可 |
--true-peak | -1.5 dBTP | プラットフォームに明確な上限がある場合は、それに合わせて変更 |
--fade | duck 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 を参照してください。