web-dev-qa-db-ja.com

SoXまたはffmpegを使用してサウンドファイルのエンベロープを抽出する方法

エンベロープを抽出する Wavサウンドファイルから。

SoXまたはffmpegを使用してコマンドラインからそれを達成する方法はありますか?

2
Sylvain Leroux

これはSoXで概算できます。包絡線検波器は基本的に信号を整流し(つまり、すべてのサンプルの絶対値を取得し、信号の負方向側を「折り返し」、代わりに正方向になるようにする)、次に非常に劇的なローパスフィルターを実行する必要があります。元の信号の振幅エンベロープに近い低周波の正方向の信号を抽出します。

主な障害は、SoXでは修正手順を簡単に実行できないことです。これを回避するいくつかの方法を紹介します。

1つ目は、信号を整流する代わりに、dcshiftフィルターを2回適用することで、信号の負方向を破棄できることです。これは完璧ではありませんが、ほとんどのオーディオ入力に十分な精度の出力を提供します。

sox $infile out.wav dcshift -1 dcshift +1 lowpass 20

sox WARN dcshift: dcshift clipped 123987 samples; decrease volume?のようなものが表示されますが、サンプルのクリッピングは私たちが望んでいたことです。)

使用できる2番目のトリックは、整流包絡線検波器の代わりに二乗検波器(プロダクト検波器とも呼ばれます)を作成することです。この種の検出器では、検出されたエンベロープと入力信号の関係が異なるため、どちらの方法が適しているかを確認する必要があります。二乗則検出器では、入力信号は整流される代わりにそれ自体で乗算されます。同じ入力を--combine multiplyで2回指定することにより、SoXでそれを行うことができます。

sox --combine multiply $infile $infile out.wav lowpass 20

いずれの場合も、20を調整して、ローパスのカットオフ周波数を制御し、検出されたエンベロープが入力をどの程度厳密に追跡するか、またはより高い周波数のコンテンツがどれだけ保持されるかを制御できます。

エンベロープを視覚化したい場合は、ffmpegで簡単に実行できます。例:

ffmpeg -i out.wav -filter_complex "showwavespic=s=640x120" -frames:v 1 out.png

興味深いことに、このffmpegの視覚化では、信号が0を中心とする双極信号として表示されますが、実際には0 .. +1の範囲の単極信号になっています。 ffmpegは、このビジュアルを処理するときに、DCオフセットをサイレントに削除していると思います。

2
tgies