Importar archivo wav en Tensorflow 2

9

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'
Alex
fuente
Para fines de prueba, ¿trató de eliminar el encabezado "basura" manualmente de los datos ( junkhasta el byte anterior fmt) para ver si funciona? Supongo que su decodificador es bastante básico y no puede manejar completamente el formato RIFF / WAVE.
Matthieu
Sí, lo intenté pero todavía no pude hacerlo funcionar.
Alex
¿Y cambió la longitud del encabezado en consecuencia (La hb\x05\x00parte)?
Matthieu
No, no lo hice. ¿A qué tendría que cambiarlo?
Alex
1
Creo que la razón por la que esto parece funcionar en el tensorflow 1.14 es que tf1 usa ejecución diferida, por lo que puede ejecutar audio, sample_rate = tf.audio.decode_wav (input_data) sin obtener un error, pero parece ser solo porque en realidad no lo ha hecho ejecutó el código todavía.
Alex

Respuestas:

6

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.

devnull
fuente
Su respuesta es que esto es un error, y desafortunadamente parece estar en lo correcto. Los enlaces son útiles.
Alex
4

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.

from scipy.io import wavfile as wav
sampling_rate, data =  wav.read('101415-3-0-2.wav')
ravikt
fuente
Esto es útil porque proporciona una alternativa, pero no responde a la pregunta en el sentido de que presumiblemente hay una forma de hacerlo completamente dentro de la biblioteca de tensorflow.
Alex
@Alex, pero ¿el archivo .wav problemático falla con tensorflow trabajando con scipy?
Matthieu
1
@Matthieu El archivo wav problemático funciona con otras bibliotecas pero no con el operador decode_wav de TensorFlow. @ravikt ¿Está seguro de que el encabezado de su archivo mono wav que probó contiene junken la parte del encabezado y no fmt?
Kautham Krishna el