Utilizando Python 3.7 y Tensorflow 2.0, me cuesta leer archivos wav del conjunto de datos de UrbanSounds. Esta pregunta y respuesta son útiles porque explican que la entrada debe ser un tensor de cadena, pero parece estar teniendo dificultades para pasar los metadatos iniciales codificados en el archivo y llegar a los datos reales. ¿Tengo que preprocesar la cadena antes de poder cargarla como un tensor float32? Ya tenía que preprocesar los datos reduciéndolos de wav de 24 bits a wav de 16 bits, por lo que la canalización de entrada de datos resulta ser mucho más engorrosa de lo que esperaba. La disminución de la resolución requerida es particularmente frustrante. Esto es lo que estoy intentando hasta ahora:
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)
Este es el error que obtengo en el último paso:
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]
Y aquí está el comienzo de ese tensor de cuerda. No soy un experto en archivos wav, pero creo que la parte después de "fmt" es donde comienzan los datos de audio reales. Antes de eso, creo que se trata de metadatos sobre el archivo.
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
parte)?
junk
hasta el byte anteriorfmt
) para ver si funciona? Supongo que su decodificador es bastante básico y no puede manejar completamente el formato RIFF / WAVE.