32blogby Studio Mitsu

fqmpeg 創造的な音声エフェクト:リバーブ・エコー・コーラスほか(9 動詞)

fqmpeg の創造系音声 9 動詞 — reverb / echo / chorus / phaser / flanger / tremolo / vibrato / karaoke / stereo widen。ソース実読でのデフォルト値、--dry-run の実出力、固定値が何で・なぜ固定されているのかを正直に解説。

by omitsu24 min read
目次

fqmpeg の C10 クラスタはエフェクター・ペダルの箱 — 音を整えるのではなく色づける 9 動詞だ。時間系エコー 2 つ(reverbecho-effect)、LFO モジュレーション 5 つ(chorusphaserflangertremolovibrato)、ステレオ操作 2 つ(audio-karaokeaudio-stereo-widen)。

C9 のダイナミクス/EQ と比べて C10 は規模も小さく実装も短いが、どの動詞も多パラメータの FFmpeg フィルタを 2〜3 個のオプション面に圧縮している。本記事は fqmpeg 3.0.3src/commands/ を実読し、何がハードコードされていて、なぜそうしているのかを正直に書く。妥当なハードコーディング(CLI で晒すと自分の足を撃つだけの DSP 係数を隠す)もあれば、レンダリングの前に知っておくべき制約もある。

本記事で得られるもの

  • 音響的効果(時間系 / モジュレーション / ステレオ)別の 9 動詞の判断マトリクス
  • 各動詞が生成する正確な FFmpeg 呼び出し(--dry-run で実検証)
  • デフォルト値、単位、出力ファイル名 — 加えて fqmpeg が固定しているフィルタ係数
  • 3 つのレシピ(ボーカル温め、ロー fi ギター、AM ラジオ風ダイアログ)と、簡略化された面では足りない場合の脱出口

9 動詞の一覧

9 動詞すべて -c:v copy で映像を維持する — 動画ファイルを入れれば、同じ映像と処理済み音声が出てくる。

グループ動詞何をするか
時間系reverbecho-effectaecho による遅延・反射シミュレーション
モジュレーションchorusphaserflangertremolovibratoLFO 駆動のピッチ / 時間 / 振幅変調
ステレオaudio-karaokeaudio-stereo-widenセンター除去、Haas 風ワイドニング

読み始める前の 5 つ:

  1. reverb は真のリバーブではない。 in_gain=0.8out_gain=0.88 がハードコードされた1 タップaecho フィルタ。真のリバーブ(インパルス応答畳み込みや Schroeder ネットワーク)には afirfreeverb フィルタが必要 — それは生 FFmpeg に降りる。ここでの reverb は「ちょっと部屋鳴り」程度で、大聖堂ではない。
  2. chorus は 3 ボイスのプリセットを積んでいて、設定不可。 ボイスの遅延 50|60|70 ms と decay 0.4|0.32|0.28 がハードコード。公開オプションはモジュレーション depth と speed のみ。理由: 良い chorus はボイス間隔の直感が必要で、6 パラメータすべてを CLI に晒すと「壊れた音」になる設定を呼びかねない。カスタム多ボイスが必要なら、FFmpeg の chorus フィルタを直接叩く(最大 32 ボイスまで取れる)。
  3. flanger --mix は内部で width に変換される。 FFmpeg の flanger は wet/dry を width=0-100 で表すが、慣習的な mix=0.0-1.0 を fqmpeg は受け付けて 100 倍してから渡す。だから --mix 0.7width=70 になる。これは B7 のバグ修正で、旧 fqmpeg は mix= をそのまま渡してフィルタに無視されていた。
  4. tremolovibrato はオプション面が完全に同じだが、効果は全然違う。 Tremolo は音量を LFO で変調する。Vibrato はピッチを LFO でずらす。同じ --freq / --depth、同じデフォルト(5 Hz, 0.5)、同じレンジ — だが互いに代用にはならない。
  5. audio-karaoke は完全センター・ドライなボーカルにしか効かない。 フィルタは古典的な pan=stereo|c0=c0-c1|c1=c1-c0 位相相殺。ボーカルが両チャンネルに同じパンで入っていて、ボーカルバスに広がりや reverb や chorus がかかっていない前提。現代のポップ・ミックスはこの 3 つすべてを破る。残響アーティファクトを覚悟すること。

