いくつかの音楽コレクションがあり、それらのカットオフ周波数(実際のビットレート、通常はkHz。この情報を表示するためにSpekを使用していましたが、Spekは使用する可能性を提供しません)既にいくつかの方法を見つけましたが、それらはすべて、必要な実際のカットオフ周波数(kHz)ではなく、オーディオファイルがkbpsで保存されるビットレートをリストしているだけです。 bash、python、既存のシンプルなツールなどを使用してコレクション全体をフィルタリングするためのシンプルなソリューションを見つけたいと思います。何か解決策を知っていますか?
明確化:私はnotbitrateまたはsampling rate、I 'を探していますm周波数カットオフを探しています!
大規模な音楽アーカイブの重複を排除しようとしているため、最高品質のファイルを保持したいので、使用するビットレートを信頼しないで、似たようなものを探しています。
fakeflac が見つかりました。これは良いスタートのようです。名前をだましてはいけません。指定されたファイルをwavに変換し、Pythonスクリプトを使用して操作するため、FLAC固有ではありません。いくつかのヒューリスティックに基づいて、カットオフが見つかるまで周波数スペクトルをスキャンダウンします(220 Hzの範囲で振幅が125%増加し、44100Hzでの振幅の110%以下)。
「スコア」を書き出します。これは、カットオフが現れる周波数スペクトルの最大距離です(つまり、クレームされた周波数が44100Hzであるが、22050Hzでカットオフすると、スコアは50になります)。
私はそれを機能させるために少しそれをいじらなければなりませんでした。 sndfile-convert foo bar
をffmpeg -i foo bar
に置き換えましたが、それは非常に簡単で、まさに私が求めているもののようです。
ループでfakeflac
を使用してファイルのコレクションのスコアを取得し、標準のシェルツール(sort
、cut
など)を使用して並べ替えることができます。
最もエレガントなソリューションではなく、いくつかの欠点がありますが、ここに私が得たものがあります:
find . -type f -name "*.wav" -printf "***%p\n" -exec file {} \; | awk '/\*\*\*/{printf $0"|"};{gsub(/\,/,"");for(i=1;i<=NF;i++) if($i~/Hz/) printf " "$(i-1)"|"$i"\n" }' | sort --field-separator="|" --numeric -k 2
基本的に、find
コマンドを使用して、/my/audio/folder
内で拡張子が「.wav」のファイルを検索します。各ファイルへのパスを印刷し、3つのワイルドカード記号を埋め込み、それぞれに対してfile
コマンドを実行します。 stdout
の出力は、各行を読み取る長いawk
コードへのパイプを通ります。行に3つのアスタリスクがある場合-それがファイル名の場合、それを出力します。行のフィールドにHz
が含まれている場合、そのフィールドの前に番号とフィールド自体を印刷します。すべてが***/path/to/file | number | (k)Hz
形式で出力されるように印刷されます。最後に、出力はsortコマンドにパイプされ、列2(数値)に基づいて数値的にソートされます。
大きな制限は、同じタイプのファイルで問題なく動作することですが、mp3
とwav
を混在させると、mp3ファイルの周波数が44.1 kHzとしてリストされ、ソートが中断されることに気付きます。
私が持っているサンプル出力、例えば:
***./test.wav| 8000|Hz
***./odeath.wav| 44100|Hz
***./Front_Center.wav| 48000|Hz