使用librosa进行音频分类的MFCC特征描述符



我正试图获得音频文件的单向量特征表示,以用于机器学习任务(特别是使用神经网络进行分类)。我在计算机视觉和自然语言处理方面有经验,但我需要一些帮助来加快音频文件的速度。

音频文件有各种各样的特征描述符,但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的输入。在音频情况下,你也会这样做吗?或者有不同/更好的方法来解决这个问题吗?

查看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

这实际上取决于任务。我会尝试kmean等,但在很多情况下,这可能没有帮助。

在librosa中使用动态时间扭曲有几个很好的例子。

还有一种想法是使用已知形状的滑动窗,可能也很好。然后你可以考虑之前的预测和一个转移概率矩阵。

通常,在音频分类文献中,所有音频文件都会根据分类任务截断为相同的长度(即,我正在使用跌倒检测设备,所以我知道音频文件的持续时间不应超过1s,因为这是跌倒事件的预期持续时间)。

然后,对于每个音频文件,您可以提取每个帧的MFCC系数,并将它们堆叠在一起,为给定的音频文件生成MFCC矩阵。由于每个音频文件都有相同的长度,并且我们假设所有帧都包含相同数量的样本,因此所有矩阵都将具有相同的大小。

您可以使用以下库https://github.com/jsingh811/pyAudioProcessing用于获得mfcc功能,然后使用一个命令完成分类。它计算mfcc,将其转换为每个音频的一个特征向量,并提供从不同的sklearn分类器中进行选择以对mfcc特征进行分类的选项。

最新更新