From 2698e14f72efed89d9eb1fc98c015dc89698957d Mon Sep 17 00:00:00 2001 From: Jonathan D'Orleans Date: Thu, 2 Jun 2016 14:33:39 -0400 Subject: [PATCH] Issues 61 - Adjusting silence threshold - Prevent short words commands such as 'stop' and 'record' to be ignored - Adding unit tests for the new silence threshold --- mycroft/client/speech/listener.py | 2 +- test/client/audio_consumer_test.py | 38 +++++++++++++++++++++++++++++ test/client/data/record.wav | Bin 0 -> 16044 bytes test/client/data/stop.wav | Bin 0 -> 22480 bytes 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 test/client/data/record.wav create mode 100644 test/client/data/stop.wav diff --git a/mycroft/client/speech/listener.py b/mycroft/client/speech/listener.py index 2b4fc6ef6f69..b0bc8481ebcd 100644 --- a/mycroft/client/speech/listener.py +++ b/mycroft/client/speech/listener.py @@ -81,7 +81,7 @@ class AudioConsumer(threading.Thread): """ # In seconds, the minimum audio size to be sent to remote STT - MIN_AUDIO_SIZE = 1.0 + MIN_AUDIO_SIZE = 0.5 def __init__(self, state, queue, emitter, wakeup_recognizer, mycroft_recognizer, remote_recognizer): diff --git a/test/client/audio_consumer_test.py b/test/client/audio_consumer_test.py index 8a6ba53843d4..db43531d22eb 100644 --- a/test/client/audio_consumer_test.py +++ b/test/client/audio_consumer_test.py @@ -190,3 +190,41 @@ def utterance_callback(message): self.assertIsNotNone(utterances) self.assertTrue(len(utterances) == 1) self.assertEquals("what's the weather next week", utterances[0]) + + def test_stop(self): + self.queue.put(self.__create_sample_from_test_file('mycroft')) + self.consumer.read_audio() + + self.queue.put(self.__create_sample_from_test_file('stop')) + self.recognizer.set_transcriptions(["stop"]) + monitor = {} + + def utterance_callback(message): + monitor['utterances'] = message.get('utterances') + + self.loop.once('recognizer_loop:utterance', utterance_callback) + self.consumer.read_audio() + + utterances = monitor.get('utterances') + self.assertIsNotNone(utterances) + self.assertTrue(len(utterances) == 1) + self.assertEquals("stop", utterances[0]) + + def test_record(self): + self.queue.put(self.__create_sample_from_test_file('mycroft')) + self.consumer.read_audio() + + self.queue.put(self.__create_sample_from_test_file('record')) + self.recognizer.set_transcriptions(["record"]) + monitor = {} + + def utterance_callback(message): + monitor['utterances'] = message.get('utterances') + + self.loop.once('recognizer_loop:utterance', utterance_callback) + self.consumer.read_audio() + + utterances = monitor.get('utterances') + self.assertIsNotNone(utterances) + self.assertTrue(len(utterances) == 1) + self.assertEquals("record", utterances[0]) diff --git a/test/client/data/record.wav b/test/client/data/record.wav new file mode 100644 index 0000000000000000000000000000000000000000..5062ebc0d32e263f0365ed8b53c114afae72edbe GIT binary patch literal 16044 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