Tensorflow 2にwavファイルをインポートする


9

Python 3.7とTensorflow 2.0を使用して、UrbanSoundsデータセットからwavファイルを読み取るのに苦労しています。この質問と回答は、入力が文字列テンソルでなければならないことを説明しているので役立ちますが、ファイルにエンコードされた初期メタデータを通過して実際のデータに到達するのは難しいようです。文字列をfloat32テンソルとしてロードする前に、文字列を前処理する必要がありますか?24ビットのwavから16ビットのwavにダウンサンプリングしてデータを前処理する必要があったため、データ入力パイプラインは予想よりもはるかに煩雑になっています。必要なダウンサンプリングは特にイライラします。これが私がこれまでに試みていることです:

import tensorflow as tf  # this is TensorFlow 2.0

path_to_wav_file = '/mnt/d/Code/UrbanSounds/audio/fold1/101415-3-0-2.wav'
# Turn the wav file into a string tensor
input_data = tf.io.read_file(path_to_wav_file)
# Convert the string tensor to a float32 tensor
audio, sampling_rate = tf.audio.decode_wav(input_data)

これは私が最後のステップで得るエラーです:

2019-10-08 20:56:09.124254: W tensorflow/core/framework/op_kernel.cc:1546] OP_REQUIRES failed at decode_wav_op.cc:55 : Invalid argument: Header mismatch: Expected fmt  but found junk
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow/python/ops/gen_audio_ops.py", line 216, in decode_wav
    _six.raise_from(_core._status_to_exception(e.code, message), None)
  File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError: Header mismatch: Expected fmt  but found junk [Op:DecodeWav]

そして、これがその文字列テンソルの始まりです。私はwavファイルの専門家ではありませんが、「fmt」の後の部分が実際のオーディオデータの開始点だと思います。その前は、ファイルに関するすべてのメタデータだと思います。

data.numpy()[:70]
b'RIFFhb\x05\x00WAVEjunk\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00fmt \x10\x00\x00\x00\x01\x00\x01\x00D\xac\x00\x00\x88X\x01\x00\x02\x00'

テストのために、「ジャンク」ヘッダーをデータから手動で(junk前のバイトまでfmt)削除して、機能しているかどうかを確認しましたか?私の推測では、それらのデコーダはかなり基本的であり、RIFF / WAVE形式を完全に処理することはできません。
Matthieu

はい、試してみましたが、それでも機能しませんでした。
Alex

そしてそれに応じてヘッダーの長さを変更しましたhb\x05\x00か(部分)?
Matthieu

いいえ、しませんでした。何に変更する必要がありますか?
Alex

1
これがテンソルフロー1.14で機能するように見える理由は、tf1が遅延実行を使用しているため、エラーを発生させずにオーディオ、sampling_rate = tf.audio.decode_wav(input_data)を実行できることですが、実際にはそうではないためと思われますまだコードを実行しました。
アレックス

回答:


6

あなたのエラーは、最初にfmt部分を期待しているTensorFlowに関係しているようです。

処理用のTensorFlowのコードは、https//github.com/tensorflow/tensorflow/blob/c9cd1784bf287543d89593ca1432170cdbf694de/tensorflow/core/lib/wav/wav_io.cc#L225にあります。

未解決の問題もあり、TensorFlowのチームからの応答を待っています。これは、提供した同じエラーをおおまかにカバーしています。 https://github.com/tensorflow/tensorflow/issues/32382

他のライブラリはジャンク部分をスキップするだけなので、それらで動作します。


あなたの答えはこれはバグであり、残念ながらあなたは正しいようです。リンクは役に立ちます。
Alex

4

デュアルチャネルオーディオファイルのコードが失敗したようです。このコードは、モノチャネルのwavファイルで機能します。あなたの場合は、scipyを使用してみてください。

from scipy.io import wavfile as wav
sampling_rate, data =  wav.read('101415-3-0-2.wav')

これは代替手段を提供するので役立ちますが、テンソルフローライブラリ内でこれを完全に行う方法がおそらくあるという意味では質問には答えません。
Alex

@Alexが、問題のある.wavファイルがscipyで動作するtensorflowで失敗していますか?
Matthieu

1
@Matthieu問題のあるwavファイルは他のライブラリでは機能しますが、TensorFlowのdecode_wavオペレーターでは機能しません。@raviktあなたがテストしたあなたのmono wavファイルjunkのヘッダーはヘッダー部分に含まれているのではなく、確かfmtですか?
Kautham Krishna
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.