エンベロープを抽出する Wavサウンドファイルから。
SoXまたはffmpegを使用してコマンドラインからそれを達成する方法はありますか?
これは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オフセットをサイレントに削除していると思います。