Я пытаюсь передать 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 и снова читаю его, поплавок колонки Audioмассивы автоматически преобразуются в строковые массивы.Единственный способ, которым я нашел, чтобы сохранить его таким, каким он должен быть, - это сохранить его как файл рассола.
Поскольку мы занимаемся этим, не стесняйтесь предлагать другие способы подачи файлов .wav в нейронную сеть.,Я пытаюсь использовать этот метод вместо спектрограмм, потому что я прочитал здесь , что это не очень хорошая идея.
Решение
Я искалв аналогичные проблемы и нашел простое и элегантное решение.После разделения тест-поезда при передаче колонки аудио в нейронную сеть используйте list(X)
вместо X
.
. При преобразовании файла CSV в массив float в строку это происходит из-заобозначение мощности.В середине чисел есть буква, поэтому Панд записывает ее как число с плавающей точкой, но читает как строку.Как я уже говорил ранее, сохранение фрейма данных в виде файла pickle работает, но его чтение занимает слишком много времени по сравнению с сохранением отдельно столбца аудиозаписей в виде файла .npy.