2014-09-23 6 views
13

Ich versuche, einzelne Vektor-Feature-Repräsentationen für Audio-Dateien für eine maschinelle Lernaufgabe (insbesondere Klassifizierung mit einem neuronalen Netz) zu erhalten. Ich habe Erfahrung in Computer Vision und Verarbeitung natürlicher Sprache, aber ich brauche Hilfe, um mit Audiodateien auf dem Laufenden zu sein.MFCC Feature Deskriptoren für Audio-Klassifizierung mit Librosa

Es gibt eine Vielzahl von Featuredeskriptoren für Audiodateien, aber MFCCs werden am häufigsten für Audioklassifizierungsaufgaben verwendet. Meine Frage ist folgende: Wie nehme ich die MFCC-Repräsentation für eine Audiodatei, die normalerweise eine Matrix (vermutlich Koeffizienten) ist, und verwandle sie in einen einzigen Merkmalsvektor? Ich verwende derzeit librosa dafür.

Ich habe eine Reihe von Audio-Dateien, aber sie alle unterscheiden sich in ihrer Form:

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) 

Was ich tun würde, als ein CV Person, die diese Koeffizienten quantisiert von k-Mittel tut und dann so etwas wie scipy.cluster.vq verwenden um Vektoren mit identischer Form zu erhalten, die ich als Eingabe für mein NN verwenden kann. Würden Sie das auch im Audiokasten tun, oder gibt es andere/bessere Ansätze für dieses Problem?

Antwort

16

Auschecken scikits.talkbox. Es hat verschiedene Funktionen, mit denen Sie MFCC aus Audiodateien generieren können. Insbesondere würden Sie so etwas machen, um MFCCs zu generieren.

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 

Dann, während ML tun, so etwas wie:

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 

ich dieses Zeug verwendet, als ich ein Audio-Genre Klassifizierungstool Gebäude (genreXpose).

PS: Ein handliches Werkzeug für die Audio-Konvertierung, die ich verwendet wurde PyDub

+0

Die Art, wie ich es verstehe, mfcc Features sind ein 2d-Array der Form (numFrames, numMFCCoeffiecients). Das heißt, jeder Rahmen liefert eine Liste von MFCCs. Die ceps-Variable scheint nur ein 1d-Array von Koeffizienten zu sein. Warum ist das so? Was ist der Zweck der X.append-Linie? Ich bin wirklich neugierig darauf und ich würde mich über jedes Licht freuen, das auf die Angelegenheit – SasukeIsCool

3

Es ist wirklich an der Aufgabe abhängt. Ich würde Kmeans usw. versuchen, aber es gibt eine Menge Fälle, wo das nicht hilfreich sein könnte.

Es gibt ein paar gute Beispiele für die Verwendung von dynamic time warping with librosa.

Es gibt auch die Idee, ein Schiebefenster einer bekannten Form zu verwenden, könnte auch gut sein. Dann könnten Sie die vorherige Vorhersage und eine Übergangswahrscheinlichkeitsmatrix betrachten.

0

Normalerweise werden in der Audioklassifikationsliteratur alle Audiodateien auf die gleiche Länge gekürzt, je nach Klassifizierungsaufgabe (dh ich arbeite an Falldetektionsgeräten, sodass ich weiß, dass die Audiodateien nicht länger als 1s dauern sollten da dies die erwartete Dauer eines Falles ist).

Dann können Sie für jede Audiodatei MFCC-Koeffizienten für jeden Rahmen extrahieren und sie zusammenstapeln, um die MFCC-Matrix für eine bestimmte Audiodatei zu erzeugen. Da jede Audiodatei die gleiche Länge hat und wir davon ausgehen, dass alle Frames die gleiche Anzahl von Samples enthalten, haben alle Matrizen dieselbe Größe.

+0

fällt, könnten Sie bitte Ihren Code teilen. Ich arbeite an einer ähnlichen Aufgabe. möchte den Ansatz verstehen –

Verwandte Themen