指定されたディレクトリ内の単一の .wav ファイルまたはすべての .wav ファイルで関数 (2D numpy 配列からデータ ファイルに一連の手段を書き込む) を実行するオプションを持つ python シェル スクリプトを作成しています。
例えば、
> myscript.py --file=audio.wav --data="data.tab"
浮動小数点値を data.tab に書き込む必要があります。
> myscript.py --path="path/with/audio_files" --data="data.tab"
一連の浮動小数点値を data.tab に書き込む必要があります。
たくさんの WAV ファイルを含むフォルダーがあります。( --file オプションを使用して) 単一のファイルでパスを実行すると、結果はファイルが --path オプションで処理されたときの結果とは異なります。
私はパスファイルを3つの方法で実装しました:
1) os.listdir() の使用
for audioFile in os.listdir(options.path):
if audioFile.endswith('.wav'):
foo(audioFile)
2) os.walk() の使用
for r, d, f in os.walk(options.path):
for audioFile in f:
if audioFile.endswith('.wav'):
foo(audioFile)
3) glob.glob() の使用
for audioFile in glob.glob("*.wav"):
foo(audioFile)
方法 1 と 2 は同じ結果を返します。方法 3 は別の結果を返します。3 つのメソッドはすべて、単一のファイルを処理する場合とは異なる結果を返します。
os または gob モジュールを使用すると何が違うのですか?
編集: ディレクトリ内のすべての .wav ファイルを処理する場所は次のとおりです。
for r, d, f in os.walk(options.path):
for audioFile in f:
if audioFile.endswith('.wav'):
# Add MFCC 1-12 to data.
mfcc12(audioFile, sampleRate, data)
これは mfcc12() にあります:
# mfccs is a 2D numpy array.
# Each column corresponds to one feature of the audiofile
for i in range(mfccs[0].size):
mfccMean = mfccs[:, i].mean()
mfccStdDev = mfccs[:, i].std()
data.write(str(mfccMean) + '\t' + str(mfccStdDev) + '\t')
オーディオ ファイルから特徴を抽出するためにYAAFEを使用しています。