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

refactor Order listenner. use PEP8 with underscore

nico 8 роки тому
батько
коміт
4f6054762d

+ 10 - 3
core/ConfigurationManager/ConfigurationManager.py

@@ -4,10 +4,17 @@ from SettingLoader import SettingLoader
 
 class ConfigurationManager:
 
-    def __init__(self, brain_file_name=None, setting_file_name=None):
+    def __init__(self):
+        pass
+
+    @classmethod
+    def get_brain(cls, brain_file_name=None):
         if brain_file_name is None:
             brain_file_name = "brain.yml"
+        return BrainLoader(brain_file_name).get_config()
+
+    @classmethod
+    def get_settings(cls, setting_file_name=None):
         if setting_file_name is None:
             setting_file_name = "settings.yml"
-        self.brainLoader = BrainLoader(brain_file_name)
-        self.settingLoader = SettingLoader(setting_file_name)
+        return SettingLoader(setting_file_name).get_config()

+ 4 - 2
core/MainController.py

@@ -9,7 +9,7 @@ from neurons import Say
 class MainController:
     def __init__(self):
         # Manage Global Configuration
-        self.conf = ConfigurationManager()
+        self.conf = ConfigurationManager().get_settings()
 
         # create an order listener object
         self.order_listener = OrderListener(self)
@@ -41,8 +41,9 @@ class MainController:
         # pause the snowboy process
         self.pause_jarvis_trigger()
         print "Start listening for order"
+        # Todo add a list of words in settings
         Say(message="oui monsieur?")
-        self.order_listener.loadSTTPlugin()
+        self.order_listener.load_stt_plugin()
 
     def analyse_order(self, order):
         """
@@ -51,3 +52,4 @@ class MainController:
         """
         order_analyser = OrderAnalyser(order, main_controller=self)
         order_analyser.start()
+

+ 2 - 2
core/NeuroneLauncher.py

@@ -32,8 +32,8 @@ class NeuroneLauncher:
     def __init__(self):
         pass
 
-    @staticmethod
-    def start_neurone(neuron):
+    @classmethod
+    def start_neurone(cls, neuron):
         """
         Neuron dict to start. {'neurone_name': {'args1': 'value1',  'args2': 'value2'}}
         :param neuron: Dict with neuron declaration

+ 1 - 1
core/OrderAnalyser.py

@@ -29,7 +29,7 @@ class OrderAnalyser:
                     print "Order found! Run neurons: %s" % el["neurons"]
                     neurons = el["neurons"]
                     for neuron in neurons:
-                        NeuroneLauncher().start_neurone(neuron)
+                        NeuroneLauncher.start_neurone(neuron)
 
         # once we ran all plugin, we can start back jarvis trigger
         if self.main_controller is not None:

+ 76 - 24
core/OrderListener.py

@@ -1,3 +1,18 @@
+import logging
+from core import ConfigurationManager
+
+
+class DefaultSpeechToTextNotFound(Exception):
+    pass
+
+
+class DefaultSpeechNull(Exception):
+    pass
+
+
+class NoSpeechToTextConfiguration(Exception):
+    pass
+
 
 class OrderListener:
 
@@ -10,38 +25,75 @@ class OrderListener:
         :type main_controller: MainController
         """
         self.main_controller = main_controller
-        self.settings = main_controller.conf.settingLoader.get_config()
+        # self.settings = main_controller.conf.settingLoader.get_config()
+        self.settings = ConfigurationManager().get_settings()
 
+    def load_stt_plugin(self):
+        default_stt_plugin = self._get_stt_plugins()
 
-    def _getSTTPlugin(self):
-        return self.settings["speechToText"]["name"]
+        stt_args = self._get_stt_args(default_stt_plugin)
 
-    def _getSTTArgs(self):
-        args = None
-        if 'args' in self.settings["speechToText"]:
-            args = self.settings["speechToText"]["args"]
-        return args
+        # capitalizes the first letter (because classes have first letter upper case)
+        default_stt_plugin = default_stt_plugin.capitalize()
+        self._run_stt_plugin(default_stt_plugin, stt_args)
 
-    def loadSTTPlugin(self):
-        sttPlugin = self._getSTTPlugin()
-        sttArgs = self._getSTTArgs()
+    def _get_stt_plugins(self):
+        try:
+            default_speech_to_text = self.settings["default_speech_to_text"]
+            if default_speech_to_text is None:
+                raise DefaultSpeechNull("Attribute default_speech_to_text is null")
+            logging.info("Default STT: %s" % default_speech_to_text)
+            return default_speech_to_text
+        except KeyError:
+            raise DefaultSpeechToTextNotFound("Attribute default_speech_to_text not found in settings")
 
