2014-09-23 39 views
13

我正在嘗試獲取用於機器學習任務(特別是使用神經網絡進行分類)中使用的音頻文件的單個矢量特徵表示。我有計算機視覺和自然語言處理方面的經驗,但我需要一些幫助加快音頻文件的速度。用於使用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的輸入。這是你會在音頻案例中做什麼,或者有什麼不同/更好的方法來解決這個問題?

回答

16

結賬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

3

這真的取決於任務。我會嘗試kmeans等,但有很多情況下可能沒有幫助。

有幾個很好的使用dynamic time warping with librosa的例子。

還有使用已知形狀的滑動窗口的想法,可能也不錯。那麼你可以考慮以前的預測和轉移概率矩陣。

0

通常,在音頻分類文獻中,根據分類任務,所有音頻文件被截斷爲相同長度(即,我正在使用跌倒檢測設備,因此我知道音頻文件不應該持續超過1秒因爲這是跌倒事件的預期持續時間)。

然後,對於每個音頻文件,可以爲每個幀提取MFCC係數並將它們堆疊在一起,從而爲給定的音頻文件生成MFCC矩陣。由於每個音頻文件具有相同的長度,並且我們假定所有幀包含相同數量的樣本,所有矩陣將具有相同的大小。

+0

可以請你分享你的代碼。我正在處理類似的任務。想了解這個方法 – 2018-01-24 14:39:23