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

Doa*_*Doa 13 python audio machine-learning

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

音频文件有各种各样的功能描述符,但似乎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)
Run Code Online (Sandbox Code Playgroud)

我作为简历人做的是通过做k-means来量化这些系数,然后使用类似scipy.cluster.vq的东西来获得相同形状的向量,我可以将其用作我的NN的输入.这也是你在音频案例中会做的,或者是否有不同/更好的方法解决这个问题?

jaz*_*dev 17

查看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
Run Code Online (Sandbox Code Playgroud)

然后在执行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
Run Code Online (Sandbox Code Playgroud)

我在构建音频类型分类工具(genreXpose)时使用了这些东西.

PS:我使用的一个方便的音频转换工具是PyDub