mcpField
S
sound-design

sound-design

github.com/whaleyxbtクリエイティブ・メディア713145 回インストール3 週間前に更新
リポジトリ

sound-design について

sound-design は、モーショングラフィックス向けの効果音を設計する Python ツール群です。画面のタイムラインに音を同期させたい制作者向けに、標準ライブラリでの合成、ミキシング、ラウドネス調整、WAV 出力を提供します。

主な機能

  1. 01Python 標準ライブラリで効果音を合成
  2. 02タイムライン上で音を配置・ミックス
  3. 03ラウドネスを自動マスタリング
  4. 04WAV ファイルを出力
  5. 05複数の効果音ジェネレーター

活用シーン

  1. 01アニメーション文字や UI 動作への効果音追加
  2. 02動画タイムラインに同期した音声制作
  3. 03短い効果音のミックスと音量調整

MCP 対応

README では、合成できない音やナレーションの生成に ElevenLabs MCP を任意で利用し、ファイルを public/ に保存すると説明されています。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/whaleyxbt/claude-motion --skill sound-design

インストール後、Claude Code で/sound-designを入力して読み込まれたか確認します。

詳細

サウンドデザイン

AI が作成したモーショングラフィックスの多くは無音です。作品を完成度の高いものに感じさせるのはサウンドです。

sfx/ エンジンは、純粋な Python 標準ライブラリだけですべてのサウンドを合成します。サンプルもライセンスもインストールも不要で、実行するたびに同じ出力が得られます。映像と同じタイムライン JSON を読み込むため、サウンドが映像とずれることはありません。

構成

ファイル役割
sfx/synth.pyジェネレーター:それぞれが 48 kHz のモノラルサンプルを返します
sfx/mix.pyMix:サウンドを時間軸上に配置し、目標ラウドネスにマスタリングして、WAV を書き出します
sfx/loudness.pyBS.1770 統合ラウドネス(ffmpeg の ebur128 と一致します)
sfx/cues/<video>.pyキューシート:1 本の動画のサウンドデザインです
python3 -m sfx --list                   # generators with what each is for
python3 -m sfx sfx/cues/<video>.py      # render → mastered WAV

新しい動画のキューシートを作成する

sfx/cues/<video>.py を作成します。

from sfx.synth import click, pop, whoosh, chime, riser, impact

TIMELINE = "timeline.json"      # the same file the composition reads
OUT = "public/sfx.wav"
TARGET_LUFS = -14.0             # optional, this is the default

def score(mix, tl):
    s1 = tl["s1"]
    mix.put(s1["title"], whoosh(0.4, 500, 2400, peak=0.45), 0.12)
    for i, t in enumerate(s1["items"]):
        mix.put(t, pop(900 + i * 150, 400), 0.3, pan=-0.4 + i * 0.3)
  • mix.put(t, samples, gain, pan):t は必ず tl から取得し、数値を直接入力しないでください。ビートからのオフセット(s1["exit"] + 0.05)は問題ありません。
  • mix.typing(start, end, chars):文字ごとに、人間らしいばらつきを加えたキーストロークを 1 回鳴らします。
  • mix.put_stereo(t, left, right, gain):pad() などのステレオソースに使います。
  • マスタリングは自動です。エンジンがソフトクリップを適用し、ゲインを調整して TARGET_LUFS に合わせます。その際、トゥルーピークが −2 dBFS 以下になる範囲でのみドライブを上げます(AAC のオーバーシュートに備えて余裕を設けることで、MP4 が −1 dBTP 未満に収まります)。短いヒット音がほとんどで、間に無音があるミックスは、音をつぶさずに −14 に到達できません。その場合、エンジンは音量を下げて、その旨を通知します。無理に音量を上げるのではなく、持続音(パッドや長めの余韻)を加えて調整してください。
  • package.json に新しいキューシートを指定する "sfx" スクリプトを追加するか、直接実行します。

sfx/cues/effort.py は、パッドベッドを含む 128 個のサウンドを使った、完全な実例です。

映像イベント → サウンド

画面上の動きジェネレーター備考
タイピングmix.typing()±4〜6 ms の揺らぎ、ゲインをランダムに設定
単語/行の表示whoosh() +表示時に blip()短く、軽やか
バッジ、チップ、コールアウトの出現pop()連続する音で音程を上げます
コントロールが段階にスナップキー音に click() + blip()
スケッチ/描画scratch()
盛り上がりriser()ヒット音と正確に終わるようにします。1 本の動画につき大きなライザーは 1 つまでです
成功/到達chime()キーに合ったコード
メインのトランジション入りに whoosh()、ヒット時に impact()1 本の動画につきインパクト音は 1 つまでです
全体に敷く音envelope() を使った pad()メインのトランジション中は音量を下げます

ナレーションではなく、アクセントとして使いましょう。すべての動きにサウンドが必要なわけではありません。ドリフト、粒子、回転などの連続的な動きは無音にします。

音量と定位

  • メインのヒット音:ゲイン 0.25〜0.35。補助音:0.08〜0.2。パッド:約 0.03。メインのトランジション中は約 65%音量を下げます。
  • パンは画面上の位置に合わせます(−1 が左、+1 が右)。連続する音はステレオフィールドを横切るように移動させます。
  • キーを 1 つ選び、すべての音程のあるサウンドをそのキーに合わせます。進行に合わせて音程を上げ、見せ場で解決させます。(effort の例ではパッドとスライダーの音は D メジャーですが、シーン 3 のポップ音とチャイムは C メジャーのままです。この例をそのまま使わないでください。)

ジェネレーターを追加する

sfx/synth.py に、SR のサンプルレートで浮動小数点数のリストを返す関数を記述します。最初の docstring 行に用途を書いてください。--list に表示されます。レンダーの再現性を保つため、ノイズにはモジュールレベルの random を使います。軽やかな音を作る場合は bandnoise() を基にしてください。

検証

npm run sfx                              # or python3 -m sfx sfx/cues/<video>.py
npm run wave                             # out/wave.png + loudness of the WAV
npm run build
node scripts/wave.mjs out/effort.mp4     # loudness of what you'll actually post

out/wave.png では、コーラル色の線がすべてタイムライン上のビートを示します。それぞれのトランジェントは、線上か、線をわずかに過ぎた位置にある必要があります。線の間にヒット音がある場合は、時間がハードコードされているか、WAV が古い可能性があります。独自のタイムラインファイルを持つ動画では --timeline を指定してください。

オプション:生成音声

ボイスオーバーや合成できないサウンドには、ElevenLabs MCP(.mcp.json.example を参照)を使って public/ にファイルを生成できます。<Sequence from={beat * FPS}> の中に <Audio src={staticFile(...)} /> を配置してください。

コメント