Maria@4
|
1 # -*- coding: utf-8 -*-
|
Maria@4
|
2 """
|
Maria@4
|
3 Created on Mon Oct 19 12:58:07 2015
|
Maria@4
|
4
|
Maria@4
|
5 @author: mariapanteli
|
Maria@4
|
6 """
|
Maria@4
|
7 import librosa
|
Maria@4
|
8 import scipy.signal
|
Maria@4
|
9 import numpy
|
Maria@4
|
10
|
Maria@4
|
11 class MFCCs:
|
Maria@4
|
12 def __init__(self):
|
Maria@4
|
13 self.y = None
|
Maria@4
|
14 self.sr = None
|
Maria@4
|
15 self.melspec = None
|
Maria@4
|
16 self.melsr = None
|
Maria@4
|
17 self.win1 = None
|
Maria@4
|
18 self.hop1 = None
|
Maria@4
|
19 self.mfccs = None
|
Maria@4
|
20
|
Maria@4
|
21 def load_audiofile(self, filename='test.wav', sr=None, segment=True):
|
Maria@4
|
22 self.y, self.sr = librosa.load(filename, sr=sr)
|
Maria@4
|
23 if segment:
|
Maria@4
|
24 tracklength = self.y.shape[0]/float(self.sr)
|
Maria@4
|
25 startSample = 0
|
Maria@4
|
26 endSample = None
|
Maria@4
|
27 if tracklength > 90:
|
Maria@4
|
28 startPointSec = (tracklength/2.)-20
|
Maria@4
|
29 startSample = round(startPointSec*self.sr)
|
Maria@4
|
30 endSample = startSample+45*self.sr
|
Maria@4
|
31 self.y = self.y[startSample:endSample]
|
Maria@4
|
32
|
Maria@4
|
33 def mel_spectrogram(self, y=None, sr=None):
|
Maria@4
|
34 if self.y is None:
|
Maria@4
|
35 self.y = y
|
Maria@4
|
36 if self.sr is None:
|
Maria@4
|
37 self.sr = sr
|
Maria@4
|
38 win1 = int(round(0.04*self.sr))
|
Maria@4
|
39 hop1 = int(round(win1/8.))
|
Maria@4
|
40 nfft1 = int(2**numpy.ceil(numpy.log2(win1)))
|
Maria@4
|
41 nmels = 40
|
Maria@4
|
42 D = numpy.abs(librosa.stft(self.y, n_fft=nfft1, hop_length=hop1, win_length=win1, window=scipy.signal.hamming))**2
|
Maria@4
|
43 #melspec = librosa.feature.melspectrogram(S=D, sr=self.sr, n_mels=nmels)
|
Maria@4
|
44 melspec = librosa.feature.melspectrogram(S=D, sr=self.sr, n_mels=nmels, fmax=8000)
|
Maria@4
|
45 melsr = self.sr/float(hop1)
|
Maria@4
|
46 self.melspec = melspec
|
Maria@4
|
47 self.melsr = melsr
|
Maria@4
|
48
|
Maria@4
|
49 def calc_mfccs(self, y=None, sr=None):
|
Maria@4
|
50 if self.y is None:
|
Maria@4
|
51 self.y = y
|
Maria@4
|
52 if self.sr is None:
|
Maria@4
|
53 self.sr = sr
|
Maria@4
|
54 # require log-amplitude
|
Maria@4
|
55 self.mfccs = librosa.feature.mfcc(S=librosa.logamplitude(self.melspec), n_mfcc=21)
|
Maria@4
|
56 # remove DCT component
|
Maria@4
|
57 self.mfccs = self.mfccs[1:,:]
|
Maria@4
|
58
|
Maria@4
|
59 def get_mfccs(self, filename='test.wav', secondframedecomp=False):
|
Maria@4
|
60 self.load_audiofile(filename=filename)
|
Maria@4
|
61 self.mel_spectrogram()
|
Maria@4
|
62 self.calc_mfccs()
|
Maria@4
|
63
|
Maria@4
|
64 if secondframedecomp:
|
Maria@4
|
65 win2 = int(round(8*self.melsr))
|
Maria@4
|
66 hop2 = int(round(0.5*self.melsr))
|
Maria@4
|
67 nbins, norigframes = self.melspec.shape
|
Maria@4
|
68 nframes = int(1+numpy.floor((norigframes-win2)/float(hop2)))
|
Maria@4
|
69 avemfccs = numpy.empty((nbins, nframes))
|
Maria@4
|
70 for i in range(nframes): # loop over all 8-sec frames
|
Maria@4
|
71 avemfccs[:,i] = numpy.mean(self.mfccs[:, (i*hop2):(i*hop2+win2)], axis=1, keepdims=True)
|
Maria@4
|
72 self.mfccs = avemfccs
|
Maria@4
|
73 return self.mfccs
|
Maria@4
|
74
|
Maria@4
|
75 def get_mfccs_from_melspec(self, melspec=[], melsr=[]):
|
Maria@4
|
76 self.melspec = melspec
|
Maria@4
|
77 self.melsr = melsr
|
Maria@4
|
78 self.calc_mfccs()
|
Maria@4
|
79 return self.mfccs
|
Maria@4
|
80
|
Maria@4
|
81 if __name__ == '__main__':
|
Maria@4
|
82 mfs = MFCCs()
|
Maria@4
|
83 mfs.get_mfccs() |