Ver Fonte

Merged branch feature-STT into dev

Nicolas Marcq há 8 anos atrás
pai
commit
a8c093b323

+ 2 - 2
core/JarvisTrigger.py

@@ -1,4 +1,4 @@
-from stt.snowboy import snowboydecoder
+from trigger.snowboy import snowboydecoder
 
 
 class JarvisTrigger:
@@ -13,7 +13,7 @@ class JarvisTrigger:
         """
         self.main_controller = main_controller
         # TODO update this to load the file from settings
-        self.model = "stt/snowboy/resources/GlaDOS.pmdl"
+        self.model = "trigger/snowboy/resources/jarviss.pmdl"
         # boolean used to stop the snowbow listening
         self.interrupted = False
 

+ 1 - 1
core/MainController.py

@@ -42,7 +42,7 @@ class MainController:
         self.pause_jarvis_trigger()
         print "Start listening for order"
         Say("oui monsieur?")
-        self.order_listener.start()
+        self.order_listener.loadSTTPlugin()
 
     def analyse_order(self, order):
         """

+ 41 - 26
core/OrderListener.py

@@ -1,5 +1,3 @@
-import speech_recognition as sr
-
 
 class OrderListener:
 
@@ -12,29 +10,46 @@ class OrderListener:
         :type main_controller: MainController
         """
         self.main_controller = main_controller
+        self.settings = main_controller.conf.settingLoader.get_config()
 
-    def start(self):
-        """
-        Start recording the microphone
-        :return:
+
+    def _getSTTPlugin(self):
+        return self.settings["speechToText"]["name"]
+
+    def _getSTTArgs(self):
+        args = None
+        if 'args' in self.settings["speechToText"]:
+            args = self.settings["speechToText"]["args"]
+        return args
+
+    def loadSTTPlugin(self):
+        sttPlugin = self._getSTTPlugin()
+        sttArgs = self._getSTTArgs()
+
+        # capitalizes the first letter (because classes have first letter upper case)
+        sttPlugin = sttPlugin.capitalize()
+        self._runSTTPPlugin(sttPlugin, sttArgs)
+
+
+    def _runSTTPPlugin(self, sttPlugin, parameters=None):
         """
-        # obtain audio from the microphone
-        r = sr.Recognizer()
-        with sr.Microphone() as source:
-            # listen for 1 second to calibrate the energy threshold for ambient noise levels
-            r.adjust_for_ambient_noise(source)
-            print("Say something!")
-            audio = r.listen(source)
-
-        # recognize speech using Google Speech Recognition
-        try:
-            # for testing purposes, we're just using the default API key
-            # to use another API key, use `r.recognize_google(audio, key="GOOGLE_SPEECH_RECOGNITION_API_KEY")`
-            # instead of `r.recognize_google(audio)`
-            captured_audio = r.recognize_google(audio, key=None, language="fr-FR")
-            print "Google Speech Recognition thinks you said %s" % captured_audio
-            self.main_controller.analyse_order(captured_audio)
-        except sr.UnknownValueError:
-            print("Google Speech Recognition could not understand audio")
-        except sr.RequestError as e:
-            print("Could not request results from Google Speech Recognition service; {0}".format(e))
+           Dynamic loading of a STT module
+           :param plugin: Module name to load
+           :param parameters: Parameter of the module
+           :return:
+           """
+        print "Running STT %s with parameter %s" % (sttPlugin, parameters)
+        mod = __import__('stt', fromlist=[sttPlugin])
+
+        klass = getattr(mod, sttPlugin)
+
+        if klass is not None:
+            # run the plugin
+            if not parameters:
+                klass(self.main_controller)
+            elif isinstance(parameters, dict):
+                klass(self.main_controller, **parameters)
+            else:
+                klass(self.main_controller, parameters)
+
+

+ 0 - 35
core/Utils.py

@@ -1,38 +1,3 @@
-import yaml
-import os
-
-
-def get_settings():
-    """
-    Load settings.yml file
-    :return:
-    """
-    filename = "settings.yml"
-    return _load_yaml_file(filename)
-
-
-def get_brain():
-    """
-    Load brain.yml file
-    :return:
-    """
-    filename = "../brain.yml"
-    return _load_yaml_file(filename)
-
-
-def _load_yaml_file(file_to_load):
-    """
-    Load settings file
-    :return:
-    """
-    # Load settings. Will be used to convert slot number into GPIO pin number
-    __location__ = os.path.realpath(
-        os.path.join(os.getcwd(), os.path.dirname(__file__)))
-    with open(os.path.join(__location__, file_to_load)) as ymlfile:
-        cfg = yaml.load(ymlfile)
-    return cfg
-
-
 def my_import(name):
     components = name.split('.')
     mod = __import__(components[0])

