リペアと入力コントロール
リペアは、トーン処理/ダイナミクス/ステレオ処理/リミッティングより前に走ります。チェーンの中で唯一「音を作る」のではなく「何かを取り除く」ための区画で、クリップ・クリック・クラックル・ハム・ヒス・録音に残ってしまった部屋鳴りといった損傷がある素材でだけ意味を持ちます。
デモではインプットゲインとデノイズ量の 2 つのコントロールにまとまっていますが、エンジン側では repair.* キーの下に 6 つの段が並ぶチェーンです。どちらの見方でも、これは後段が正しく働くように条件を揃える前処理であって、音色やラウドネスの主役ではありません。
検出から処理までの手順は、音声リペアで説明しています。
6 つの段と固定された順序
エンジンはリペア段を常に決まった順序で実行し、有効化されたものだけが走ります。
| # | 段 | 取り除くもの | 何を手がかりにするか |
|---|---|---|---|
| 1 | declip | クリッパーにピークを切り落とされた平坦な区間 | 同じレベルに張り付いたサンプルの連続 |
| 2 | declick | 単発のクリックやポップ | 周囲と局所的なトランジェントのレベルの両方から突出する短いインパルス状の区間 |
| 3 | decrackle | 密集した表面ノイズ(クラックル) | 局所的な中央値から、局所的なトランジェントのレベルを超えて外れたサンプル |
| 4 | dehum | 電源周波数の倍音列 | 各解析フレームの大半で動かずに居続ける、目立つ基本波とその倍音 |
| 5 | denoise | 定常的な広帯域ノイズ | ビンごとのノイズスペクトル(最も静かなフレームから求めるか、フレームごとに追跡する) |
| 6 | dereverb | 残響の後半(レイトテイル) | 直接音の後ろに続く定常的なテイル |
順序が固定されているのは、どの段の検出器も「前の段が扱う損傷はもう無い」前提で動くからです。損傷の大きいものから順に処理することで、各段は前段が整えた後の波形だけを見ることになります。
declipがdeclickより先。 平坦に潰れた区間にはトランジェントが無く、クリック検出器には測るものがありません。まずピークを再構成しないと、クリックとクリップの縁を区別できません。- インパルス系のリペアが広帯域推定より先。
denoiseはノイズスペクトルを推定し、それに応じて全フレームのビンを下げます。推定が読むフレームにクリックやクラックルが残っていると「ノイズ」の一部として推定に取り込まれ、本来は無かったフレームからまで取り除かれてしまいます。declickとdecrackleを先に走らせるのは、推定がノイズフロアだけを表すようにするためです。 dehumがdenoiseより先。 ハムは細い倍音列なので、追従するキャンセラー(notchモードではノッチの組)で正確に取れます。残したままだと広帯域のフロア推定に紛れて、ぼやけた形でしか扱えません。dereverbが最後。 広帯域のノイズフロアは定常的なレイトテイルに見えるため、残響推定をそちらに引きずります。フロアを先に下げておけば、直接音の後ろに残るものは部屋の響きだけになります。
順序を入れ替えるオプションが無いのは、入れ替えて後段がよりきれいな入力を見られる順序が存在しないからです。
解析してから適用する
masteringRepairAnalyze({ channels, sampleRate }) は、任意のチャンネル数の全チャンネルで 6 つの検出器を実行し、チャンネルごとの欠陥、測定したフラットレベルでのデクリップが安全かどうか、そしてアシスタントが選ぶ段を各設定付きで返します。クリーンなパーカッションは欠陥として読まれません。繰り返すキックは定常な線ではなく、ドラムのヒットはクリックではないからです。デリバーブが推奨されることはありません。masteringRepairApply({ channels, sampleRate, stages }) は、そのリストをそのまま(または編集して)受け取り、配列の順序にかかわらず上記の固定順で段を実行します。同じ段を 2 回指定したり、未知の設定を渡したりすると拒否されます。デクリップ、デクリック、デハムはチャンネル全体で判断してチャンネルごとにレポートし、デノイズとデリバーブは 1 つのリンクしたマスクを適用して 1 回だけレポートします。onProgress は各段の後に進捗を報告し、cancel は段の合間に中止します。Python には mastering_repair_analyze/mastering_repair_apply があります。詳しくは オーディオリペアの流れ を参照してください。
repair.decrackle、repair.dehum、repair.denoiseClassical、repair.dereverbClassical は、リアルタイムのインサートとしても使え、同じ設定ならオフライン関数と同じ結果を、インサートが報告するレイテンシ分だけ遅れて返します。デクリックとデクリップはオフライン専用のままです。
デノイズの深さ: repair.denoise.reductionDb
デノイズ段の主な強さのコントロールは repair.denoise.reductionDb です。ゲインマスクが各周波数ビンに適用できる最大の減衰量を dB で指定します。
- 符号: 0 以上の値で、大きいほど深い減衰を許可します。26 なら各ビンを最大 26 dB 減衰でき、0 ならマスクは何も減衰できません。
- 範囲: 0〜120 です。負の値、非有限値、これより大きい値は
denoise reduction_db must be finite and in [0, 120]として拒否されます。 - 既定値: 26 dB。組み込みプリセットでこの値を変えるのは
shellac78だけで、32 dB にしています。
この値はマスクのゲインの下限であり、ノイズ自体が一定量だけ減る保証ではありません。26 dB では下限が約 0.0501 です。各ビンの実際のゲインは信号とノイズの推定で決まり、処理による音の崩れが生じることもあります。デモのデノイズ量スライダーはこの深さにスケーリングされます。
チェーンは同じコントロールのリニア表記も受け付けます。repair.denoise.gainFloor は (0, 1] のフロア値で、読み込み時に変換されます(reductionDb = -20 * log10(gainFloor))。そのため、この表記で書かれた設定ファイルはそのまま読めます。1 を超えるフロアは負の深さになるので拒否されます。省略形のキー repair.reductionDb と repair.gainFloor も同じ repair.denoise.* キーに解決されます。Node と WASM の型定義では gainFloor はこの変換付きで非推奨と宣言されており、エンジンが書き出す設定には reductionDb だけが含まれます。
インプットゲイン
インプットゲインは、マスタリングチェーンが反応する前のレベルを調整します。元音源が極端に小さい、またはすでに大きすぎる場合を除き、まずは 0 dB のままにしておくのが基本です。
小さすぎる音源では、コンプレッサーやエキサイターが十分に反応しません。大きすぎる音源では、後段が早い段階で抑え込みすぎます。インプットゲインを大きく上げてラウドネスを稼ごうとしないでください。最終的なラウドネスはラウドネスオプティマイザーとリミッターの担当です。入力段で無理にレベルを上げると、コンプスレッショルドの意味が変わり、プリセットが想定するバランスから外れてしまいます。
デノイズ量
デノイズ量は、リペア段が定常的な背景ノイズをどれくらい抑えるかを決めます。ヒスノイズ、低レベルの広帯域ノイズ、一部の生成音源に残るノイズ成分に対して有効です。
まずは小さい値から始めます。ドラムがにじむ、アタックが鈍る、水っぽいアーティファクトが出る、といった副作用が出るくらいなら、少しノイズが残っているほうが自然に聞こえることが多いです。
少し残るノイズは、にじんだドラムよりまし
ノイズが気にならなくなった時点で止めます。これ以上デノイズを上げると、シンバルテイルが揺れ、ルームトーンが吸い込まれ、ボーカルの息遣いが途切れます。またインプットゲインでラウドネスを稼がないでください。それはオプティマイザーとリミッターの役目で、入力段を大きく動かすと後段すべての検出器が見る信号が変わります。
戻すべきサイン
デノイズを上げた後に、シンバルテイルが揺れる/ルームトーンが不自然に吸い込まれる/ボーカルの息遣いが不自然に途切れる、といった現象が出たら、リペアが音楽成分まで削っています。ノイズは「完全に消す」ものではなく、「聴取上の邪魔を減らす」ものとして扱います。
インプットゲインを動かした後にコンプレッサーやリミッターの反応が大きく変わったときも、まずはインプットゲインを元に戻します。入力段の変更は後段すべての検出器に入る信号を変えてしまうため、ラウドネス稼ぎの目的で動かすとチェーン全体の判断が崩れます。
判断の順序
- まずインプットゲイン 0 dB のままレンダリングする。
- メーターで入力ピークとクレストファクターを確認する。
- 極端に小さい素材だけ、少しインプットゲインを上げる。
- 無音区間や曲頭でノイズが気になる場合のみ、デノイズ量を上げる。
- デノイズを上げた後は、ドラム・子音・リバーブテイルが不自然になっていないかをチェックする。
AI 生成音源では、ノイズと音色の境界が曖昧なことがあります。完全に消そうとすると音楽成分まで削れてしまうため、「気にならない程度まで抑える」ことを目標にします。
素材にどの段が必要か、どのプリセットがそれをまとめて持っているかはマスタリングプリセットの選び方で扱います。各段のパラメータ一式はマスタリングプロセッサにあります。
実装メモ
リペアが有効なとき、デモはデノイズ設定をワーカー経由で libsonare の WASM に渡し、スペクトル処理が UI スレッドを止めないようにしています。この段は STFT ベースのディノイザーで、ノイズスペクトルを推定し(オフラインの既定では最も静かな 10% のフレームから、spp のような再帰型の追跡器ではフレームごとにノイズフロアを追って)、決定指向の事前 SNR からビンごとのゲインを導き、そのゲインを repair.denoise.reductionDb が定めるフロアで頭打ちにします。デノイズ量を上げるとこのフロアが深くなり、ノイズ推定後の抑圧量が強くなります。
インプットゲインの可動範囲は意図的に狭くしています。最終的なラウドネスは LUFS オプティマイザーが担当するからです。入力段で大きく動かすとコンプスレッショルドの判断が難しくなり、リミッターにも不要な負担がかかります。