#python #numpy #export-to-csv #librosa
Вопрос:
Я пытаюсь создать набор данных аудио для проекта. Для этого я просматриваю свои аудиофайлы (45-секундные mp3-клипы) с помощью Librosa и записываю 3 фрагмента данных в csv. Один — это метка для каждого клипа (строка), второй-звук в виде временного ряда с плавающей запятой, а третий-частота дискретизации. Для этого я создаю словарь из 3 и пишу в csv. Временной ряд с плавающей запятой представляет собой ndarray. Когда я печатаю длину, она возвращает значение 992250. Когда он записывает в файл, он записывает 7 значений (первые 3 и последние 3 с элементом » … » посередине. Проверил это, когда прочитал файл в другой функции, загружающейся в фрейм данных. Могу ли я получить помощь в решении этой проблемы? Спасибо.
Я должен добавить, что я впервые попытался создать фрейм данных и использовал df.to_csv() до этой версии. Ни то, ни другое не работает, у них обоих одна и та же проблема. Я также поискал другие варианты в Интернете, и похоже, что массив Numpy может напрямую записываться в csv? Но мне также нужно, чтобы в каждой строке была метка («ragam» ниже) и «sr».
with open('audio_data.csv', 'w') as f:
writer = csv.DictWriter(f, fieldnames=headers)
writer.writeheader()
for i, file in enumerate(flst):
if file.endswith(".mp3"):
audio, sr = librosa.core.load(os.getcwd() folderpath "/" file)
print(type(audio))
print(str(len(audio)))
ragam = file.split(sep='-')[0]
elem = {
'ragam': ragam,
'audio': audio,
'sr': sr
}
writer.writerow(elem)
print("Completed: " str(i 1) " of " str(total) " ...")
Я решил постепенно добавлять данные в csv, потому что это большой набор данных, и я хотел бы попытаться сохранить любой достигнутый прогресс в случае, если что-то не получится на полпути. Вот пример вывода.
Loading audio data ...
/usr/local/lib/python3.7/dist-packages/librosa/core/audio.py:165: UserWarning: PySoundFile failed. Trying audioread instead.
warnings.warn("PySoundFile failed. Trying audioread instead.")
<class 'numpy.ndarray'>
992250
Completed: 1 of 5 ...
Комментарии:
1. Файл CSV-это ужасный способ хранения аудио. Он будет в 10 раз больше, чем несжатый . WAV, который уже довольно большой. Просто напишите функцию, которая загружает аудиоданные из папки с аудиофайлами (и необязательный CSV-файл с метаданными).
2. Да, действительно. Понял это сразу после того, как я реализовал приведенное ниже предложение. У меня уже есть набор данных в виде небольших mp3-клипов. Первый раз работаю со звуком. Было, мягко говоря, интересно.
Ответ №1:
Метод writerow
преобразует каждый сложный объект в словаре elem
в его строковое представление, вот почему вы получаете этот неожиданный вывод.
Простой обходной путь заключается в преобразовании np.array
в a list
, т. е. с помощью
elem = {
'ragam': ragam,
'audio': audio.tolist(),
'sr': sr
}
С этой поправкой вывод кажется хорошим, но список сохраняется в виде строки, и поэтому нелегко восстановить исходный массив, считывая выходной csv.
Альтернативный подход состоит в том, чтобы сохранить все как JSON, потому что JSON изначально поддерживает списки и словари.