如何从大量的wav文件中使用tensorflow.data.Dataset API创建数据集?

2024-06-17 19:42:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 文件to数据data原始数据rawlabelstf
2条回答

您可以尝试使用一个generator函数将数据输入到pipline中。看看https://www.tensorflow.org/api_docs/python/tf/data/Dataset#from_generator

虽然理论上可以用^{}读取文件,并用^{}对其进行解码,但这种情况下通常的方法是将数据转换为TFRecord格式,然后用^{}读取。This blog post显示了一个如何做到这一点的示例,在您的例子中,您需要一个脚本来读取每个WAV文件,对其进行解码并在文件中写入样本向量(我认为32位值是最简单的方式)。注意,如果要将多个音频文件批处理为一个张量,要么它们的大小必须相同,要么必须使用^{}来形成适当的张量。在

相关问题 更多 >