Importieren Sie die WAV-Datei in Tensorflow 2

8

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'
Alex
quelle
Haben Sie zu Testzwecken versucht, den "Junk" -Header manuell aus den Daten zu entfernen (von junkbis zu dem vorherigen Byte fmt), um festzustellen, ob er funktioniert? Ich vermute, ihr Decoder ist ziemlich einfach und kann das RIFF / WAVE-Format nicht vollständig verarbeiten .
Matthieu
Ja, ich habe es versucht, aber ich konnte es immer noch nicht zum Laufen bringen.
Alex
Und haben Sie die Header-Länge entsprechend geändert (Das hb\x05\x00Teil)?
Matthieu
Nein, habe ich nicht. Was müsste ich ändern?
Alex
1
Ich denke, der Grund, warum dies in Tensorflow 1.14 zu funktionieren scheint, ist, dass tf1 eine verzögerte Ausführung verwendet, sodass Sie Audio, sample_rate = tf.audio.decode_wav (input_data) ausführen können, ohne einen Fehler zu erhalten, dies jedoch nur deshalb zu sein scheint, weil dies nicht der Fall ist hat den Code noch ausgeführt.
Alex

Antworten:

5

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.

devnull
quelle
Ihre Antwort ist, dass dies ein Fehler ist, und leider scheinen Sie richtig zu sein. Die Links sind hilfreich.
Alex
3

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.

from scipy.io import wavfile as wav
sampling_rate, data =  wav.read('101415-3-0-2.wav')
Ravikt
quelle
Dies ist hilfreich, da es eine Alternative darstellt, aber die Frage nicht in dem Sinne beantwortet, dass es vermutlich eine Möglichkeit gibt, dies vollständig innerhalb der Tensorflow-Bibliothek zu tun.
Alex
@ Alex, aber schlägt die problematische WAV-Datei fehl, wenn Tensorflow mit Scipy funktioniert?
Matthieu
1
@Matthieu Die problematische WAV-Datei funktioniert mit anderen Bibliotheken, jedoch nicht mit dem decode_wav-Operator von TensorFlow. @ravikt Sind Sie sicher, dass der Header Ihrer getesteten Mono-WAV-Datei junkim Header-Teil enthalten ist und nicht fmt?
Kautham Krishna