Python 如何使用tensorflow.data.dataset api从大量wav文件创建数据集?
我有8742个wav文件(大约7.1GB),希望将原始数据放入Python 如何使用tensorflow.data.dataset api从大量wav文件创建数据集?,python,tensorflow,audio,wav,tensorflow-datasets,Python,Tensorflow,Audio,Wav,Tensorflow Datasets,我有8742个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 i
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))
这个解决方案的问题是,当soundfile读取所有原始数据并将其存储在一个列表中时,速度非常慢
我现在正在考虑一个解决方案,在这个解决方案中,我最初将文件名和相应的标签存储在tf.data.Dataset
中。然后,我将创建一个映射函数,该函数调用soundfile.read
,甚至可能在函数中使用tensorflow.contrib.framework.python.ops.audio\u ops
,只返回原始音频和相应的标签。该函数将使用tf.data.Dataset.map
函数调用,以便整个过程成为图形的一部分并被并行化
我对建议的解决方案的第一个担忧是,将文件名存储在数据集中,以便稍后由相应的数据替换,这并不理想,而且似乎有点“黑客”。我的第二个担忧是,我使用的GPU(1080Ti,11GB内存)可能会耗尽内存
请提供一种更好的方法(特别是它应该更快)将原始音频数据从一大组wav文件中获取到
tf.data.Dataset
虽然理论上您可以使用读取文件并使用解码,但这种情况下通常的方法是将数据转换为TFRecord格式,然后使用。显示了如何执行此操作的示例,在您的案例中,您需要一个脚本来读取每个WAV文件,对其进行解码并在文件中写入样本向量(我认为32位值是最简单的方法)。请注意,如果要将多个音频文件批处理为一个张量,则它们必须具有相同的大小,或者必须使用以形成适当的张量。您可以尝试使用生成器函数将数据输入管道。看看每个声音文件的采样数是否都相同?否则,我想如果您想在一个批处理中有多个wav文件,您需要添加填充?显然有,但一般来说,最简单的方法是先看后看。嗯,我认为它们都是立体的,所以样本数相同,但帧数不同。所以我一定会把它们填好,谢谢:)。如果可能的话,我最好避免使用tfrecord选项。我希望网络能够根据原始数据进行训练和推断。由于我必须为任何tf函数(包括“tf.contrib.ffmpeg.decode_audio”)提供张量,我是否应该使用文件名创建一个数据集并使用映射函数?对于TFRecords,您将在原始数据上进行训练,如果您将解码的WAV文件直接放入,它只是一种文件格式。无论如何,如果要使用,您必须给出文件列表(或使用)并用该函数映射它们。@jdehesa虽然这不是我想要的解决方案,但使用tfrecords似乎是处理太大而无法放入内存的数据的“tensorflowy”(可接受的tensorflow相当于“pythonic”:P?)方法。看来我遇到的问题是内存,而不是soundfile.read的速度。因此,这是一个可接受的解决方案。如果你把这个写进一个答案,那么我很乐意接受。谢谢,Michael。@jdehesa出于好奇,人们是否曾经使用文件名队列或类似的东西将数据读入tf.data.Dataset?这非常有效,我想大多数人都使用上面给我的tfRecord解决方案。但是我想tf.data.Dataset api还是很新的。谢谢你的回答,Michael.Np。顺便说一句根据您的用例,您甚至可以编写自己的tf数据读取器。文档相当隐蔽:)