如何将.wav文件转换为pandas数据框架以将其馈送到神经网络



我正在尝试将.wav文件馈送到神经网络中,以训练它以检测所说的内容。因此,我有大约10 000 .wav文件和音频的转录,但是当我尝试将CSV文件馈送到神经网络时,我会收到此错误:ValueError: setting an array element with a sequence.

我正在使用隔音来获取.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文件馈送到神经网络。我试图使用此方法而不是频谱图,因为我在这里读到这不是一个好主意。

解决方案

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

关于CSV文件将浮点数阵列转换为字符串,这是因为幂符。数字中间有一个字母,所以Pandas将其写入浮动,但将其读为字符串。正如我之前所说,将数据框保存为泡菜文件有效,但是与单独保存音频列作为.npy文件相比,阅读时间太长了。

看起来您已经解决了这个问题,但是这里有几个看起来尚未提及的项目。首先,Wave是我的py3.6安装中包含的Python实用程序。

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

此代码是(sorta)从这里偷来的:

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中,这似乎是您根据线程标题询问的主要项目。

最后,关于DFES的DF问题,请注意,DataFrame Invocation具有DTYPE强迫选项,我在您发现自己的情况下使用了该选项。

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

最新更新