![ffmpeg を使用してオーディオ クリップのバックグラウンド ノイズを減らし、音声を最適化する](https://rvso.com/image/1402573/ffmpeg%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%20%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%81%AE%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%20%E3%83%8E%E3%82%A4%E3%82%BA%E3%82%92%E6%B8%9B%E3%82%89%E3%81%97%E3%80%81%E9%9F%B3%E5%A3%B0%E3%82%92%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%99%E3%82%8B.png)
音声認識のためにビデオ ファイルからオーディオ クリップを抽出します。これらのビデオはモバイル デバイスやその他の手作りデバイスから取得されるため、ノイズが多く含まれています。音声認識エンジンに中継する音声が明瞭になるように、オーディオのバックグラウンド ノイズを減らしたいと考えています。この作業はすべて ffmpeg を使用して行っていますが、ノイズ削減の段階で行き詰まっています。
これまで、以下のフィルターを試しました:
ffmpeg-20140324-git-63dbba6-win64-static\bin>ffmpeg -i i nput.wav -filter_complex "highpass=f=400,lowpass=f=1800" out2.wav
ffmpeg -i i nput.wav -af "equalizer=f=1000:width_type=h:width=900:g=-10" output.wav
ffmpeg -i i nput.wav -af "bandreject=f=1200:width_type=h:width=900:g=-10" output.wav
しかし、結果は非常に残念です。私の考えでは、音声は 300 ~ 3000 Hz の範囲にあるため、他のすべての周波数をフィルタリングしてバックグラウンド ノイズを抑制できるはずです。何が足りないのでしょうか?
また、音声強調に使用できるウィーナーフィルターについて読んで、これしかし、どのように使用すればいいのか分かりません。
答え1
聞き取れる音声を分離したい場合は、ローパス フィルターとハイパス フィルターを組み合わせてみてください。使用可能な音声の場合、200 Hz 以下をフィルターし、次に 3000 Hz 以上をフィルターすると、使用可能な音声オーディオがかなり良好に保持されることに気付きました。
ffmpeg -i <input_file> -af "highpass=f=200, lowpass=f=3000" <output_file>
この例では、最初にハイパス フィルターを追加して低い周波数をカットし、次にローパス フィルターを使用して高い周波数をカットします。必要に応じて、ファイルをこのフィルターに複数回通して、カットされた周波数範囲内のより高い db 周波数をクリーンアップすることができます。
答え2
答え3
更新: FFmpeg は最近、afftdn
以下で説明する FFT ビンごとのノイズしきい値方式を使用するようになりました。これには、適切なしきい値をオンザフライで適応/計算するためのさまざまなオプションがあります。
anlmdn
(非ローカル手段) はビデオに適した手法ですが、オーディオ フィルターは試していません。
どちらか一方が多くのノイズが 60Hz のハム音などだけである場合を除いて、ハイパス/ローパスよりも優れています。(人間の話し声は、かなり狭い帯域でも問題なく聞こえますが、広帯域のノイズであるバックグラウンドのヒスノイズを除去するには、もっと良い方法があります。)
ffmpeg には、ノイズ低減用の適切なオーディオ フィルターが組み込まれていません。Audacity にはかなり効果的な NR フィルターがありますが、ノイズのみのサンプルと入力の 2 パス操作で使用するように設計されています。
上部のコメントhttps://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp仕組みを説明します。(基本的には、しきい値以下のすべての FFT ビンを抑制します。つまり、その周波数帯域のノイズ フロアよりも大きい信号のみを通過させます。問題なく驚くべき効果が得られます。信号に適応するバンド パス フィルターのようなものです。ノイズのエネルギーはスペクトル全体に広がっているため、いくつかの狭い帯域のみを通過させると、ノイズ エネルギー全体が大幅に減少します。)
参照オーディオノイズ低減: Audacity は他のオプションと比べてどうですか?仕組みの詳細については、こちらをご覧ください。また、何らかの方法で FFT ビンをしきい値設定することが、一般的な商用ノイズ低減フィルターの基礎にもなっています。
そのフィルターを ffmpeg に移植するのは少し面倒です。おそらく、2 パス フィルターではなく、2 つの入力を持つフィルターとして実装するのが最適でしょう。ノイズ プロファイルを取得するのに数秒しかかからないため、ファイル全体を読み取る必要はありません。また、オーディオ ストリーム全体をノイズ サンプルとして入力しないでください。各 FFT ビンのしきい値を設定するには、ノイズだけのサンプルを確認する必要があります。
そうですね、2pass ではなく 2 番目の入力が理にかなっています。しかし、そうすると、ほとんどの ffmpeg フィルターよりも使いにくくなります。ストリーム分割や時間範囲抽出などのさまざまな工夫が必要になります。そしてもちろん、複数の入力ファイルに適した別のファイルにノイズ サンプルがない限り、手動による介入が必要です。(同じマイク/セットアップからの 1 つのノイズ サンプルは、そのセットアップのすべてのクリップで問題ありません。)
答え4
完了するにはユーザー564335の答え:
これ: -af arnndn=m=cb.rnnn
おそらく私が使った中で最高のノイズフィルターですffmpeg
(AIベース)。
このような:
ffmpeg -i <input_file> -af arnndn=m=cb.rnnn <output_file>
周波数帯域フィルタは不要です。トレーニング済みモデル(files.rnnn
)こちらから入手可能(いずれかのファイルをダウンロードして使用する必要があります)。
cb
( )モデルconjoined-burgers
は私が見つけたものです最も印象的loudnorm
多用途です。また、このフィルターは非常に効率的であることがわかりました (たとえば、フィルターよりも多くの CPU を使用するようには見えません)。
また、ffmpeg 5.0 以降では、新しいノイズ フィルターが追加されました。いいえ。
よく覚えている限りでは、私はそれを試してみましたが、私の意見では、上記のトレーニング済みニューラル ネットワークほど効率的ではありませんでした。