sound-design について
sound-design は、モーショングラフィックス向けの効果音を設計する Python ツール群です。画面のタイムラインに音を同期させたい制作者向けに、標準ライブラリでの合成、ミキシング、ラウドネス調整、WAV 出力を提供します。
主な機能
- 01Python 標準ライブラリで効果音を合成
- 02タイムライン上で音を配置・ミックス
- 03ラウドネスを自動マスタリング
- 04WAV ファイルを出力
- 05複数の効果音ジェネレーター
活用シーン
- 01アニメーション文字や UI 動作への効果音追加
- 02動画タイムラインに同期した音声制作
- 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.py | Mix:サウンドを時間軸上に配置し、目標ラウドネスにマスタリングして、WAV を書き出します |
sfx/loudness.py | BS.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(...)} /> を配置してください。