【发布时间】: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 时,这是自动完成的。