генерировать mfcc для аудио сегментов на основе аннотированного файла

Моя основная цель - передать функции mfcc в ИНС.

Однако я застрял на этапе предварительной обработки данных, и мой вопрос состоит из двух частей.
ИСТОРИЯ ВОПРОСА:
У меня есть аудио. У меня есть текстовый файл с аннотацией и отметкой времени, например:

0.0 2.5 Music  
2.5 6.05 silence  
6.05 8.34 notmusic  
8.34  12.0  silence  
12.0  15.5 music  

Я знаю, что для одного аудиофайла я могу вычислить mfcc, используя librosa следующим образом:

import librosa
y, sr = librosa.load('abcd.wav')
mfcc=librosa.feature.mfcc(y=y, sr=sr)

Часть 1: Я не могу осмыслить две вещи:
как рассчитать mfcc на основе сегментов из аннотаций.

Часть 2: Как лучше всего хранить эти mfcc для передачи их keras DNN. т.е. все mfcc, рассчитанные для каждого аудиосегмента, должны быть сохранены в один список / словарь. или лучше сохранить их в разных словарях, чтобы все mfcc, принадлежащие одной метке, находились в одном месте.

Я новичок в обработке звука и Python, поэтому я открыт для рекомендаций относительно лучших практик.

Мы с радостью предоставим вам дополнительную информацию. Спасибо.


person kRazzy R    schedule 19.01.2018    source источник


Ответы (1)


Часть 1. Преобразование MFCC в теги

Это не очевидно из документации librosa, но я считаю, что mfcc рассчитываются с частотой кадров около 23 мс. С указанным выше кодом mfcc.shape вернет (20, x), где 20 - количество функций, а x соответствует количеству кадров x. По умолчанию hop_rate для mfcc составляет 512 отсчетов, что означает, что каждый отсчет mfcc занимает около 23 мс (512 / ср).

Используя это, вы можете вычислить, какой фрейм соответствует какому тегу в вашем текстовом файле. Например, значение тега Music изменяется от 0,0 до 2,5 секунд, так что это будет mfcc frame от 0 до 2,5 * sr / 512 ~ = 108. Они не будут точно равными, поэтому вам нужно округлить значения.

Часть 2A. Формат данных DNN

Для ввода (данные mfcc) вам нужно выяснить, как выглядит ввод. У вас будет 20 функций, но вы хотите ввести в сеть один кадр или собираетесь отправить временной ряд. Ваши данные mfcc уже представляют собой массив numpy, однако он отформатирован как (feature, sample). Вероятно, вы захотите отменить это для ввода в Keras. Для этого вы можете использовать numpy.reshape.

Для вывода вам необходимо присвоить числовое значение каждому тегу в текстовом файле. Обычно вы храните tag to integer в словаре. Затем это будет использоваться для создания результатов обучения для сети. Для каждой входной выборки должно быть одно целое число.

Часть 2B. Сохранение данных

Самый простой способ сделать это - использовать pickle для сохранения и перезагрузить позже. Мне нравится использовать класс для инкапсуляции входных, выходных и словарных данных, но вы можете выбрать все, что вам подходит.

person bivouac0    schedule 19.01.2018
comment
спасибо за ответ. Я проверил форму своего mfcc на 1 секунде образца, вы правы, это было похоже на (20, 67). Но для всего аудио. это было (20, 1826). Пока неясно, как использовать аннотированный файл. - person kRazzy R; 19.01.2018
comment
Для аннотированного файла ваши шаги ... 1 перечисляют различные имена тегов. 2-Используйте отметки времени в файле, чтобы присвоить пронумерованное значение тега каждой выборке mfcc. Это означает, что если у вас есть 1826 образцов mfcc, у вас будет 1826 пронумерованных значений на выходе вашей сети. - person bivouac0; 19.01.2018
comment
Другими словами, я создал mfcc, у меня есть аннотации. как я наложил их вместе, чтобы передать их в нейронную сеть следующим образом kaggle.com/louisong97/neural-network-approach-to-iris-dataset - person kRazzy R; 22.01.2018
comment
Вы сделаете что-то похожее на ... x_train = mfcc.reshape (xx) y_train = keras.utils.to_categorical (annotations, num_classes = xx) model.fit (X_train, y_train, ....) Потратьте немного усилия, пытающиеся закодировать это, и если вы дойдете до точки, когда вы не можете преодолеть ошибки, опубликуйте их вместе со своим кодом в новом вопросе. - person bivouac0; 22.01.2018
comment
@ bivouac0 the tag Music goes from 0.0 to 2.5 seconds so that will be mfcc frame 0 to 2.5*sr/512 ~= 108. They will not come out exactly equal so you need to round the values. извините, я не понял, что имеется в виду ... Я пытаюсь решить очень похожий вопрос: stackoverflow.com/questions / 48388641 /, не могли бы вы пролить свет или помочь с небольшим фрагментом кода / псевдокодом и т. Д. О том, как это сделать. Спасибо. - person DJ_Stuffy_K; 30.01.2018
comment
Обратите внимание, что я разместил код для приведенного выше комментария в stackoverflow.com/questions/48388641/ - person bivouac0; 30.01.2018
comment
@ bivouac0 спасибо за ваш ответ, я добился прогресса за последние несколько недель. Теперь у меня есть данные для обучения и модель, но я не могу их соединить. Если возможно, взгляните на мой новый вопрос здесь: stackoverflow.com/questions/48514322/ спасибо - person kRazzy R; 13.02.2018