我有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 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_ops
,只返回原始音频和相应的标签。该函数将使用tf.data.Dataset.map
函数调用,以便整个过程成为图形的一部分并被并行化。在
我对所提出的解决方案的第一个顾虑是,它并不理想,而且在数据集中存储文件名,以便稍后用相应的数据替换,这似乎有点“老土”。我的第二个问题是我使用的GPU(1080Ti,11GB内存)可能会耗尽内存。在
请提供一个更好的方法(尤其是它应该更快)将原始音频数据从一个大的wav文件集中到tf.data.Dataset
。在
您可以尝试使用一个generator函数将数据输入到pipline中。看看https://www.tensorflow.org/api_docs/python/tf/data/Dataset#from_generator
虽然理论上可以用^{} 读取文件,并用^{} 对其进行解码,但这种情况下通常的方法是将数据转换为TFRecord格式,然后用^{} 读取。This blog post显示了一个如何做到这一点的示例,在您的例子中,您需要一个脚本来读取每个WAV文件,对其进行解码并在文件中写入样本向量(我认为32位值是最简单的方式)。注意,如果要将多个音频文件批处理为一个张量,要么它们的大小必须相同,要么必须使用^{} 来形成适当的张量。在
相关问题 更多 >
编程相关推荐