24
24
import speech_recognition as sr
25
25
26
26
from mycroft .client .speech .local_recognizer import LocalRecognizer
27
- from mycroft .client .speech .mic import MutableMicrophone , Recognizer
27
+ from mycroft .client .speech .mic import MutableMicrophone , ResponsiveRecognizer
28
28
from mycroft .client .speech .recognizer_wrapper import \
29
29
RemoteRecognizerWrapperFactory
30
- from mycroft .client .speech .word_extractor import WordExtractor
31
30
from mycroft .configuration import ConfigurationManager
32
31
from mycroft .messagebus .message import Message
33
- from mycroft .metrics import MetricsAggregator , Stopwatch
32
+ from mycroft .metrics import MetricsAggregator
34
33
from mycroft .session import SessionManager
35
34
from mycroft .util import CerberusAccessDenied
36
35
from mycroft .util .log import getLogger
@@ -62,8 +61,7 @@ def run(self):
62
61
self .recognizer .adjust_for_ambient_noise (source )
63
62
while self .state .running :
64
63
try :
65
- self .emitter .emit ("recognizer_loop:listening" )
66
- audio = self .recognizer .listen (source )
64
+ audio = self .recognizer .listen (source , self .emitter )
67
65
self .queue .put (audio )
68
66
except IOError , ex :
69
67
# NOTE: Audio stack on raspi is slightly different, throws
@@ -105,73 +103,27 @@ def _audio_length(audio):
105
103
audio .sample_rate * audio .sample_width )
106
104
107
105
def read_audio (self ):
108
- timer = Stopwatch ()
109
- audio = self .queue .get ()
110
- self .metrics .timer ("mycroft.recognizer.audio.length_s" ,
111
- self ._audio_length (audio ))
112
- self .queue .task_done ()
113
- timer .start ()
106
+ audio_data = self .queue .get ()
114
107
115
108
if self .state .sleeping :
116
- self .process_wake_up (audio )
117
- elif self .state .skip_wakeword :
118
- self .process_skip_wake_word (audio )
109
+ self .try_wake_up (audio_data )
119
110
else :
120
- self .process_wake_word ( audio , timer )
111
+ self .process_audio ( audio_data )
121
112
122
- self .metrics .flush ()
123
-
124
- def process_wake_up (self , audio ):
113
+ def try_wake_up (self , audio ):
125
114
if self .wakeup_recognizer .is_recognized (audio .frame_data ,
126
115
self .metrics ):
127
116
SessionManager .touch ()
128
117
self .state .sleeping = False
129
118
self .__speak ("I'm awake." ) # TODO: Localization
130
119
self .metrics .increment ("mycroft.wakeup" )
131
120
132
- def process_wake_word (self , audio , timer ):
133
- hyp = self .mycroft_recognizer .transcribe (audio .frame_data ,
134
- self .metrics )
135
-
136
- if self .mycroft_recognizer .contains (hyp ):
137
- extractor = WordExtractor (audio , self .mycroft_recognizer ,
138
- self .metrics )
139
- timer .lap ()
140
- extractor .calculate_range ()
141
- self .metrics .timer ("mycroft.recognizer.extractor.time_s" ,
142
- timer .lap ())
143
- audio_before = extractor .get_audio_data_before ()
144
- self .metrics .timer ("mycroft.recognizer.audio_extracted.length_s" ,
145
- self ._audio_length (audio_before ))
146
- audio_after = extractor .get_audio_data_after ()
147
- self .metrics .timer ("mycroft.recognizer.audio_extracted.length_s" ,
148
- self ._audio_length (audio_after ))
149
-
150
- SessionManager .touch ()
151
- payload = {
152
- 'utterance' : hyp .hypstr ,
153
- 'session' : SessionManager .get ().session_id ,
154
- 'pos_begin' : extractor .begin ,
155
- 'pos_end' : extractor .end
156
- }
157
- self .emitter .emit ("recognizer_loop:wakeword" , payload )
158
-
159
- try :
160
- self .transcribe ([audio_before , audio_after ])
161
- except sr .UnknownValueError :
162
- self .__speak ("Go ahead" )
163
- self .state .skip_wakeword = True
164
- self .metrics .increment ("mycroft.wakeword" )
165
-
166
- def process_skip_wake_word (self , audio ):
167
- SessionManager .touch ()
121
+ def process_audio (self , audio ):
168
122
try :
169
123
self .transcribe ([audio ])
170
- except sr .UnknownValueError :
124
+ except sr .UnknownValueError : # TODO: Localization
171
125
logger .warn ("Speech Recognition could not understand audio" )
172
126
self .__speak ("Sorry, I didn't catch that." )
173
- self .metrics .increment ("mycroft.recognizer.error" )
174
- self .state .skip_wakeword = False
175
127
176
128
def __speak (self , utterance ):
177
129
payload = {
@@ -184,18 +136,18 @@ def _create_remote_stt_runnable(self, audio, utterances):
184
136
def runnable ():
185
137
try :
186
138
text = self .remote_recognizer .transcribe (
187
- audio , metrics = self .metrics ).lower ()
139
+ audio , metrics = self .metrics ).lower ()
188
140
except sr .UnknownValueError :
189
141
pass
190
142
except sr .RequestError as e :
191
143
logger .error (
192
- "Could not request results from Speech Recognition "
193
- "service; {0}" .format (e ))
144
+ "Could not request results from Speech Recognition "
145
+ "service; {0}" .format (e ))
194
146
except CerberusAccessDenied as e :
195
147
logger .error ("AccessDenied from Cerberus proxy." )
196
148
self .__speak (
197
- "Your device is not registered yet. To start pairing, "
198
- "login at cerberus dot mycroft dot A.I" )
149
+ "Your device is not registered yet. To start pairing, "
150
+ "login at cerberus dot mycroft dot A.I" )
199
151
utterances .append ("pair my device" )
200
152
except Exception as e :
201
153
logger .error ("Unexpected exception: {0}" .format (e ))
@@ -253,7 +205,7 @@ def __init__(self, channels=int(speech_config.get('channels')),
253
205
self .mycroft_recognizer = LocalRecognizer (sample_rate , lang )
254
206
# TODO - localization
255
207
self .wakeup_recognizer = LocalRecognizer (sample_rate , lang , "wake up" )
256
- self .remote_recognizer = Recognizer ( )
208
+ self .remote_recognizer = ResponsiveRecognizer ( self . mycroft_recognizer )
257
209
self .state = RecognizerLoopState ()
258
210
259
211
def start_async (self ):
@@ -270,7 +222,7 @@ def start_async(self):
270
222
self .wakeup_recognizer ,
271
223
self .mycroft_recognizer ,
272
224
RemoteRecognizerWrapperFactory .wrap_recognizer (
273
- self .remote_recognizer )).start ()
225
+ self .remote_recognizer )).start ()
274
226
275
227
def stop (self ):
276
228
self .state .running = False
0 commit comments