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
23 from timeside.analyzer.core import Analyzer
24 from timeside.analyzer.utils import entropy, computeModulation
25 from timeside.analyzer.utils import segmentFromValues
26 from timeside.api import IAnalyzer
27 from numpy import array
28 from scipy.ndimage.morphology import binary_opening
32 implements(IAnalyzer)
33
34 @interfacedoc
35 - def setup(self, channels=None, samplerate=None, blocksize=None, totalframes=None):
42
43 @staticmethod
44 @interfacedoc
46 return "irit_speech_entropy"
47
48 @staticmethod
49 @interfacedoc
51 return "IRIT Speech entropy"
52
53 @staticmethod
54 @interfacedoc
57
59 return "Speech confidences indexes"
60
61 - def process(self, frames, eod=False):
62 self.entropyValue.append(entropy(frames))
63 return frames, eod
64
65 - def post_process(self):
66
67 entropyValue = array(self.entropyValue)
68 w = self.modulLen * self.samplerate() / self.blocksize()
69 modulentropy = computeModulation(entropyValue, w, False)
70 confEntropy = array(modulentropy - self.threshold) / self.threshold
71 confEntropy[confEntropy > 1] = 1
72
73 conf = self.new_result(data_mode='value', time_mode='framewise')
74
75 conf.id_metadata.id += '.' + 'confidence'
76 conf.id_metadata.name += ' ' + 'Confidence'
77
78 conf.data_object.value = confEntropy
79 self._results.add(conf)
80
81
82 binaryEntropy = modulentropy > self.threshold
83 binaryEntropy = binary_opening(
84 binaryEntropy, [1] * (self.smoothLen * 2))
85
86 convert = {False: 0, True: 1}
87 label = {0: 'NonSpeech', 1: 'Speech'}
88 segList = segmentFromValues(binaryEntropy)
89
90
91
92 segs = self.new_result(data_mode='label', time_mode='segment')
93 segs.id_metadata.id += '.' + 'segments'
94 segs.id_metadata.name += ' ' + 'Segments'
95
96 segs.data_object.label = segList
97
98 segs.data_object.label = [convert[s[2]] for s in segList]
99 segs.data_object.time = [(float(s[0]) * self.blocksize() /
100 self.samplerate())
101 for s in segList]
102 segs.data_object.duration = [(float(s[1]-s[0]) * self.blocksize() /
103 self.samplerate())
104 for s in segList]
105
106 self._results.add(segs)
107
108 return
109