モノラルWAV音源の音飛びのうちバッファーアンダーフローで発生する無音区間を検知・除去して症状を緩和するツールを作りました❣


ブラウザ上で動作するGUI版は以下のURLから利用できます:
https://do.symphonic.lol/app.php/strip-zsnd/
100% Pure JavaScript(死語)なので処理本体については外部との通信は発生しません。GUI版をローカル環境で動かす場合はネットワークから切断しても問題なく稼働します。
ドキュメント及びソースコードはGitHubから。
TL;DR
何をするツールなの?
一般的に、音飛びはいずれかの機器の処理遅延によって同期が取れなくなったときに発生します。
そのうちの一類型として、録音機器側の処理遅延によるデータ欠落(バッファアンダーフロー)が発生すると、録音データに下の図のようなごく短い不自然な無音区間が混入します。


通常はどんなに静かな部屋でも一定の環境ノイズが混入するため、録音段階で完全な無音が観測されることはほぼありません❣
ただし、ノイズゲート他のノイズ処理を施した音源では、微小なノイズがゼロに丸められます。その結果、本ツールが検出する「ゼロサンプル挿入」と区別がつかなくなる可能性があります。
このため、本ツールは 編集・ノイズ処理前の生録音に使用することを推奨します。
本ツールは、この種の不自然なほぼ完全にゼロの無音区間を検出・除去し音飛びを緩和します。
ノイズ処理済みの音源を読み込んだ場合などでは、発話中の音飛びだけでなく本当に何もしゃべってない無音区間も音飛び区間として検出される場合があります。リテイク指示等の判断材料にする場合は必ず検出された区間の前後を試聴して本当に音飛びなのかを確認してください。
本ツールのアプローチの限界
本ツールは音飛びを「検知・緩和」しますが、「完全な修復」は困難なことが多いです。可能であれば録音環境を見直して録り直したほうがいいです❣
ヤミマキさんはリテイク困難な音源を複数抱えているので自作しました。
ソフトウェア側の処理遅延によるデータ欠落(バッファオーバーフロー)が発生すると、録音データの波形が 昇竜拳 不連続に飛びます。 この種の音飛びについては、このツールでは除去だけでなく検出もできません。


一般的に、音飛びが発生している場合はアンダーフローもオーバフローも不規則に混在しています。 これは単なる処理速度の問題だけでなく、「機器ごとに異なる時計が使われていて、いずれかの精度不足で同期が取れない」 ことによって、データの送受信タイミングが少しずつズレていくことが根本的な原因だからです。
そのため、本ツールは「無音区間を詰める」ことで症状を緩和することはできますが、データ自体が消失して波形がジャンプしている箇所まで含めた 「完全な修復」は困難な場合が多いです。
開発動機やその他のツールについて
ぶっちゃけゼロ区間を除去するだけなら時間をかけてツールをつくるでもなく、仮にコードを書くとしてもPythonあたりで瞬殺です。モノラルWAV音源にしか対応させていないのもフォーマット変換ぐらいならffmpegなりsoxなりで足りるからです。
わざわざ手間をかけたのは、音飛びがどこで発生しているのかを(視覚的に)確認したかったから。
あとは単純にJavaScriptフロントエンドで音声処理してみたかったから❣
ちなみに波形可視化ライブラリにはwavesurfer.jsを使いました。今回使いませんでしたが、公式プラグインだけでスペクトログラム表示までできてつよつよすぎます。。描画がけっこう力業なので描画用の音声サンプリングレート(解像度に相当)をあまり上げられないのが難点だけど。
VSTプラグイン
VSTプラグインは本質的に音飛びの処理に向きません❣
少なくともVST3の仕様では入力サンプル数と出力サンプル数は一致させる必要があります。つまり、VSTプラグインは音源の時間軸をいじることはできません。音飛びの修復の際に本来必要な、途中に余計なゼロサンプルが入っていて切り詰める必要があったり、途中で時間軸が飛んでいるのでその分引き延ばして間を埋めないといけなかったりという処理はVSTプラグインではできません。音飛びの結果として発生したノイズはある程度緩和することはできますが。
本来、音飛びはリテイクで対処するべきだからなのでしょう。。
Studio Oneのストリップサイレンス
S1のストリップサイレンスは無音区間のアタマとケツが必ず残ります❣
(ヤミマキさんの設定ミスでなければ)Studio One 6のストリップサイレンス機能はどんなにパラメータを調整しても必ず無音区間のアタマとケツを残します。
S1のストリップサイレンス機能は音飛び処理用ではなく、あくまで「まともに録れた」音源の編集用。完全に削るとかえって波形ジャンプによるノイズを誘発するという想定のようです。
SoX
コマンドラインで音声処理できるやつ。音声版のImageMagick。Windowsでも利用可能。
おそらく除去するだけならsilenceエフェクトで間に合うんですが、どの区間が該当するのかをレポートさせることはできないようでした。






コメント