時間系:リバーブとエコー

両動詞は同じ FFmpeg フィルタ(aecho)を使う — 違いは設定だ。reverb は短い 1 タップ(典型的に 40 ms)をアンビエンスとして使う。echo-effect は減衰する繰り返しの連なりを音楽的効果として使う。

reverb — 音声にリバーブ風アンビエンスを追加

リバーブを装った 1 タップ・エコー。空間感の微増には使えるが、ホール・エミュレーションには向かない。

  • ソース: src/commands/reverb.js
  • フィルタ: aecho=0.8:0.88:<delay>:<decay>
  • 出力: <input-stem>-reverb.<ext>
オプションデフォルト注記
--delay <ms>40dry と wet タップの間の遅延
--decay <n>0.5減衰係数(0.0-1.0)
-o, --output <path><input-stem>-reverb.<ext>
bash
$ npx fqmpeg reverb input.mp4 --dry-run

  ffmpeg -i input.mp4 -af aecho=0.8:0.88:40:0.5 -c:v copy input-reverb.mp4

何が固定で、なぜか: in_gain=0.8out_gain=0.88aecho フィルタ文字列内に固定で書き込まれている。これは dry/wet の減衰 — エコーの性格ではなくソースに対する音量バランスを決めるパラメータ。fqmpeg のチョイスは典型的な入力でクリップしない安全な中間ブレンドだ。

この機能で足りなくなったら: 真のリバーブは複数の非相関遅延線(Schroeder ネットワーク)かインパルス応答畳み込み。説得力あるホール/プレート音には freeverb (FFmpeg ビルドにあれば) か afir をインパルス応答 WAV と組み合わせて使う:

bash
ffmpeg -i input.mp4 -i hall_ir.wav -filter_complex "[0:a][1:a]afir=dry=10:wet=10[a]" \
  -map 0:v -map "[a]" -c:v copy hall-reverb.mp4

echo-effect — 複数タップの遅延・エコーを追加

エコーの幾何級数チェーンを生成する: delay、2×delay、3×delay、... 各タップは decay^i の係数で前より小さくなる。

  • ソース: src/commands/echo-effect.js
  • フィルタ: aecho=0.8:0.88:<d>|<2d>|<3d>...:<c>|<c²>|<c³>...
  • 出力: <input-stem>-echo.<ext>
オプションデフォルト注記
--delay <ms>500ベース遅延。続くタップは 2×、3×、...
--decay <n>0.3減衰係数。続くタップは幾何級数的に減衰
--repeats <n>3エコータップ数
-o, --output <path><input-stem>-echo.<ext>
bash
$ npx fqmpeg echo-effect input.mp4 --dry-run

  ffmpeg -i input.mp4 -af aecho=0.8:0.88:500|1000|1500:0.300|0.090|0.027 -c:v copy input-echo.mp4

何が固定で、なぜか: reverb と同じく in_gain/out_gain0.8:0.88 固定。マルチタップ構造のほうは「自分の足を撃つ意味での固定」ではなく、反射面が 1 つでエネルギーが反射のたびに失われる物理モデルそのもの(タップ idecay^i)。タップごとの遅延・減衰を個別に晒すと病的なコムフィルタを組めてしまうので、fqmpeg は両者を連動させている。

この機能で足りなくなったら: 不規則なタップ間隔(スラップバックから長いテール、ステレオ ping-pong など)が欲しいなら aecho| 区切りリストで直接叩くか、正確な msec オフセットには adelay を使う:

bash
ffmpeg -i input.mp3 -af "aecho=0.8:0.9:60|300|800:0.5|0.3|0.15" out.mp3

モジュレーション・エフェクト

5 つのモジュレーション動詞はすべて低周波発振器(LFO)で信号の性質を時間的に変化させる。共通のメンタルモデル: speed(LFO が 1 周する速さ、Hz)と depth(変化量)を選ぶ。

chorus — コーラス/音の厚みを追加

dry 信号の上に微妙にデチューン・遅延された 3 コピーを重ねる。複数演奏者が同じフレーズを弾いているような音になる。

  • ソース: src/commands/chorus.js
  • フィルタ: chorus=0.5:0.9:50|60|70:0.4|0.32|0.28:<depth>|<depth>|<depth>:<speed>|<speed>|<speed>
  • 出力: <input-stem>-chorus.<ext>
