首页 > 解决方案 > 应该如何使用大量 wav 文件中的 tensorflow.data.Dataset api 创建数据集?

问题描述

我有 8,742 个 wav 文件(大约 7.1GB)并且想将原始数据放入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函数调用该函数,以便整个过程成为图形的一部分并并行化。

我对提议的解决方案的第一个担忧是,将文件名存储在数据集中以稍后被相应的数据替换并不理想,而且似乎有点“hacky”。我的第二个担心是我使用的 GPU(1080Ti 和 11GB 内存)可能会耗尽内存。

请提供一种更好的方法(特别是它应该更快)将原始音频数据从大量 wav 文件中获取到tf.data.Dataset.

标签: pythontensorflowaudiowavtensorflow-datasets

解决方案


尽管理论上您可以使用 读取文件tf.read_file并对其进行解码tf.contrib.ffmpeg.decode_audio,但这种情况的常用方法是将数据转换为 TFRecord 格式并使用tf.data.TFRecordDataset. 这篇博客文章展示了如何做到这一点的示例,在您的情况下,您需要一个脚本来读取每个 WAV 文件,对其进行解码并写入样本向量(我认为 32 位值将是最简单的方法)文件。请注意,如果您想将多个音频文件批处理到一个张量中,它们必须具有相同的大小,或者您必须使用它tf.data.Dataset.padded_batch来形成适当的张量。


推荐阅读