Дескрипторы функций MFCC для классификации аудио с использованием librosa

Я пытаюсь получить представления одиночных векторных функций для аудиофайлов, которые будут использоваться в задаче машинного обучения (в частности, классификация с использованием нейронной сети). У меня есть опыт в области компьютерного зрения и обработки естественного языка, но мне нужна помощь в ускорении работы с аудиофайлами.

Существует множество дескрипторов функций для аудиофайлов, но кажется, что MFCC используются больше всего для задач классификации аудио. Мой вопрос заключается в следующем: как взять представление MFCC для аудиофайла, который обычно представляет собой матрицу (предположительно), и превратить ее в один вектор функции? В настоящее время я использую librosa.

У меня есть куча аудиофайлов, но все они различаются по форме:

for filename in os.listdir('data'):
    y, sr = librosa.load('data/' + filename)
    print filename, librosa.feature.mfcc(y=y, sr=sr).shape

213493.ogg (20, 2375)
120093.ogg (20, 7506)
174576.ogg (20, 2482)
194439.ogg (20, 14)
107936.ogg (20, 2259)

То, что я сделал бы как человек CV, квантовать эти коэффициенты, выполняя k-средства, а затем использовать что-то вроде scipy.cluster.vq для получения векторов идентичной формы, которую я могу использовать в качестве входных данных для моего NN. Это то, что вы делали бы в звуковом случае, или есть разные/лучшие подходы к этой проблеме?

Ответ 1

Откройте scikits.talkbox. Он имеет различные функции, которые помогут вам генерировать MFCC из аудиофайлов. В частности, вы хотели бы сделать что-то подобное для генерации MFCC.

import numpy as np
import scipy.io.wavfile
from scikits.talkbox.features import mfcc

sample_rate, X = scipy.io.wavfile.read("path/to/audio_file")
ceps, mspec, spec = mfcc(X)
np.save("cache_file_name", ceps) # cache results so that ML becomes fast

Затем, выполняя ML, сделайте что-то вроде:

X = []
ceps = np.load("cache_file_name")
num_ceps = len(ceps)
X.append(np.mean(ceps[int(num_ceps / 10):int(num_ceps * 9 / 10)], axis=0))
Vx = np.array(X)
# use Vx as input values vector for neural net, k-means, etc

Я использовал этот материал, когда создавал инструмент классификации жанров аудио (genreXpose).

PS: Один удобный инструмент для преобразования звука, который я использовал, был PyDub

Ответ 2

Это действительно зависит от задачи. Я бы попробовал kmeans и т.д., Но есть много случаев, когда это может быть не полезно.

Вот несколько хороших примеров использования динамическое изменение времени с помощью librosa.

Также может быть и идея использования скользящих окон известной формы. Тогда вы могли бы рассмотреть предыдущее предсказание и матрицу вероятности перехода.

Ответ 3

Обычно в литературе по классификации аудио все звуковые файлы усекаются до одной длины в зависимости от задачи классификации (т.е. я работаю над устройствами обнаружения падения, поэтому я знаю, что аудиофайлы не должны длиться дольше, чем 1 с это ожидаемая продолжительность события падения).

Затем для каждого аудиофайла вы можете извлекать коэффициенты MFCC для каждого кадра и складывать их вместе, генерируя матрицу MFCC для данного аудиофайла. Поскольку каждый аудиофайл имеет одинаковую длину, и мы предполагаем, что все кадры содержат одинаковое количество выборок, все матрицы будут иметь одинаковый размер.

Ответ 4

Вы можете использовать библиотеки, такие как https://github.com/jsingh811/pyAudioProcessing, чтобы получить функции mfcc, а затем выполнить классификацию с помощью одной команды. Он вычисляет mfcc, получает его в один вектор объектов для каждого аудио и дает возможность выбора из различных классификаторов sklearn для выполнения классификации функций mfcc.