オプションデフォルト注記
--depth <ms>2モジュレーション深度(3 ボイスすべてに同じ値を適用)
--speed <Hz>0.5モジュレーション速度(3 ボイスすべてに同じ値を適用)
-o, --output <path><input-stem>-chorus.<ext>
bash
$ npx fqmpeg chorus input.mp4 --dry-run

  ffmpeg -i input.mp4 -af chorus=0.5:0.9:50|60|70:0.4|0.32|0.28:2|2|2:0.5|0.5|0.5 -c:v copy input-chorus.mp4

何が固定で、なぜか: かなり多い。3 ボイス構成は固定: ボイスごとの遅延 50|60|70 ms、decay 0.4|0.32|0.28、in/out gain 0.5:0.9--depth--speed だけが公開されていて、両方とも 3 ボイスすべてに同じ値で適用される。

これは意図的なプリセット判断だ。良い chorus はボイス間の広がりに依存する — 3 つすべてが同じ遅延だと、chorus ではなく単に厚いエコーになる。遅延が近すぎる(例 50|51|52)とコムフィルタみたいな音になる。fqmpeg のプリセット(50|60|70 ms と降順 decay)は「温かいポップ・コーラス」で、ボーカル・エレキギター・シンセパッドで機能する。広いステレオ展開のエセリアルなパッドは出ない — それには異なるボイス間隔と異なるボイスごとのモジュレーション速度が必要だ。

この機能で足りなくなったら: chorus フィルタを直接呼ぶ。任意のボイス数を | 区切りで受ける:

bash
ffmpeg -i input.wav -af "chorus=0.6:0.9:30|45|60|80:0.3|0.25|0.2|0.15:1.5|2|2.5|3:0.3|0.4|0.5|0.6" wide-chorus.wav

phaser — フェイザー・スイープを適用

信号と位相シフトされたコピーを合成し、古典的な「ウォーン」というスイープを作る。

  • ソース: src/commands/phaser.js
  • フィルタ: aphaser=speed=<speed>:decay=<decay>
  • 出力: <input-stem>-phaser.<ext>
オプションデフォルト注記
--speed <Hz>0.5LFO 速度
--decay <n>0.4減衰係数(0.0-1.0)。フィードバックの強さを決める
-o, --output <path><input-stem>-phaser.<ext>
bash
$ npx fqmpeg phaser input.mp4 --dry-run

  ffmpeg -i input.mp4 -af aphaser=speed=0.5:decay=0.4 -c:v copy input-phaser.mp4

FFmpeg の aphaser フィルタには他にも in_gainout_gaindelaytype(正弦波 vs 三角波 LFO)があり、fqmpeg はフィルタのデフォルトに任せている — 三角波スイープや別の段数が欲しければ、生 aphaser=... に直接渡す。

flanger — フランジャーを適用

phaser に似るが、はるかに短く変調する遅延を使う — 70 年代末ロックで聞いた金属的な「ジェットエンジン」スイープになる。

  • ソース: src/commands/flanger.js
  • フィルタ: flanger=speed=<speed>:depth=<depth>:width=<mix×100>
  • 出力: <input-stem>-flanger.<ext>
オプションデフォルト注記
--speed <Hz>0.5LFO 速度
--depth <ms>2モジュレーション深度
--mix <n>0.7dry/wet mix(0.0-1.0)。fqmpeg が内部で 100 倍する
-o, --output <path><input-stem>-flanger.<ext>
bash
$ npx fqmpeg flanger input.mp4 --dry-run

  ffmpeg -i input.mp4 -af flanger=speed=0.5:depth=2:width=70 -c:v copy input-flanger.mp4

--mixwidth のマッピング: FFmpeg の flanger フィルタは wet/dry パラメータを width と呼び、0-100 を取る。fqmpeg は慣習的な --mix 0.0-1.0 を受けてサイレントに 100 倍する。これは 3.0 のバグ修正 — 旧 fqmpeg は mix=0.7 をそのままフィルタに渡し、フィルタは無視してデフォルト(100% wet = 過剰)で動いていた。--dry-run--mix 0.7width=70 を生むことを確認できる。

