Как создать набор данных, используя API tenorsflow.data.Dataset из большого набора файлов WAV? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть 8 742 wav-файла (объемом около 7.1 ГБ), и я хотел бы получить необработанные данные в tf.data.Dataset.

Моя первая попытка ниже. Обратите внимание, что я использовал пакет soundfile, поскольку файлы wav имеют разную скорость передачи данных, а некоторые - 24 бит на семпл. Насколько я понимаю, многие пакеты не поддерживают 24-битные файлы WAV.

import tensorflow as tf
import soundfile

filepaths = tf.gfile.Glob('michael/dataset/wav_filepaths/*.wav') #Get the files into a list

labels = get_labels #pseudo function to obtain corresponding labels to audio

raw_audio = [] #List to hold raw audio lists. These are 2 channel wavs so this will be a 3D list

#Create a list were each element is raw audio data
for f in filepaths:
    try:
        data, sample_rate = soundfile.read(f) #2 channels
        raw_audio.append(data.tolist())
    except Exception as err: #Poor practice to catch all exceptions like this but it is just an example
        print ('Exception')
        print (f)

training_set = tf.data.Dataset.from_tensor_slices((raw_audio, labels))

Проблема этого решения заключается в том, что оно ужасно медленное, поскольку звуковой файл читает все необработанные данные и сохраняет их в списке.

Сейчас я рассматриваю решение, в соответствии с которым я изначально храню имена файлов и соответствующие метки в tf.data.Dataset. Затем я создал бы функцию отображения, которая вызывает soundfile.read или, возможно, даже использует tensorflow.contrib.framework.python.ops.audio_ops внутри функции и возвращает только необработанный звук и соответствующую метку. Функция вызывается с использованием функции tf.data.Dataset.map, так что весь процесс становится частью графа и распараллеливается.

Мое первое беспокойство по поводу предложенного решения заключается в том, что оно не является идеальным и кажется немного «хакерским» для хранения имен файлов в наборе данных, которые впоследствии будут заменены соответствующими данными. Мое второе беспокойство связано с тем, что в используемом мной графическом процессоре (1080Ti с 11 ГБ памяти) может не хватить памяти.

Пожалуйста, предоставьте лучший способ (в частности, он должен быть быстрее) для получения необработанных аудиоданных из большого набора файлов wav в tf.data.Dataset.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы можете попробовать использовать функцию генератора, которая подает данные в трубопровод. Взгляните на https://www.tensorflow.org/api_docs/python/tf/data/Dataset#from_generator

0 голосов
/ 05 сентября 2018

Хотя теоретически вы можете читать файлы с помощью tf.read_file и декодировать их с помощью tf.contrib.ffmpeg.decode_audio, обычный подход для такого рода случаев заключается в преобразовании данных в TFRecord. отформатируйте и прочитайте его с tf.data.TFRecordDataset. В этом блоге показан пример того, как это сделать, в вашем случае вам понадобится скрипт, который читает каждый WAV-файл, декодирует его и записывает вектор сэмплов (я полагаю, что 32-битное значение быть самым простым способом) в файле. Обратите внимание, что если вы хотите объединить несколько аудиофайлов в тензор, либо они должны иметь одинаковый размер, либо вам придется использовать tf.data.Dataset.padded_batch для формирования правильных тензоров.

...