SettingLoader.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. from YAMLLoader import YAMLLoader
  2. import logging
  3. from core.Models.RestAPI import RestAPI
  4. from core.Models.Settings import Settings
  5. from core.Models.Stt import Stt
  6. from core.Models.Trigger import Trigger
  7. from core.Models.Tts import Tts
  8. FILE_NAME = "settings.yml"
  9. logging.basicConfig()
  10. logger = logging.getLogger("kalliope")
  11. class SettingInvalidException(Exception):
  12. pass
  13. class NullSettingException(Exception):
  14. pass
  15. class SettingNotFound(Exception):
  16. pass
  17. class SettingLoader(object):
  18. def __init__(self):
  19. pass
  20. @classmethod
  21. def get_yaml_config(cls, file_path=None):
  22. if file_path is None:
  23. file_path = FILE_NAME
  24. return YAMLLoader.get_config(file_path)
  25. @classmethod
  26. def get_settings(cls, file_path=None):
  27. """
  28. Return a Settings object from settings.yml file
  29. :return:
  30. """
  31. settings = cls.get_yaml_config(file_path)
  32. default_stt_name = cls._get_default_speech_to_text(settings)
  33. default_tts_name = cls._get_default_text_to_speech(settings)
  34. default_trigger_name = cls._get_default_trigger(settings)
  35. stts = cls._get_stts(settings)
  36. ttss = cls._get_ttss(settings)
  37. triggers = cls._get_triggers(settings)
  38. random_wake_up_answers = cls._get_random_wake_up_answers(settings)
  39. random_wake_up_sounds = cls._get_random_wake_up_sounds(settings)
  40. rest_api = cls._get_rest_api(settings)
  41. # create a setting object
  42. setting_object = Settings(default_stt_name=default_stt_name,
  43. default_tts_name=default_tts_name,
  44. default_trigger_name=default_trigger_name,
  45. stts=stts,
  46. ttss=ttss,
  47. triggers=triggers,
  48. random_wake_up_answers=random_wake_up_answers,
  49. random_wake_up_sounds=random_wake_up_sounds,
  50. rest_api=rest_api)
  51. return setting_object
  52. @staticmethod
  53. def _get_default_speech_to_text(settings):
  54. try:
  55. default_speech_to_text = settings["default_speech_to_text"]
  56. if default_speech_to_text is None:
  57. raise NullSettingException("Attribute default_speech_to_text is null")
  58. logger.debug("Default STT: %s" % default_speech_to_text)
  59. return default_speech_to_text
  60. except KeyError, e:
  61. raise SettingNotFound("%s setting not found" % e)
  62. @staticmethod
  63. def _get_default_text_to_speech(settings):
  64. try:
  65. default_text_to_speech = settings["default_text_to_speech"]
  66. if default_text_to_speech is None:
  67. raise NullSettingException("Attribute default_text_to_speech is null")
  68. logger.debug("Default TTS: %s" % default_text_to_speech)
  69. return default_text_to_speech
  70. except KeyError, e:
  71. raise SettingNotFound("%s setting not found" % e)
  72. @staticmethod
  73. def _get_default_trigger(settings):
  74. try:
  75. default_trigger = settings["default_trigger"]
  76. if default_trigger is None:
  77. raise NullSettingException("Attribute default_trigger is null")
  78. logger.debug("Default Trigger name: %s" % default_trigger)
  79. return default_trigger
  80. except KeyError, e:
  81. raise SettingNotFound("%s setting not found" % e)
  82. @classmethod
  83. def _get_stts(cls, settings):
  84. """
  85. Return a list of stt object
  86. :param settings: loaded settings file
  87. :return: List of Stt
  88. """
  89. try:
  90. speechs_to_text_list = settings["speech_to_text"]
  91. except KeyError:
  92. raise NullSettingException("speech_to_text settings not found")
  93. stts = list()
  94. for speechs_to_text_el in speechs_to_text_list:
  95. if isinstance(speechs_to_text_el, dict):
  96. # print "Neurons dict ok"
  97. for stt_name in speechs_to_text_el:
  98. name = stt_name
  99. parameters = speechs_to_text_el[name]
  100. new_stt = Stt(name=name, parameters=parameters)
  101. stts.append(new_stt)
  102. else:
  103. # the neuron does not have parameter
  104. new_stt = Stt(name=speechs_to_text_el)
  105. stts.append(new_stt)
  106. return stts
  107. @classmethod
  108. def _get_ttss(cls, settings):
  109. """
  110. Return a list of Tts object
  111. :param settings: loaded settings file
  112. :return: List of Tts
  113. """
  114. try:
  115. text_to_speech_list = settings["text_to_speech"]
  116. except KeyError, e:
  117. raise SettingNotFound("%s setting not found" % e)
  118. ttss = list()
  119. for text_to_speech_el in text_to_speech_list:
  120. if isinstance(text_to_speech_el, dict):
  121. # print "Neurons dict ok"
  122. for tts_name in text_to_speech_el:
  123. name = tts_name
  124. parameters = text_to_speech_el[name]
  125. new_tts = Tts(name=name, parameters=parameters)
  126. ttss.append(new_tts)
  127. else:
  128. # the neuron does not have parameter
  129. new_tts = Tts(name=text_to_speech_el)
  130. ttss.append(new_tts)
  131. return ttss
  132. @classmethod
  133. def _get_triggers(cls, settings):
  134. """
  135. Return a list of Trigger object
  136. :param settings: loaded settings file
  137. :return: List of Trigger
  138. """
  139. try:
  140. triggers_list = settings["triggers"]
  141. except KeyError, e:
  142. raise SettingNotFound("%s setting not found" % e)
  143. triggers = list()
  144. for trigger_el in triggers_list:
  145. if isinstance(trigger_el, dict):
  146. # print "Neurons dict ok"
  147. for tts_name in trigger_el:
  148. name = tts_name
  149. parameters = trigger_el[name]
  150. new_tts = Trigger(name=name, parameters=parameters)
  151. triggers.append(new_tts)
  152. else:
  153. # the neuron does not have parameter
  154. new_tts = Trigger(name=trigger_el)
  155. triggers.append(new_tts)
  156. return triggers
  157. @classmethod
  158. def _get_random_wake_up_answers(cls, settings):
  159. """
  160. return a list of string
  161. :param settings:
  162. :return:
  163. """
  164. try:
  165. random_wake_up_answers_list = settings["random_wake_up_answers"]
  166. except KeyError:
  167. # User does not provide this settings
  168. return None
  169. # The list cannot be empty
  170. if random_wake_up_answers_list is None:
  171. raise NullSettingException("random_wake_up_answers settings is null")
  172. return random_wake_up_answers_list
  173. @classmethod
  174. def _get_random_wake_up_sounds(cls, settings):
  175. """
  176. return a list of string
  177. :param settings:
  178. :return: List of string
  179. """
  180. try:
  181. random_wake_up_sounds_list = settings["random_wake_up_sounds"]
  182. except KeyError:
  183. # User does not provide this settings
  184. return None
  185. # The the setting is present, the list cannot be empty
  186. if random_wake_up_sounds_list is None:
  187. raise NullSettingException("random_wake_up_sounds settings is empty")
  188. return random_wake_up_sounds_list
  189. @classmethod
  190. def _get_rest_api(cls, settings):
  191. try:
  192. rest_api = settings["rest_api"]
  193. except KeyError, e:
  194. raise SettingNotFound("%s setting not found" % e)
  195. if rest_api is not None:
  196. try:
  197. password_protected = rest_api["password_protected"]
  198. if password_protected is None:
  199. raise NullSettingException("password_protected setting cannot be null")
  200. login = rest_api["login"]
  201. password = rest_api["password"]
  202. if password_protected:
  203. if login is None:
  204. raise NullSettingException("login setting cannot be null if password_protected is True")
  205. if login is None:
  206. raise NullSettingException("password setting cannot be null if password_protected is True")
  207. active = rest_api["active"]
  208. if active is None:
  209. raise NullSettingException("active setting cannot be null")
  210. port = rest_api["port"]
  211. if port is None:
  212. raise NullSettingException("port setting cannot be null")
  213. # check that the port in an integer
  214. try:
  215. port = int(port)
  216. except ValueError:
  217. raise SettingInvalidException("port must be an integer")
  218. # check the port is a valid port number
  219. if not 1024 <= port <= 65535:
  220. raise SettingInvalidException("port must be in range 1024-65535")
  221. except KeyError, e:
  222. # print e
  223. raise SettingNotFound("%s settings not found" % e)
  224. # config ok, we can return the rest api object
  225. rest_api_obj = RestAPI(password_protected=password_protected, login=login, password=password, active=active, port=port)
  226. return rest_api_obj
  227. else:
  228. raise NullSettingException("rest_api settings cannot be null")