【问题标题】:How to convert .wav files into a Pandas DataFrame in order to feed it to a neural network?如何将 .wav 文件转换为 Pandas DataFrame 以将其提供给神经网络?
【发布时间】:2019-02-15 02:13:41
【问题描述】:

我正在尝试将 .wav 文件提供给神经网络,以便训练它来检测所说的内容。所以我有大约 10 000 个 .wav 文件和音频的转录,但是当我尝试将 CSV 文件提供给神经网络时,我得到了这个错误:ValueError: setting an array element with a sequence.

我正在使用 Soundfile 获取不带标题的 .wav 数据并将其放入列表中。我也尝试过其他库,但结果是一样的。

import os
import numpy as np
from tqdm import tqdm
import pandas as pd
import soundfile as sf

path = os.getcwd() + "/stft wav/"
audios = []
total = len(os.listdir(path))
pbar = tqdm(total = total)
for file in os.listdir(path):
    data, sr = sf.read(path + file)
    audios.append(data)
    pbar.update(1)
pbar.close()

然后我读取带有转录的文件并创建将被馈送到神经网络的数据集。

dict = pd.read_csv("dictionary.csv", sep = '\t')
dataset = pd.DataFrame(columns = ['Audio', 'Word'])
dataset.Audio = audios
dataset.Word = dict.Romaji

数据集现在看起来像这样:

    Audio                                               Word
0   [-2.686136382767934e-11, 1.5804246800144028e-1...   inshou
1   [5.0145061436523974e-09, 1.3923349584388234e-0...   taishou
2   [-2.253151087927563e-08, 2.173326230092698e-08...   genshou
3   [3.0560468644580396e-07, 1.0646554073900916e-0...   kishou
4   [0.0, 2.499070395067804e-12, 1.206467304531999...   chuushouteki

​音频列中的数组大小不同,但我已经尝试用零填充它们,错误消息仍然相同。

这就是我如何填充它以防你想知道:

X = dataset.Audio.copy()
pbar = tqdm(total = len(X['Audio']))
for i in range(0, len(X['Audio'])):
    X['Audio'][i] = np.resize(X['Audio'][i], len(max(X['Audio'], key = len)))
    pbar.update(1)
pbar.close()

我注意到一个奇怪的事情是,当我保存这个 CSV 文件并再次读取它时,音频列的浮点数组会自动转换为字符串数组。我发现保持它应有的方式的唯一方法是将其保存为泡菜文件。

既然我们已经做到了,请随意提出其他方法来将 .wav 文件提供给神经网络。我正在尝试使用这种方法而不是频谱图,因为我读到 here 认为这不是一个好主意。

解决方案

我正在研究类似的问题,并找到了一个简单而优雅的解决方案。在训练测试拆分后,将音频列传递给神经网络时,使用list(X) 而不是仅使用X

关于将浮点数组转换为字符串的 CSV 文件,这是因为幂符号。数字中间有一个字母,所以 Pandas 将其写为浮点数,但将其读取为字符串。正如我之前所说,将数据帧保存为 pickle 文件是可行的,但与将音频列单独保存为 .npy 文件相比,读取时间太长。

【问题讨论】:

  • 您可以使用librosa。它是读取音频文件并将其转换为 NumPy 数组的出色软件包。
  • 我也试过librosa,但问题不在于将列表转换为 NumPy 数组,因为当我将列表附加到 DataFrame 时,这是自动完成的。

标签: python pandas list wav


【解决方案1】:

看起来您已经解决了这个问题,但这里还有一些其他项目似乎没有被提及。首先,wave 是一个 Python 实用程序,包含在我的 Py3.6 安装中。

https://docs.python.org/3/library/wave.html

此代码(有点)被盗from here

from wave import open as open_wave
waveFile = open_wave(<filename>,'rb')
nframes = waveFile.getnframes()
wavFrames = waveFile.readframes(nframes)
ys = numpy.fromstring(wavFrames, dtype=numpy.int16)

这应该使您可以很容易地将数据放入 DF 中,这似乎是您根据线程标题询问的主要项目。

最后,关于 dtype 的 DF 问题,请注意,DataFrame 调用有一个 dtype 强制选项,我曾在您发现自己所处的情况下使用该选项。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2018-12-11
    • 2019-03-05
    • 2015-04-13
    • 2020-08-11
    • 2020-05-06
    相关资源
    最近更新 更多