Как преобразовать WAV-файлы в Pandas DataFrame, чтобы передать его в нейронную сеть? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь передать 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.

1 Ответ

0 голосов
/ 22 марта 2019

Похоже, вы уже решили это, но вот еще пара вещей, о которых, похоже, не упоминалось.Во-первых, wave - это утилита Python, которая была включена в мою установку Py3.6.

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

Этот код (сорт) украден отсюда :

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 довольно легко, который, по-видимому, является основным элементом, о котором вы спрашиваете, основываясь на заголовке вашего потока.

Наконец, что касается ваших проблем DF с dtypes, обратите внимание, что у вызова DataFrame есть опция форсирования dtype, которую я имеюиспользуется в ситуациях, подобных той, в которой вы оказались.

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

...