web-dev-qa-db-ja.com

ffmpegを使用して、バックグラウンドノイズを低減し、オーディオクリップからの音声を最適化する

音声認識用にビデオファイルからオーディオクリップを抽出します。これらのビデオはモバイル/その他の手作りのデバイスからのものであるため、多くのノイズが含まれています。音声認識エンジンに中継する音声が明瞭になるように、オーディオのバックグラウンドノイズを減らしたいです。私は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の範囲に入るので、他のすべての周波数を除外して、バックグラウンドノイズを抑制することができるというものでした。何が欠けていますか?

また、音声強調に使用できるウィーナーフィルターについて読み、 this を見つけましたが、その使用方法がわかりません。

35
Sudh

可聴音声を分離したい場合は、ローパスフィルターとハイパスフィルターを組み合わせてみてください。使用可能なオーディオの場合、200hz以下をフィルターで除去し、次に3000hz以上をフィルターで除去すると、使用可能な音声オーディオを維持するのにかなり良いことがわかりました。

ffmpeg -i <input_file> -af "highpass=f=200, lowpass=f=3000" <output_file>

この例では、最初にハイパスフィルターを追加して低周波数をカットし、次にローパスフィルターを使用して高周波数をカットします。必要に応じて、これを複数回実行して、カット周波数範囲内のより高いdb周波数をクリーンアップできます。

38
av8r

FFmpegにノイズバックグラウンドを処理する2つのネイティブフィルターが追加されました。

また、しばらくの間、FFmpegでladspa(ノイズ抑制器を探す)および/またはlv2(音声雑音除去を探す)フィルターを使用できます。

17
Paul B. Mahol

更新:FFmpegが最近追加されたafftdnは、以下で説明するFFTビンごとのノイズしきい値を使用して、適切なしきい値をオンザフライで適応/把握するためのさまざまなオプションを備えています。

anlmdn(非ローカル手段)は、ビデオに有効な手法です。私はオーディオフィルターを試していません。

あなたの唯一のノイズが60Hzハムか何かでない限り、これらのどちらかがハイパス/ローパスよりはるかに良いべきです。 (人間のスピーチはかなり狭いバンドパスでも問題なく聞こえますが、ブロードバンドノイズのバックグラウンドヒスノイズをクリーンアップするためのより良い方法があります。)


ffmpegには、ノイズ低減のための適切なオーディオフィルターが組み込まれていません。Audacityにはかなり効果的なNRフィルターがありますが、ノイズだけのサンプルと入力の2パス操作で使用するように設計されています。

https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp の上部にあるコメントは、それがどのように機能するかを説明しています。 (基本的には、しきい値を下回るすべてのFFTビンを抑制します。したがって、その周波数帯域のノイズフロアよりも大きい場合にのみ信号を通過させます。問題を引き起こすことなく驚くべきことを実行できます。これは、適応するバンドパスフィルターのようなものですノイズのエネルギーはスペクトル全体に広がるため、そのいくつかの狭い帯域を通過させるだけで、LOT全体のノイズエネルギーが減少します。

参照 オーディオノイズリダクション:audacityは他のオプションとどのように比較されますか? それがどのように機能するかの詳細と、FFTビンのしきい値処理を何らかの方法で行うことが、一般的な商用ノイズ低減フィルターの基礎です。あまりにも。

そのフィルターをffmpegに移植するのは少し面倒です。 2パスフィルターの代わりに、2つの入力を持つフィルターとしてそれを実装するのが最も良いでしょう。ノイズプロファイルを取得するには数秒しか必要ないため、ファイル全体を読み取る必要があるわけではありません。とにかく、オーディオストリーム全体をノイズサンプルとしてフィードしないでください。各FFTビンのしきい値を設定するには、JUSTノイズのサンプルを確認する必要があります。

ええ、2パスではなく2番目の入力が理にかなっています。しかし、そのため、ほとんどのffmpegフィルターよりもはるかに使いにくくなっています。あなたはストリーム分割/時間範囲抽出を備えたブードゥーの束が必要です。そしてもちろん、複数の入力ファイルに適した別のファイルにノイズサンプルがない限り、手動による介入が必要です。 (同じマイク/セットアップからの1つのノイズサンプルは、そのセットアップからのすべてのクリップで問題ありません。)

14
Peter Cordes