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 Processor, implements, interfacedoc, FixedSizeInputAdapter
23 from timeside.analyzer.core import Analyzer
24 from timeside.api import IAnalyzer
25 from preprocessors import downmix_to_mono, frames_adapter
26
27 from aubio import specdesc, pvoc
31 implements(IAnalyzer)
32
34 super(AubioSpecdesc, self).__init__()
35 self.input_blocksize = 1024
36 self.input_stepsize = self.input_blocksize / 4
37
38 @interfacedoc
39 - def setup(self, channels=None, samplerate=None,
40 blocksize=None, totalframes=None):
41 super(
42 AubioSpecdesc,
43 self).setup(
44 channels,
45 samplerate,
46 blocksize,
47 totalframes)
48 self.block_read = 0
49 self.pvoc = pvoc(self.input_blocksize, self.input_stepsize)
50 self.methods = [
51 'default', 'energy', 'hfc', 'complex', 'phase', 'specdiff', 'kl',
52 'mkl', 'specflux', 'centroid', 'slope', 'rolloff', 'spread', 'skewness',
53 'kurtosis', 'decrease']
54 self.specdesc = {}
55 self.specdesc_results = {}
56 for method in self.methods:
57 self.specdesc[method] = specdesc(method, self.input_blocksize)
58 self.specdesc_results[method] = []
59
60 @staticmethod
61 @interfacedoc
63 return "aubio_specdesc"
64
65 @staticmethod
66 @interfacedoc
68 return "Spectral Descriptor (aubio)"
69
70 @staticmethod
71 @interfacedoc
74
75 @downmix_to_mono
76 @frames_adapter
77 - def process(self, frames, eod=False):
78 fftgrain = self.pvoc(frames)
79 for method in self.methods:
80 self.specdesc_results[method] += [
81 self.specdesc[method](fftgrain)[0]]
82 return frames, eod
83
84 - def post_process(self):
85
86
87 for method in self.methods:
88 res_specdesc = self.new_result(data_mode='value',
89 time_mode='framewise')
90
91 res_specdesc.id_metadata.id += '.' + method
92 res_specdesc.id_metadata.name = ' ' + method
93 res_specdesc.data_object.value = self.specdesc_results[method]
94
95 self.process_pipe.results.add(res_specdesc)
96