У меня есть 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
.