Explorar o código

Merge pull request #112 from kalliope-project/bacardi55-dev

Bacardi55 dev
Nicolas Marcq %!s(int64=8) %!d(string=hai) anos
pai
achega
8ac502352e

+ 9 - 0
Docs/brain.md

@@ -125,3 +125,12 @@ E.g:
 >**Note:** You can only use the `include` statement in the main brain file. 
 
 >**Note:** the includes statement must start with a `-`
+
+
+## The default Synapse
+
+You can provide a default synapse in case none of them are matching when an order is given.
+>**Note:** This default synapse is optional.
+>**Note:** You need to define it in the settings.yml cf :[Setting](settings.md).
+
+

+ 15 - 1
Docs/settings.md

@@ -111,7 +111,7 @@ E.g
 text_to_speech:
   - pico2wave:
       language: "fr-FR"
-  - voxygen:      
+  - voxygen:
       voice: "michel"
 ```
 
@@ -199,3 +199,17 @@ Login used by the basic HTTP authentication. Must be provided if `password_prote
 
 #### Password
 Password used by the basic HTTP authentication. Must be provided if `password_protected` is `True`
+
+
+## Default synapse
+
+Run a default synapse when Kalliope can't find the order in any synapse.
+
+```
+default_synapse: "synapse-name"
+```
+
+E.g
+```
+default_synapse: "Default-response"
+```

+ 0 - 1
Tests/__init__.py

@@ -1 +0,0 @@
-from test_order_analyser import TestOrderAnalyser

+ 1 - 0
kalliope/brain.yml

@@ -14,3 +14,4 @@
     - brains/twitter.yml
     - brains/neurotransmitter.yml
     - brains/wikipedia.yml
+    - brains/default.yml

+ 8 - 0
kalliope/brains/default.yml

@@ -0,0 +1,8 @@
+---
+  - name: "Default-synapse"
+    signals:
+      - order: "Default-synapse"
+    neurons:
+      - say:
+          message:
+            - "I didn't understand, Sir"

+ 31 - 0
kalliope/core/ConfigurationManager/SettingLoader.py

@@ -101,6 +101,7 @@ class SettingLoader(object):
         random_wake_up_sounds = self._get_random_wake_up_sounds(settings)
         rest_api = self._get_rest_api(settings)
         cache_path = self._get_cache_path(settings)
+        default_synapse = self._get_default_synapse(settings)
 
         # Load the setting singleton with the parameters
         setting_object.default_tts_name = default_tts_name
@@ -113,6 +114,7 @@ class SettingLoader(object):
         setting_object.random_wake_up_sounds = random_wake_up_sounds
         setting_object.rest_api = rest_api
         setting_object.cache_path = cache_path
+        setting_object.default_synapse = default_synapse
 
         return setting_object
 
@@ -473,3 +475,32 @@ class SettingLoader(object):
             return cache_path
         else:
             raise SettingInvalidException("The cache_path seems to be invalid: %s" % cache_path)
+
+
+    @staticmethod
+    def _get_default_synapse(settings):
+        """
+        Return the name of the default synapse
+
+        :param settings: The YAML settings file
+        :type settings: dict
+        :return: the default synapse name
+        :rtype: String
+
+        :Example:
+
+            default_synapse = cls._get_default_synapse(settings)
+
+        .. seealso::
+        .. raises:: SettingNotFound, NullSettingException, SettingInvalidException
+        .. warnings:: Class Method and Private
+        """
+
+        try:
+            default_synapse = settings["default_synapse"]
+            logger.debug("Default synapse: %s" % default_synapse)
+        except KeyError, e:
+            default_synapse = None
+
+        return default_synapse
+

+ 2 - 0
kalliope/core/Models/Settings.py

@@ -18,6 +18,7 @@ class Settings(object):
                  triggers=None,
                  rest_api=None,
                  cache_path=None,
+                 default_synapse=None,
                  machine=None):
 
         self.default_tts_name = default_tts_name
@@ -30,6 +31,7 @@ class Settings(object):
         self.triggers = triggers
         self.rest_api = rest_api
         self.cache_path = cache_path
+        self.default_synapse = default_synapse
         self.machine = platform.machine()   # can be x86_64 or armv7l
 
     def __eq__(self, other):

+ 35 - 5
kalliope/core/OrderAnalyser.py

@@ -40,11 +40,20 @@ class OrderAnalyser:
 
         if not launched_synapses:
             Utils.print_info("No synapse match the captured order: %s" % self.order)
-        else:
-            for synapse in launched_synapses:
-                params = self._get_synapse_params(synapse, self.order)
-                for neuron in synapse.neurons:
-                    self._start_neuron(neuron, params)
+
+            if self.main_controller.settings.default_synapse is not None:
+                default_synapse = self._get_default_synapse_from_sysnapses_list(self.brain.synapses,
+                                                                        self.main_controller.settings.default_synapse)
+
+                if default_synapse is not None:
+                    logger.debug("Default synapse found %s" % default_synapse)
+                    Utils.print_info("Default synapse found: %s, running it" % default_synapse.name)
+                    launched_synapses.append(default_synapse)
+
+        for synapse in launched_synapses:
+            params = self._get_synapse_params(synapse, self.order)
+            for neuron in synapse.neurons:
+                self._start_neuron(neuron, params)
 
         # return the list of launched synapse
         return launched_synapses
@@ -234,3 +243,24 @@ class OrderAnalyser:
             if n > c2[k]:
                 return False
         return True
+
+    @staticmethod
+    def _get_default_synapse_from_sysnapses_list(all_synapses_list, default_synapse_name):
+        """
+        Static method to get the default synapse if it exists.
+
+        :param all_synapses_list: the complete list of all synapses
+        :param default_synapse_name: the synapse to find
+        :return: the dict key/value
+        """
+        default_synapse = None
+        for synapse in all_synapses_list:
+            if synapse.name == default_synapse_name:
+                logger.debug("Default synapse found: %s" % synapse.name)
+                default_synapse = synapse
+                break
+        if default_synapse is None:
+            logger.debug("Default synapse not found")
+            Utils.print_warning("Default synapse not found")
+        return default_synapse
+

+ 2 - 2
kalliope/core/Utils/__init__.py

@@ -1,2 +1,2 @@
-from kalliope.core.Utils import Utils
-from kalliope.core.Utils import FileManager
+from kalliope.core.Utils.Utils import Utils
+from kalliope.core.Utils.FileManager import FileManager

+ 7 - 1
kalliope/settings.yml

@@ -16,7 +16,7 @@ default_trigger: "snowboy"
 triggers:
   - snowboy:
       pmdl_file: "kalliope/trigger/snowboy/resources/kalliope-FR-6samples.pmdl"
-      
+
 
 # ---------------------------
 # Speech to text
@@ -107,3 +107,9 @@ rest_api:
   password_protected: True
   login: admin
   password: secret
+
+# ---------------------------
+# Default Synapse
+# ---------------------------
+# Specify an optional default synapse response in case your order is not found.
+default_synapse: "Default-synapse"