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

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

问题描述:

我正在尝试获取用于机器学习任务(特别是使用神经网络进行分类)中使用的音频文件的单个矢量特征表示。我有计算机视觉和自然语言处理方面的经验,但我需要一些帮助加快音频文件的速度。用于使用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) 

我会做一个简历的人是通过做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

+0

我了解它的方式,mfcc功能是一个窗体(numFrames,numMFCCoeffiecients)的二维数组。这是每帧产生MFCC列表。 ceps变量似乎只是一系列的系数。这是为什么?另外X.append行的目的是什么?我真的很好奇这件事,我很感激任何关于此事的灯光 – SasukeIsCool 2016-12-30 12:34:48

这真的取决于任务。我会尝试kmeans等,但有很多情况下可能没有帮助。

有几个很好的使用dynamic time warping with librosa的例子。

还有使用已知形状的滑动窗口的想法,可能也不错。那么你可以考虑以前的预测和转移概率矩阵。

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

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

+0

可以请你分享你的代码。我正在处理类似的任务。想了解这个方法 – 2018-01-24 14:39:23