【问题标题】:How to load dataset of wav audios into TensorFlow如何将 wav 音频数据集加载到 TensorFlow 中
【发布时间】:2018-05-02 16:29:38
【问题描述】:

我正在尝试使用 TensorFlow 训练标准的全连接神经网络(又名多层感知器)。我正在学习一个教程,其中使用 MNIST 手写数字数据集 (http://yann.lecun.com/exdb/mnist/) 训练了一个类似的神经网络。

但是,TensorFlow 提供了一些内置操作,我无法真正复制。

例如: 要加载数据,它会调用以下函数:

from tensorflow.examples.tutorials.mnist import input_data    
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

或从数据中加载下一批,它调用以下函数:

batch_x, batch_y = mnist.train.next_batch(batch_size)

有人知道音频数据的类似实现吗?我希望输入是 wav 文件的原始数据。我的数据结构是这样的:

data/
    train/
       up/
         ...
       down/
         ...
       ...
     test/
       up/
         ...
       down/
         ...
       ...

     validate/
       up/
         ...
       down/
         ...
       ...

提前谢谢你!

【问题讨论】:

  • 看看DCASE,这里有一个健康的社区。​​span>

标签: python audio tensorflow machine-learning


【解决方案1】:

没有专门用于导入音频数据的内置操作。

不过,您可以先看看this 的实现。

您可以首先使用生成音频文件列表

def load_data(data_dir):
    """ Return 2 lists of tuples:
    [(class_id, user_id, path), ...] for train
    [(class_id, user_id, path), ...] for validation
    """
    # Just a simple regexp for paths with three groups:
    # prefix, label, user_id
    pattern = re.compile("(.+\/)?(\w+)\/([^_]+)_.+wav")
    all_files = glob(os.path.join(data_dir, 'train/audio/*/*wav'))

    with open(os.path.join(data_dir, 'train/validation_list.txt'), 'r') as fin:
        validation_files = fin.readlines()
    valset = set()
    for entry in validation_files:
        r = re.match(pattern, entry)
        if r:
            valset.add(r.group(3))

然后创建一个生成器函数以将文件提供给您的 Tensorflow 模型:

def data_generator(data, params, mode='train'):
    def generator():
        if mode == 'train':
            np.random.shuffle(data)
        # Feel free to add any augmentation
        for (label_id, uid, fname) in data:
            try:
                _, wav = wavfile.read(fname)
                wav = wav.astype(np.float32) / np.iinfo(np.int16).max

                L = 16000  # be aware, some files are shorter than 1 sec!
                if len(wav) < L:
                    continue
                # let's generate more silence!
                samples_per_file = 1 if label_id != name2id['silence'] else 20
                for _ in range(samples_per_file):
                    if len(wav) > L:
                        beg = np.random.randint(0, len(wav) - L)
                    else:
                        beg = 0
                    yield dict(
                        target=np.int32(label_id),
                        wav=wav[beg: beg + L],
                    )
            except Exception as err:
                print(err, label_id, uid, fname)

    return generator

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 2013-12-31
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多