tremolo — トレモロ(音量振動)を適用

LFO で出力音量を変調する。古典的なサーフ・ロック・ギターアンプ・エフェクト。

オプションデフォルト注記
--freq <Hz>5LFO 周波数
--depth <n>0.5モジュレーション深度(0-1)。大きいほど音量のうねりが顕著
-o, --output <path><input-stem>-tremolo.<ext>
bash
$ npx fqmpeg tremolo input.mp4 --dry-run

  ffmpeg -i input.mp4 -af tremolo=f=5:d=0.5 -c:v copy input-tremolo.mp4

vibrato — ビブラート(ピッチ振動)を適用

LFO でピッチ(音量ではない)を変調する。tremolo と同じオプション面なので混同に注意。

オプションデフォルト注記
--freq <Hz>5LFO 周波数
--depth <n>0.5モジュレーション深度(0-1)。大きいほどピッチの振れ幅が広がる
-o, --output <path><input-stem>-vibrato.<ext>
bash
$ npx fqmpeg vibrato input.mp4 --dry-run

  ffmpeg -i input.mp4 -af vibrato=f=5:d=0.5 -c:v copy input-vibrato.mp4

Tremolo と vibrato の違い: CLI は同一、効果は逆。tremolo を呼んで結果がソースを船酔いさせたような音(ピッチがゆらぐ)になっていたら、ピッチが揺れるのではなく音量がうねる方を期待していて、間違えて vibrato を呼んでいる。素早いチェック: --depth 1.0 --freq 0.5 で、tremolo は 2 秒に 1 回 silent と loud を往復する。vibrato は 2 秒に 1 回低音と高音を往復する。

ステレオ操作

audio-karaoke — センター定位ボーカルを除去

右チャンネルを左から引き、左を右から引いて、両チャンネルに同じパンで入っているものを相殺する。古典的なカラオケ・トリック。

  • ソース: src/commands/audio-karaoke.js
  • フィルタ: pan=stereo|c0=c0-c1|c1=c1-c0
  • オプション: なし — 入力と任意の -o のみ
  • 出力: <input-stem>-karaoke.<ext>
bash
$ npx fqmpeg audio-karaoke song.mp3 --dry-run

  ffmpeg -i song.mp3 -af pan=stereo|c0=c0-c1|c1=c1-c0 -c:v copy song-karaoke.mp3

正直な制約:

  1. 完全センター・ドライなボーカルでのみ機能。 ボーカル独自のバスに reverb、ダブラー、chorus、ステレオ・ワイドニングがかかっていると、それらの wet 成分は引き算を生き残る。
  2. センター定位なら何でも消す。 キック、ベース、スネア — すべて含む。ほとんどのポップ・ミックスはこの 4 つすべてをセンターに置くので、ボーカルと一緒にリズム隊も失う。
  3. 現代のストリーミング・マスターは加工が強い — 「センター・チャンネル」の前提が崩れている。完全除去ではなく、-10〜-15 dB の残響ボーカルが聞こえるのが普通だ。

現代の楽曲で説得力ある分離・除去が必要なら、機械学習ベースの音源分離(Spleeter、Demucs)が唯一の現実解 — それは FFmpeg のスコープ外。

audio-stereo-widen — ステレオ・イメージを広げる

Haas 効果で短いチャンネル間遅延を加え、知覚的な幅をスピーカー外側まで押し広げる。

オプションデフォルト注記
--delay <ms>20チャンネル間遅延。大きいほど広がるが位相も派手になる
-o, --output <path><input-stem>-wide.<ext>
bash
$ npx fqmpeg audio-stereo-widen input.mp4 --dry-run

  ffmpeg -i input.mp4 -af stereowiden=delay=20 -c:v copy input-wide.mp4

モノラル合算の警告: Haas トリックは小さなチャンネル間遅延に依存する — つまり出力がモノラルに合算される(ラジオ放送、電話スピーカー、モノラルモードの Bluetooth ヘッドセット)と、遅延はコムフィルタになり、音が薄く・うろぬけになる。モノラル互換性をチェック: ダウンミックスのプレビューで ffmpeg -i input-wide.mp4 -ac 1 -t 10 -f null - を流す。オンライン動画用で、モノラル再生を気にしないなら無視してよい。

