web-dev-qa-db-fra.com

Importer un fichier wav dans Tensorflow 2

En utilisant Python 3.7 et Tensorflow 2.0, j'ai du mal à lire les fichiers wav du jeu de données UrbanSounds. Cette question et réponse sont utiles car ils expliquent que l'entrée doit être un tenseur de chaîne, mais il semble avoir du mal à dépasser les métadonnées initiales codées dans le fichier et à accéder aux données réelles. Dois-je prétraiter la chaîne avant de pouvoir la charger en tant que tenseur float32 "J'ai déjà dû prétraiter les données en les sous-échantillonnant de wav 24 bits à wav 16 bits, de sorte que le pipeline d'entrée de données s'avère être beaucoup plus lourd que je ne l'aurais cru. Le sous-échantillonnage requis est particulièrement frustrant. Voici ce que j'essaie jusqu'à présent:

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)

Voici l'erreur que j'obtiens à la dernière étape:

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]

Et voici le début de ce tenseur de chaîne. Je ne suis pas un expert des fichiers wav, mais je pense que la partie après "fmt" est l'endroit où les données audio réelles commencent. Avant cela, je pense que ce sont toutes des métadonnées sur le fichier.

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'
8
Alex

Il semble que votre erreur soit liée à TensorFlow qui attend la partie fmt comme début.

Le code de TensorFlow pour le traitement peut être trouvé ici: https://github.com/tensorflow/tensorflow/blob/c9cd1784bf287543d89593ca1432170cdbf694de/tensorflow/core/lib/wav/wav_io.cc#L225

Il y a aussi un problème ouvert, en attente d'une réponse de l'équipe de TensorFlow qui couvre à peu près la même erreur que vous avez fournie. https://github.com/tensorflow/tensorflow/issues/32382

D'autres bibliothèques ignorent simplement la partie indésirable, donc cela fonctionne avec elles.

5
devnull

Il semble que votre code échoue pour le fichier audio double canal. Le code fonctionne pour le fichier wav mono channel. Dans votre cas, vous pouvez essayer d'utiliser scipy.

from scipy.io import wavfile as wav
sampling_rate, data =  wav.read('101415-3-0-2.wav')
3
ravikt