Importar arquivo wav no Tensorflow 2

9

Usando o Python 3.7 e o Tensorflow 2.0, estou tendo dificuldades para ler arquivos wav do conjunto de dados UrbanSounds. Esta pergunta e resposta são úteis porque explicam que a entrada deve ser um tensor de cadeia, mas parece que está tendo dificuldade em superar os metadados iniciais codificados no arquivo e acessar os dados reais. Preciso pré-processar a string antes de poder carregá-la como um tensor float32? Eu já tinha que pré-processar os dados diminuindo a amostragem de wav de 24 bits para wav de 16 bits, para que o pipeline de entrada de dados esteja se tornando muito mais complicado do que eu esperava. A redução da amostra necessária é particularmente frustrante. Aqui está o que estou tentando até agora:

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 é o erro que recebo na última etapa:

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]

E aqui está o começo desse tensor de cordas. Não sou especialista em arquivos wav, mas acho que a parte após "fmt" é onde os dados de áudio reais são iniciados. Antes disso, acho que são todos os metadados do arquivo.

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
fonte
Para fins de teste, você tentou remover manualmente o cabeçalho "lixo" dos dados ( junkaté o byte anterior fmt) para verificar se está funcionando? Meu palpite é que o decodificador é bastante básico e não consegue lidar totalmente com o formato RIFF / WAVE.
Matthieu
Sim, eu tentei isso, mas ainda não consegui fazê-lo funcionar.
11809 Alex
E você mudou o comprimento do cabeçalho de acordo (A hb\x05\x00peça)?
Matthieu
Não, eu não fiz. O que eu teria que mudar para isso?
11809 Alex
1
Eu acho que a razão pela qual isso parece funcionar no tensorflow 1.14 é que o tf1 usa execução lenta, para que você possa executar o áudio, sampling_rate = tf.audio.decode_wav (input_data) sem obter um erro, mas parece ser apenas porque na verdade não ocorreu executou o código ainda.
Alex

Respostas:

6

Parece que seu erro está relacionado ao TensorFlow, esperando a parte fmt como o início.

O código do TensorFlow para o processamento pode ser encontrado aqui: https://github.com/tensorflow/tensorflow/blob/c9cd1784bf287543d89593ca1432170cdbf694de/tensorflow/core/lib/wav/wav_io.cc#L225

Também há um problema em aberto, aguardando resposta da equipe do TensorFlow, que cobre aproximadamente o mesmo erro que você forneceu. https://github.com/tensorflow/tensorflow/issues/32382

Outras bibliotecas apenas pulam a parte de Lixo, para que funcione com elas.

devnull
fonte
Sua resposta é que isso é um bug e, infelizmente, você parece estar correto. Os links são úteis.
18719 Alex
4

Parece que seu código falha no arquivo de áudio de dois canais. O código funciona para o arquivo wav de canal mono. No seu caso, você pode tentar usar o scipy.

from scipy.io import wavfile as wav
sampling_rate, data =  wav.read('101415-3-0-2.wav')
Ravikt
fonte
Isso é útil porque fornece uma alternativa, mas não responde à pergunta no sentido de que, presumivelmente, existe uma maneira de fazer isso inteiramente na biblioteca do tensorflow.
21419 Alex
@ Alex, mas o arquivo .wav problemático está falhando com o tensorflow trabalhando com o scipy?
Matthieu
1
@ Matthieu O problemático arquivo wav funciona com outras bibliotecas, mas não com o operador decode_wav do TensorFlow. @ravikt Tem certeza de que o cabeçalho do seu arquivo wav mono que você testou contém junkna parte do cabeçalho e não fmt?
Kautham Krishna 31/10/19