実用レシピ

ボーカルの温め:ドライな声トラックに表情を

ドライな声録音は臨床的に聞こえる。控えめな reverbごく軽い chorus を加えると、ポッドキャストのオープニングや YouTube のナレーションに典型的な仕上げ感が出る — 処理した感を出さずに。

bash
# ステップ 1: ボディ感のための控えめな chorus(極めて薄い depth/speed)
npx fqmpeg chorus voice.wav --depth 1.5 --speed 0.3 -o voice-chorus.wav

# ステップ 2: 部屋鳴り感のための短い reverb テール
npx fqmpeg reverb voice-chorus.wav --delay 60 --decay 0.3 -o voice-ready.wav

この順序の理由: 先に chorus で音源を厚くしてから reverb で小部屋に置く。逆順だと chorus の各ボイスがそれぞれ reverb テールを持って、もっと濁る。

ロー fi ギターのレイヤー:phaser + tremolo

チル ホップ用のギターベッドには、phaser スイープに tremolo パルスを重ねる:

bash
# ゆっくりした phaser スイープ(長周期)
npx fqmpeg phaser guitar.wav --speed 0.2 --decay 0.5 -o guitar-phaser.wav

# 上にゆっくりした tremolo パルス(1 秒に 1 周)
npx fqmpeg tremolo guitar-phaser.wav --freq 1 --depth 0.4 -o guitar-lofi.wav

phaser がテクスチャの動きを、tremolo がリズムのパルスを担う。両方とも遅い速度で — 速いモジュレーションは「ロー fi」から「壊れたカセットテープ」へ押し上げる。

AM ラジオ風ダイアログ

古典的な「電話越しの声」効果にはバンドパス・フィルタリング(C9 で扱う、ここではない)+ 歪みかエコーが必要。audio-bandpassecho-effect と組み合わせるのが説得力ある近似:

bash
# ステップ 1: 電話帯域フィルタ(300-3400 Hz)— C9 動詞
npx fqmpeg audio-bandpass voice.wav --low 300 --high 3400 -o voice-band.wav

# ステップ 2: 短い金属質エコー
npx fqmpeg echo-effect voice-band.wav --delay 60 --decay 0.5 --repeats 2 -o voice-radio.wav

実際の AM ラジオは振幅クリッピングとノイズも加える — それらには生 FFmpeg の acrusheranoisesrc を呼ぶ。fqmpeg は現在どちらも公開していない。

よくある質問

なぜ reverb は本物の DAW リバーブ・プラグインとこんなに違う?

内部的に 1 タップ aecho フィルタだから — インパルス応答や Schroeder ネットワーク・リバーブではない。--delay 40 --decay 0.5 だと 40 ms に 1 つの離散反射が 50% の音量で出るだけだ — 軽くミックスすれば「小さな部屋」を匂わせるには十分だが、本物の空間を定義する密な初期反射クラスタや拡散テールがない。説得力あるリバーブには ffmpeg ... -af freeverb=...(ビルドにあれば)かインパルス応答 WAV を使った afir 畳み込みに切り替える。

chorus を「温かい」より「エセリアル」な音にチューンできる?

fqmpeg ではできない — 3 ボイス構成(遅延 50|60|70 ms、decay 0.4|0.32|0.28)はハードコード。変更できるのは LFO の depth と speed だけで、既存の 3 ボイスがどれくらいうねるかを制御する だけ。ボイス間隔は変えられない。エセリアル/広い chorus(例: 20-200 ms に広げた 8 ボイスで低 decay)が欲しければ、FFmpeg の chorus フィルタを直接、カスタムの | 区切りリストで叩く。npx fqmpeg chorus input --dry-run でフォーマットを見て、リストを編集して手動の FFmpeg 呼び出しで実行する。

flanger --mix 0.7width=70 を生んでいるように見える — バグ?

意図通りの挙動。FFmpeg の flanger フィルタは wet/dry を width=0-100 で表すが、慣習的な CLI の「mix」は 0-1 だ。fqmpeg は 0-1 を受けて 100 倍する。旧版(v3.0 前)は mix=0.7 をフィルタにそのまま渡し、フィルタは無視してデフォルト(100% wet)で動いていた。この乗算が修正だ。

