From 9405dce4d9f59f29b04eff83cb8909cc772249d5 Mon Sep 17 00:00:00 2001 From: "Matthew D. Scholefield" <matthew3311999@gmail.com> Date: Thu, 30 Jun 2016 14:22:53 -0500 Subject: [PATCH] Decreased "wake up" false positives - Fixes #189 (#252) * Increased kws threshold for the wakeup_recognizer * Fixed pep8 in listener * Fixed unit tests --- mycroft/client/speech/listener.py | 16 ++++++++++++---- mycroft/client/speech/local_recognizer.py | 12 ++++++------ test/client/audio_consumer_test.py | 3 ++- test/client/local_recognizer_test.py | 11 ++++++----- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/mycroft/client/speech/listener.py b/mycroft/client/speech/listener.py index 77b190901c13..40181ceb07a5 100644 --- a/mycroft/client/speech/listener.py +++ b/mycroft/client/speech/listener.py @@ -199,21 +199,29 @@ def __init__(self): class RecognizerLoop(pyee.EventEmitter): def __init__(self, channels=int(speech_config.get('channels')), - sample_rate=int(speech_config.get('sample_rate')), + rate=int(speech_config.get('sample_rate')), device_index=None, lang=core_config.get('lang')): pyee.EventEmitter.__init__(self) - self.microphone = MutableMicrophone(sample_rate=sample_rate, + self.microphone = MutableMicrophone(sample_rate=rate, device_index=device_index) # FIXME - channels are not been used self.microphone.CHANNELS = channels - self.mycroft_recognizer = LocalRecognizer(sample_rate, lang) + self.mycroft_recognizer = self.create_mycroft_recognizer(rate, lang) # TODO - localization - self.wakeup_recognizer = LocalRecognizer(sample_rate, lang, "wake up") + self.wakeup_recognizer = self.create_wakeup_recognizer(rate, lang) self.remote_recognizer = ResponsiveRecognizer(self.mycroft_recognizer) self.state = RecognizerLoopState() + @staticmethod + def create_mycroft_recognizer(rate, lang): + return LocalRecognizer("hey mycroft", "1e-90", rate, lang) + + @staticmethod + def create_wakeup_recognizer(rate, lang): + return LocalRecognizer("wake up", "1e-10", rate, lang) + def start_async(self): self.state.running = True queue = Queue() diff --git a/mycroft/client/speech/local_recognizer.py b/mycroft/client/speech/local_recognizer.py index b3a61011d22d..973a255400fa 100644 --- a/mycroft/client/speech/local_recognizer.py +++ b/mycroft/client/speech/local_recognizer.py @@ -27,25 +27,25 @@ class LocalRecognizer(object): - def __init__(self, sample_rate=16000, lang="en-us", - key_phrase="hey mycroft"): + def __init__(self, key_phrase, threshold, sample_rate=16000, lang="en-us"): self.lang = lang self.key_phrase = key_phrase self.sample_rate = sample_rate - self.configure() + self.threshold = threshold + self.decoder = Decoder(self.create_config()) - def configure(self): + def create_config(self): config = Decoder.default_config() config.set_string('-hmm', os.path.join(BASEDIR, 'model', self.lang, 'hmm')) config.set_string('-dict', os.path.join(BASEDIR, 'model', self.lang, 'mycroft-en-us.dict')) config.set_string('-keyphrase', self.key_phrase) - config.set_float('-kws_threshold', float('1e-90')) + config.set_float('-kws_threshold', float(self.threshold)) config.set_float('-samprate', self.sample_rate) config.set_int('-nfft', 2048) config.set_string('-logfn', '/dev/null') - self.decoder = Decoder(config) + return config def transcribe(self, byte_data, metrics=None): start = time.time() diff --git a/test/client/audio_consumer_test.py b/test/client/audio_consumer_test.py index c811965060dd..4e5890860673 100644 --- a/test/client/audio_consumer_test.py +++ b/test/client/audio_consumer_test.py @@ -24,6 +24,7 @@ from speech_recognition import WavFile, AudioData from mycroft.client.speech.listener import AudioConsumer, RecognizerLoop +from mycroft.client.speech.local_recognizer import LocalRecognizer from mycroft.client.speech.recognizer_wrapper import ( RemoteRecognizerWrapperFactory ) @@ -59,7 +60,7 @@ def setUp(self): self.loop.state, self.queue, self.loop, - self.loop.wakeup_recognizer, + LocalRecognizer(self.loop.wakeup_recognizer.key_phrase, "1e-45"), self.loop.mycroft_recognizer, RemoteRecognizerWrapperFactory.wrap_recognizer( self.recognizer, 'google')) diff --git a/test/client/local_recognizer_test.py b/test/client/local_recognizer_test.py index a9cb151355ae..d91a4434ce5f 100644 --- a/test/client/local_recognizer_test.py +++ b/test/client/local_recognizer_test.py @@ -3,7 +3,7 @@ import os from speech_recognition import WavFile -from mycroft.client.speech.local_recognizer import LocalRecognizer +from mycroft.client.speech.listener import RecognizerLoop __author__ = 'seanfitz' @@ -12,20 +12,21 @@ class LocalRecognizerTest(unittest.TestCase): def setUp(self): - self.recognizer = LocalRecognizer() + self.recognizer = RecognizerLoop.create_mycroft_recognizer(16000, + "en-us") def testRecognizerWrapper(self): source = WavFile(os.path.join(DATA_DIR, "hey_mycroft.wav")) with source as audio: hyp = self.recognizer.transcribe(audio.stream.read()) - assert "mycroft" in hyp.hypstr.lower() + assert self.recognizer.key_phrase in hyp.hypstr.lower() source = WavFile(os.path.join(DATA_DIR, "mycroft.wav")) with source as audio: hyp = self.recognizer.transcribe(audio.stream.read()) - assert "mycroft" in hyp.hypstr.lower() + assert self.recognizer.key_phrase in hyp.hypstr.lower() def testRecognitionInLongerUtterance(self): source = WavFile(os.path.join(DATA_DIR, "weather_mycroft.wav")) with source as audio: hyp = self.recognizer.transcribe(audio.stream.read()) - assert "mycroft" in hyp.hypstr.lower() + assert self.recognizer.key_phrase in hyp.hypstr.lower()