annotate scripts/MFCC.py @ 105:edd82eb89b4b branch-tests tip

Merge
author Maria Panteli
date Sun, 15 Oct 2017 13:36:59 +0100
parents e50c63cf96be
children
rev   line source
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()