Переглянути джерело

[FEATURE] Hum third part of the code which didnt commit ... WTF

monf 8 роки тому
батько
коміт
55814f0487
6 змінених файлів з 63 додано та 37 видалено
  1. 1 1
      core/MainController.py
  2. 41 26
      core/OrderListener.py
  3. 11 5
      settings.yml
  4. 8 5
      stt/Google/Google.py
  5. 1 0
      stt/Google/__init__.py
  6. 1 0
      stt/__init__.py

+ 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)
+
+

+ 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"

+ 8 - 5
stt/Google/Google.py

@@ -2,13 +2,11 @@ import speech_recognition as sr
 from core.OrderListener import OrderListener
 
 
-class GoogleSpeechRecognition(OrderListener):
+class Google(OrderListener):
 
-    def __init__(self, main_controller=None):
+    def __init__(self, main_controller=None, **kwargs):
         OrderListener.__init__(self, main_controller)
-        self.listen()
 
-    def listen(self):
         """
         Start recording the microphone
         :return:
@@ -26,7 +24,12 @@ class GoogleSpeechRecognition(OrderListener):
             # 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")
+
+            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)
 

+ 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