繁体   English   中英

如何使用来自大量wav文件的tensorflow.data.Dataset api创建数据集?

[英]How should one create a dataset using the tensorflow.data.Dataset api from a large set of wav files?

我有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

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

您可以尝试使用生成器函数将数据提供给pipline。 看看https://www.tensorflow.org/api_docs/python/tf/data/Dataset#from_generator

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM