1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 from timeside.core import implements, interfacedoc
23 from timeside.analyzer.core import Analyzer
24 from timeside.api import IAnalyzer
25 from preprocessors import downmix_to_mono, frames_adapter
26
27 import numpy
28 from aubio import mfcc, pvoc
32 implements(IAnalyzer)
33
35 super(AubioMfcc, self).__init__()
36 self.input_blocksize = 1024
37 self.input_stepsize = self.input_blocksize / 4
38
39 @interfacedoc
40 - def setup(self, channels=None, samplerate=None,
41 blocksize=None, totalframes=None):
42 super(AubioMfcc, self).setup(
43 channels, samplerate, blocksize, totalframes)
44 self.n_filters = 40
45 self.n_coeffs = 13
46 self.pvoc = pvoc(self.input_blocksize, self.input_stepsize)
47 self.mfcc = mfcc(self.input_blocksize,
48 self.n_filters,
49 self.n_coeffs,
50 samplerate)
51 self.block_read = 0
52 self.mfcc_results = numpy.zeros([self.n_coeffs, ])
53
54 @staticmethod
55 @interfacedoc
58
59 @staticmethod
60 @interfacedoc
63
64 @staticmethod
65 @interfacedoc
68
69 @downmix_to_mono
70 @frames_adapter
71 - def process(self, frames, eod=False):
72 fftgrain = self.pvoc(frames)
73 coeffs = self.mfcc(fftgrain)
74 self.mfcc_results = numpy.vstack((self.mfcc_results, coeffs))
75 self.block_read += 1
76 return frames, eod
77
78 - def post_process(self):
79 mfcc = self.new_result(data_mode='value', time_mode='framewise')
80 mfcc.parameters = dict(n_filters=self.n_filters,
81 n_coeffs=self.n_coeffs)
82 mfcc.data_object.value = self.mfcc_results
83 self.process_pipe.results.add(mfcc)
84