Mit Python 3.7 und Tensorflow 2.0 fällt es mir schwer, WAV-Dateien aus dem UrbanSounds-Dataset zu lesen. Diese Frage und Antwort sind hilfreich, da sie erklären, dass die Eingabe ein String-Tensor sein muss, es jedoch schwierig zu sein scheint, die in der Datei codierten anfänglichen Metadaten zu überwinden und zu den realen Daten zu gelangen. Muss ich den String vorverarbeiten, bevor ich ihn als float32-Tensor laden kann? Ich musste die Daten bereits vorverarbeiten, indem ich sie von 24-Bit-WAV auf 16-Bit-WAV herunterabtastete, sodass sich die Dateneingabepipeline als viel umständlicher herausstellt, als ich erwartet hätte. Das erforderliche Downsampling ist besonders frustrierend. Folgendes versuche ich bisher:
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)
Dies ist der Fehler, den ich beim letzten Schritt erhalte:
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]
Und hier ist der Anfang dieses Saitentensors. Ich bin kein Experte für WAV-Dateien, aber ich denke, der Teil nach "fmt" ist der Ort, an dem die eigentlichen Audiodaten beginnen. Vorher denke ich, es sind alles Metadaten über die Datei.
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'
hb\x05\x00
Teil)?
junk
bis zu dem vorherigen Bytefmt
), um festzustellen, ob er funktioniert? Ich vermute, ihr Decoder ist ziemlich einfach und kann das RIFF / WAVE-Format nicht vollständig verarbeiten .