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'
quelle
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 .hb\x05\x00
Teil)?Antworten:
Es scheint, dass Ihr Fehler damit zu tun hat, dass TensorFlow den fmt-Teil als Anfang erwartet.
Den Code von TensorFlow für die Verarbeitung finden Sie hier: https://github.com/tensorflow/tensorflow/blob/c9cd1784bf287543d89593ca1432170cdbf694de/tensorflow/core/lib/wav/wav_io.cc#L225
Es gibt auch ein offenes Problem, das auf die Antwort des TensorFlow-Teams wartet und ungefähr den gleichen Fehler abdeckt, den Sie angegeben haben. https://github.com/tensorflow/tensorflow/issues/32382
Andere Bibliotheken überspringen einfach den Junk-Teil, damit er mit ihnen funktioniert.
quelle
Es scheint, dass Ihr Code für Zweikanal-Audiodateien fehlschlägt. Der Code funktioniert für Mono-Channel-WAV-Dateien. In Ihrem Fall können Sie versuchen, scipy zu verwenden.
quelle
junk
im Header-Teil enthalten ist und nichtfmt
?