Импортировать wav-файл в Tensorflow 2 - PullRequest
8 голосов
/ 09 октября 2019

Используя Python 3.7 и Tensorflow 2.0, мне трудно читать файлы wav из набора данных UrbanSounds. Этот вопрос и ответ полезны, потому что они объясняют, что ввод должен быть строковым тензором, но, похоже, ему трудно пройти через исходные метаданные, закодированные в файле, и добраться до реальных данных,Должен ли я предварительно обработать строку перед тем, как загрузить ее в качестве тензора float32? Мне уже приходилось предварительно обрабатывать данные путем понижающей дискретизации с 24-битного wav до 16-битного wav, поэтому конвейер ввода данных оказывается гораздо более громоздким, чем я ожидал. Требуемая понижающая выборка особенно расстраивает. Вот что я пытаюсь сделать до сих пор:

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)

Это ошибка, которую я получаю на последнем шаге:

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]

И вот начало этого тензора строки. Я не эксперт по wav-файлам, но я думаю, что часть после «fmt» - это то, где начинаются реальные аудиоданные. До этого я думаю, что это все метаданные о файле.

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'

Ответы [ 2 ]

4 голосов
/ 18 октября 2019

Кажется, ваша ошибка связана с тем, что TensorFlow ожидает начало fmt как начало.

Код TensorFlow для обработки можно найти здесь: https://github.com/tensorflow/tensorflow/blob/c9cd1784bf287543d89593ca1432170cdbf694de/tensorflow/core/lib/wav/wav_io.cc#L225

Есть также открытая проблема, ожидающая ответа от команды TensorFlow, которая примерно покрывает ту же ошибку, которую вы предоставили. https://github.com/tensorflow/tensorflow/issues/32382

Другие библиотеки просто пропускают часть мусора, поэтому она работает с ними.

2 голосов
/ 16 октября 2019

Кажется, что ваш код не работает для двухканального аудиофайла. Код работает для одноканального WAV-файла. В вашем случае вы можете попробовать использовать scipy.

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