vibrato は C9 の audio-pitch とどう違う?

audio-pitch は固定のセミトーン数でピッチをシフトし、トラック全体に一様に適用する。vibrato は元のピッチの周囲で選んだ速度で上下にピッチを揺らす — 平均ピッチは変わらない。メロディを別のキーに移調するには audio-pitch。持続音を「揺らめかせ」るには vibrato

なぜ audio-karaoke でボーカルが部分的に残る?

ボーカルが両ステレオ・チャンネルに同じパンで入っている前提だから(だから片方からもう片方を引くと消える)。現代のポップ制作はこの前提を破る: ボーカルはしばしばステレオ・ワイドニング、ダブラー、reverb、chorus をステレオバスに持つ — どれも相殺されない。ドラム、ベース、その他のセンター定位要素も相殺されるので、残るのは薄いインスト + ゴーストみたいなボーカル。本格的なボーカル除去には FFmpeg 外で機械学習ベースの音源分離(Spleeter、Demucs、Moises)を使う。

audio-stereo-widen はモノラル再生で壊れる?

そう、それが主リスク。Haas 風のチャンネル間遅延(デフォルト 20 ms)はモノラルに合算するとコムフィルタになる位相関係を作る — 音がうろぬけ、ノッチ感が出る。最終出力がスピーカー 1 つで再生される可能性があるなら(スマートスピーカー、電話のスピーカーフォン、モノラル Bluetooth、AM ラジオ同時放送)、モノラル・ダウンミックスを先にテストする: ffmpeg -i input-wide.mp4 -ac 1 -t 10 mono-test.mp3。ソースより明確に悪く聞こえるなら --delay を下げる(8-12 ms を試す)か、その配信ではワイドニングをスキップする。

複数の C10 動詞を 1 つの FFmpeg パスでチェーンして生成損失を避けられる?

fqmpeg 経由ではできない — 各動詞は自分の出力を生み、再エンコードする。動詞間のロスレス中間ファイルに -c:a copy は効かない(フィルタが音声を再エンコードしないといけないから)。代わりに各ステップを生 FFmpeg でロスレス形式(FLAC、WAV)にエンコードするか、--dry-run から各フィルタ文字列をコピーして 1 つの FFmpeg 呼び出しに合成する:

bash
# chorus + reverb を 1 パスに(--dry-run からのフィルタ)
ffmpeg -i voice.wav -af "chorus=0.5:0.9:50|60|70:0.4|0.32|0.28:1.5|1.5|1.5:0.3|0.3|0.3,aecho=0.8:0.88:60:0.3" voice-warm.wav

Tremolo と vibrato は同じフラグ — どっちがどっちか覚えるコツは?

語呂合わせ: tremolo は音量を変調する(「trembling loudness(震える音量)」— 持続音が脈動する)。vibrato はピッチを変調する(「vibrating string(震える弦)」— 持続音が音程でゆらぐ)。同じ --freq--depth、逆の音楽的感触。

まとめ

C10 の 9 動詞は、EQ/ダイナミクス(C9)と最終配信の間で最もよく使う創造系エフェクト操作をカバーする:

  • reverbecho-effect で時間系の奥行き(1 タップ・リバーブは 1 タップ aecho であることを正直に書いた。エコーの幾何級数減衰は自然な物理モデル)
  • chorusphaserflangertremolovibrato で LFO モジュレーション(chorus は最も隠し機構が多い — 3 ボイス・プリセットはハードコードで意図的。tremolo と vibrato はオプション面を共有するが全く違う効果を生む)
  • audio-karaokeaudio-stereo-widen でステレオ操作(karaoke はドライ・センター定位ボーカルにのみ機能。widen はモノラル再生で壊れる)

すべての動詞は --dry-run で内部 FFmpeg 呼び出しを出力する。簡略化された面では足りないとき(カスタム 8 ボイス chorus、ping-pong ステレオエコー、三角波 phaser スイープ)はフィルタをコピーしてパラメータを編集し、FFmpeg を直接呼ぶ。fqmpeg 全体の地図は fqmpeg コンプリートガイド を参照。