クリップ、クリック、クラックルのリペア
クリップ、クリック、クラックルはいずれも短時間の欠陥ですが、根拠は別々です。クリップは上限付近の連続区間を作り、クリックは孤立した不連続、クラックルはサンプル単位の偏差が密集したものです。リペア方法を選ぶ前に、それぞれの欠陥を検出してください。
このページの用語
- ラン:検出器が損傷とみなした、連続するサンプルの区間。クリップのランは同じレベルに張り付き、クリックのランは前後のサンプルから突出します。
- LPC/AR モデル(線形予測、自己回帰):各サンプルを直前の数十サンプルから予測するモデル。declick と declip は、ランの周りの損傷していない音声にこれを当てはめ、周囲の信号から続く波形でランを埋めます(
lpcOrderは使う過去のサンプル数)。 - 補間フォールバック:モデルで埋めるには長すぎるランを、両端をなめらかな曲線でつないで埋める処理。
- 中央値の基準:decrackle は各サンプルを近傍の中央値と比べ、離れすぎたものを置き換えます。
- ウェーブレット縮退:decrackle のもうひとつのモードで、信号を細部のレベル(
levels)に分け、クラックルが含まれる小さな細部係数を縮めます。個々のサンプルは置き換えません。
検出器を選ぶ
| 欠陥 | 検出器 | リペア段 | 確認するもの |
|---|---|---|---|
| 平らな頂部または上限を超えたピーク | masteringRepairDetectClipping | masteringRepairDeclip | clipThreshold 以上のサンプルについて sampleCount、runCount、longestRunSamples。長い区間は補間フォールバックを使う。クリップの後でゲインを下げた素材では、代わりに flatRunCount、longestFlatRunSamples、flatSampleCount、flatLevel を見る。 |
| 孤立したインパルス状の不連続 | masteringRepairDetectClicks | masteringRepairDeclick | count、rejected、longestRunSamples、perSecond。 |
| 密集したサンプル単位の表面損傷 | masteringRepairDetectCrackle | masteringRepairDecrackle | sampleCount、sampleFraction、perSecond。 |
検出は素材に依存します。矩形波、パルス列、完全にリミットされた信号は平らな頂部に見える一方、ダウンミックス、リサンプリング、非可逆圧縮は本当の平頂を消すことがあります。ダウンミックス前の元チャンネルをそれぞれ検査してください。パーカッションは損傷として読み取られません。クラックルのサンプルとクリックの連なりは、局所的な過渡のレベルを上回る位置でだけ数えられるため、きれいなキックのループでは何も報告されません。リペアの各段は過渡の中でも作用するので、replacedSamples や repairedRuns は検出された数を上回ることがあります。
リペア順に検出する
次のモノラル例は、選択した段を適用した後に検出をやり直します。そのため後の測定は、前のリペアが作った波形に対して行われます。
import {
init,
masteringRepairDeclick,
masteringRepairDeclip,
masteringRepairDecrackle,
masteringRepairDetectClicks,
masteringRepairDetectClipping,
masteringRepairDetectCrackle,
} from '@libraz/libsonare';
await init();
let repaired = samples;
const clipping = masteringRepairDetectClipping(repaired, sampleRate);
if (clipping.sampleCount > 0 || clipping.flatRunCount > 0) {
repaired = masteringRepairDeclip({
samples: repaired,
sampleRate,
clipThreshold: clipping.sampleCount > 0 ? 0.98 : clipping.flatLevel,
});
}
const clicks = masteringRepairDetectClicks(repaired, sampleRate);
if (clicks.count > 0) {
repaired = masteringRepairDeclick(repaired, sampleRate);
}
const crackle = masteringRepairDetectCrackle(repaired, sampleRate);
if (crackle.sampleCount > 0) {
repaired = masteringRepairDecrackle(repaired, sampleRate);
}sampleCount が数えるのは、しきい値(既定は 0.98)以上のサンプルだけです。クリップしてからレベルを下げた素材では平らな頂部がもっと低い位置にあるため、sampleCount は 0 になり、既定のままの declip は何も変えません。平坦区間のフィールドならそうした頂部も見つかり、渡すべきしきい値は flatLevel です。masteringRepairAnalyze はこのしきい値を自動で選び、より大きな未クリップ部分まで書き換えてしまう場合は declip を見送ります。
件数が 0 より大きいかで分けるだけでは出発点にすぎません。波形を確認して各変更を試聴してください。検出器は、クリップに見える波形が意図したものかどうかを判断できません。
過渡的なリペア A/B を聴く
この A/B は、損傷したビニール盤風クリップに実際の WASM デクリック処理を適用します。ノイズの注入、ラウドネス整合、declip/decrackle/dehum は行いません。素材にはハム、ヒス、クラックル、音楽的なアタックが残るため、すべての欠陥が消える例ではなく、局所的なクリックのリペアを聴く例として使ってください。
ステレオ像を保つ
ステレオでは左右のチャンネルをペア形式へ渡します。各チャンネルにモノラル関数を別々に呼ぶと、一方だけを直して対応するイベントをもう一方に残すことがあります。
import {
masteringRepairDeclickStereo,
masteringRepairDeclipStereo,
masteringRepairDecrackleStereo,
} from '@libraz/libsonare';
const declipped = masteringRepairDeclipStereo({
left,
right,
sampleRate,
});
const declicked = masteringRepairDeclickStereo({
left: declipped.left,
right: declipped.right,
sampleRate,
});
const decrackled = masteringRepairDecrackleStereo({
left: declicked.left,
right: declicked.right,
sampleRate,
});
console.log(decrackled.leftReport, decrackled.rightReport);declipStereo は左右のクリップ区間の和集合を使います。和集合の区間にクリップしたサンプルがないチャンネルは、その区間を変更しません。各チャンネルは自身の再構成とレポートを持ちます。declickStereo はどちらかのチャンネルが選んだ区間を両方でリペアしますが、補間には各チャンネル自身のサンプルと LPC モデルを使います。表面傷は共通イベントにならないため、decrackleStereo はチャンネルごとに独立して処理します。
レポートを読む
モノラル形式はサンプルだけを返します。これらのレポートフィールドが必要なときは、*Stereo 形式(leftReport と rightReport を返します)か masteringRepairApply を使ってください。
| 段 | 役立つレポートフィールド | 解釈 |
|---|---|---|
| Declip | lpcReconstructedRuns、interpolatedRuns、repairedSamples | 512 サンプルを超える区間は三次または線形補間を使う。そのフォールバックには LPC オプションは効かない。 |
| Declick | detected.rejected、repairedRuns、linkedRuns、lpcModelUsed | rejected が多い場合、素材がきれいなのではなく maxClickSamples または neighborRatio が厳しすぎることが多い。 |
| Decrackle | replacedSamples または shrunkCoefficients | 検出器は常に中央値の基準を使う。ウェーブレットモードは各除去サンプルをクラックルと宣言せず、詳細係数を取り除く。 |
検出器とリペアは信号レベルのしきい値を使い、損傷したすべてのサンプルを復元できるとは約束しません。クリップは情報を捨てているため、再構成は近傍サンプルから形を推定します。未処理素材を保存し、一定の再生ゲインで比較してください。
チェーン設定や上書きでは、repair.decrackle.mode に指定できるのは median(0)または waveletShrinkage(1)で、それ以外の値は unknown decrackle mode で拒否されます。
設定と受け付ける範囲
すべてのオプションに上限があります。上限を超える値は、名前付きプロセッサ経由を含むすべての環境で InvalidParameter を投げます。
| 段 | オプション | 既定値 | 受け付ける範囲 |
|---|---|---|---|
| Declick | threshold | 0.8 | (0, 10] |
| Declick | neighborRatio | 4 | (0, 100] |
| Declick | maxClickSamples | 8 | [1, 512]。512 は AR 補間が解く最長の区間 |
| Declick | lpcOrder | 20 | [0, 2048] |
| Declick | residualRatio | 8 | (0, 1000] |
| Declip | clipThreshold | 0.98 | (0, 1] |
| Declip | lpcOrder | 36 | [0, 2048] |
| Declip | iterations | 2 | [1, 8] |
| Declip | lpcBlend | 0.65 | [0, 1] |
| Decrackle | threshold | 0.4 | (0, 1000] |
| Decrackle | levels | 4 | [1, 24] |
Declick は、選ばれたすべての区間を先に両端のサンプルへアンカーした線形補間で埋め、その後で AR モデルによる解を求めます。そのため AR の計算が読む文脈に、まだリペアされていないクリックが含まれることはありません。接する、または重なる区間は、ステレオ形式で別々のチャンネルが選んだものも含めて 1 つの領域に結合されます。隣接するクリックは補間の起点にできないためです。
因果的な段は、メディアンモードの decrackle も含めてリアルタイムインサートとしても動作します。declick と declip は動作しません。オーディオリペアの流れ を参照してください。
限界と共通の順序
完全なリペア順は declip → declick → decrackle → dehum → denoise → dereverb です。平らな区間はクリックを隠すことがあるためクリップのリペアを先に置き、残りの過渡的な段をスペクトルノイズと残響の推定より前に置きます。ここでの関数はオフラインの全バッファ処理(decrackle にはリアルタイムインサートもあります)で、LUFS 整合は行いません。判断の流れは オーディオリペアの流れ、正確なオプション型は JavaScript マスタリング API を参照してください。