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'
fuente
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.hb\x05\x00
parte)?Respuestas:
Parece que su error tiene que ver con TensorFlow esperando que la parte fmt sea el comienzo.
El código de TensorFlow para el procesamiento se puede encontrar aquí: https://github.com/tensorflow/tensorflow/blob/c9cd1784bf287543d89593ca1432170cdbf694de/tensorflow/core/lib/wav/wav_io.cc#L225
También hay un problema abierto, en espera de la respuesta del equipo de TensorFlow que cubre aproximadamente el mismo error que usted ha proporcionado. https://github.com/tensorflow/tensorflow/issues/32382
Otras bibliotecas simplemente omiten la parte de Basura, por lo que funciona con ellas.
fuente
Parece que su código falla para el archivo de audio de doble canal. El código funciona para el archivo wav monocanal. En su caso, puede intentar usar scipy.
fuente
junk
en la parte del encabezado y nofmt
?