+ 11 - 5
settings.yml

@@ -2,16 +2,22 @@
 # JARVIS default settings
 # Use YAML syntax
 
-# This is the snowboy hotword file used to wake up jarvis and listen for a new order
-jarvis_trigger: "jarviss.pmdl"
+# This is the snowboy hotword file used to wake up and listen for a new order
+trigger:
+  name: "jarviss.pmdl"
 
 # Default Spreech to Text engine
 # Available engine are:
-# - google
+# - google (via SpeechRecognition)
 # -
-default_stt: "google"
+speechToText:
+  name: "google"
+  args:
+    language: "fr-FR"
+
 
 # Default Text to Spreech engine
 # Available engine are:
 # - pico2wave
-default_tts: "pico2wave"
+textToSpeech:
+  name: "pico2wave"

+ 42 - 0
stt/Google/Google.py

@@ -0,0 +1,42 @@
+import speech_recognition as sr
+from core.OrderListener import OrderListener
+
+
+class Google(OrderListener):
+
+    def __init__(self, main_controller=None, **kwargs):
+        OrderListener.__init__(self, main_controller)
+
+        """
+        Start recording the microphone
+        :return:
+        """
+        # obtain audio from the microphone
+        r = sr.Recognizer()
+        with sr.Microphone() as source:
+            # listen for 1 second to calibrate the energy threshold for ambient noise levels
+            r.adjust_for_ambient_noise(source)
+            print("Say something!")
+            audio = r.listen(source)
+
+        # recognize speech using Google Speech Recognition
+        try:
+            # for testing purposes, we're just using the default API key
+            # to use another API key, use `r.recognize_google(audio, key="GOOGLE_SPEECH_RECOGNITION_API_KEY")`
+            # instead of `r.recognize_google(audio)`
+
+            key = kwargs.get('key', None)
+            language = kwargs.get('language', "en-US")
+            show_all = kwargs.get('show_all', False)
+
+            captured_audio = r.recognize_google(audio, key=key, language=language, show_all=show_all)
+            print "Google Speech Recognition thinks you said %s" % captured_audio
+            self._analyse_audio(captured_audio)
+
+        except sr.UnknownValueError:
+            print("Google Speech Recognition could not understand audio")
+        except sr.RequestError as e:
+            print("Could not request results from Google Speech Recognition service; {0}".format(e))
+
+    def _analyse_audio(self, audio):
+        self.main_controller.analyse_order(audio)

+ 1 - 0
stt/Google/__init__.py

@@ -0,0 +1 @@
+from Google import Google

+ 1 - 0
stt/__init__.py

@@ -0,0 +1 @@
+from Google import Google

+ 0 - 0
stt/snowboy/__init__.py → trigger/__init__.py


+ 0 - 0
trigger/snowboy/__init__.py


+ 0 - 0
stt/snowboy/_snowboydetect.so → trigger/snowboy/_snowboydetect.so


+ 0 - 0
stt/snowboy/resources/GlaDOS.pmdl → trigger/snowboy/resources/GlaDOS.pmdl


+ 0 - 0
stt/snowboy/resources/common.res → trigger/snowboy/resources/common.res


+ 0 - 0
stt/snowboy/resources/ding.wav → trigger/snowboy/resources/ding.wav


+ 0 - 0
stt/snowboy/resources/dong.wav → trigger/snowboy/resources/dong.wav


+ 0 - 0
stt/snowboy/resources/jarviss.pmdl → trigger/snowboy/resources/jarviss.pmdl


+ 0 - 0
stt/snowboy/resources/snowboy.umdl → trigger/snowboy/resources/snowboy.umdl


+ 6 - 4
stt/snowboy/snowboydecoder.py → trigger/snowboy/snowboydecoder.py

@@ -1,12 +1,14 @@
 #!/usr/bin/env python
 
 import collections
-import pyaudio
-import snowboydetect
+import logging
+import os
 import time
 import wave
-import os
-import logging
+
+import pyaudio
+
+import snowboydetect
 
 logging.basicConfig()
 logger = logging.getLogger("snowboy")

+ 0 - 0
stt/snowboy/snowboydetect.py → trigger/snowboy/snowboydetect.py