-        # capitalizes the first letter (because classes have first letter upper case)
-        sttPlugin = sttPlugin.capitalize()
-        self._runSTTPPlugin(sttPlugin, sttArgs)
+    def _get_stt_args(self, default_stt_plugin_name):
+        """
+        Return argument set for the current STT engine
+        :param default_stt_plugin: Name of the STT engine
+        :return:
+        """
+        def find(lst, key):
+            """
+            Find a key name in a list
+            :param lst: list()
+            :param key: key name to find i the list
+            :return: Return the dict
+            """
+            for el in lst:
+                try:
+                    if el[key]:
+                        return el[key]
+                except TypeError:
+                    pass
+                except KeyError:
+                    pass
+            return None
+
+        try:
+            speechs_to_text = self.settings["speech_to_text"]
+        except KeyError:
+            raise NoSpeechToTextConfiguration("No speech_to_text in settings")
+
+        logging.debug("Settings file content: %s" % speechs_to_text)
+        # get args
+        args = find(speechs_to_text, default_stt_plugin_name)
 
+        logging.debug("Args for %s STT: %s" % (default_stt_plugin_name, args))
 
-    def _runSTTPPlugin(self, sttPlugin, parameters=None):
+        return args
+
+    def _run_stt_plugin(self, stt_plugin, parameters=None):
         """
-           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)
+        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" % (stt_plugin, parameters)
+        mod = __import__('stt', fromlist=[stt_plugin])
+
+        klass = getattr(mod, stt_plugin)
 
         if klass is not None:
             # run the plugin

+ 16 - 9
settings.yml

@@ -1,23 +1,30 @@
 ---
+# ---------------------------
 # JARVIS default settings
 # Use YAML syntax
+# ---------------------------
 
 # 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
+# This is the STT that will be used by default
+default_speech_to_text: "google"
+# This is the default TTS that will be used by JARVIS to talk.
+default_text_to_speech: "pico2wave"
+
+# Spreech to Text engines configuration
 # Available engine are:
 # - google (via SpeechRecognition)
 # -
-speechToText:
-  name: "google"
-  args:
-    language: "fr-FR"
-
+speech_to_text:
+  - google:
+      language: "fr-FR"
+  - bing
 
-# Default Text to Spreech engine
+# Text to Spreech engines configuration
 # Available engine are:
 # - pico2wave
-textToSpeech:
-  name: "pico2wave"
+text_to_speech:
+  - pico2wave:
+      language: "fr-FR"

+ 1 - 1
stt/__init__.py

@@ -1 +1 @@
-from Google import Google
+from google import Google

+ 2 - 1
stt/Google/Google.py → stt/google/Google.py

@@ -39,4 +39,5 @@ class Google(OrderListener):
             print("Could not request results from Google Speech Recognition service; {0}".format(e))
 
     def _analyse_audio(self, audio):
-        self.main_controller.analyse_order(audio)
+        if self.main_controller is not None:
+            self.main_controller.analyse_order(audio)

+ 0 - 0
stt/Google/__init__.py → stt/google/__init__.py


+ 2 - 45
test.py

@@ -11,50 +11,7 @@ logger = logging.getLogger()
 logger.setLevel(logging.DEBUG)
 
 
-# run command
-# order = "playbook"
-# order_analyser = OrderAnalyser(order)
-# order_analyser.start()
-
-# test ansible
-# tasks_file = "tasks.yml"
-# ansible_tasks = Ansible_tasks(tasks_file)
-
-
-# def test_multi_args(*args , **kwargs):
-#     if kwargs is not None:
-#         for key, value in kwargs.iteritems():
-#             print "%s == %s" % (key, value)
-#
-#
-# conf = ConfigurationManager(brain_file_name="test.yml")
-#
-# brain = conf.brainLoader.get_config()
-# print brain
-#
-#
-# for el in brain:
-#     print el["neurons"]
-#
-#     neurons = el["neurons"]
-#     for neuron in neurons:
-#         NeuroneLauncher().start_neurone(neuron)
-#
-#
-#     # test_multi_args(**el["neurons"][0]["say"])
-
-# test unique message
-# Say(message="A vôtre écoute")
-
-# test multiple message
-messages = list()
-messages.append("Je vous écoute")
-messages.append("Oui monsieur?")
-messages.append("Que puis-je faire pour vous?")
-messages.append("Monsieur?")
-messages.append("A vôtre écoute")
-messages.append("J'écoute")
-
-Say(message=messages)
+order = OrderListener()
 
+order.load_stt_plugin()