watson.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from kalliope.core.Utils.FileManager import FileManager
  2. from requests.auth import HTTPBasicAuth
  3. from kalliope.core.TTS.TTSModule import TTSModule, MissingTTSParameter
  4. import logging
  5. import requests
  6. logging.basicConfig()
  7. logger = logging.getLogger("kalliope")
  8. TTS_URL = "https://stream.watsonplatform.net/text-to-speech/api/v1"
  9. TTS_CONTENT_TYPE = "audio/wav"
  10. class Watson(TTSModule):
  11. def __init__(self, **kwargs):
  12. super(Watson, self).__init__(**kwargs)
  13. # set parameter from what we receive from the settings
  14. self.username = kwargs.get('username', None)
  15. self.password = kwargs.get('password', None)
  16. self.voice = kwargs.get('voice', None)
  17. self._check_parameters()
  18. def _check_parameters(self):
  19. """
  20. Check parameters are ok, raise missingparameters exception otherwise.
  21. :return: true if parameters are ok, raise an exception otherwise
  22. .. raises:: MissingParameterException
  23. """
  24. if self.username is None or self.password is None or self.voice is None:
  25. raise MissingTTSParameter("[Watson] Missing parameters, check documentation !")
  26. return True
  27. def say(self, words):
  28. """
  29. """
  30. self.generate_and_play(words, self._generate_audio_file)
  31. def _generate_audio_file(self):
  32. """
  33. Generic method used as a Callback in TTSModule
  34. """
  35. # Prepare payload
  36. payload = self.get_payload()
  37. headers = {
  38. "Content-Type": "application/json",
  39. "Accept": "audio/wav"
  40. }
  41. url = "%s/synthesize?voice=%s" % (TTS_URL, self.voice)
  42. response = requests.post(url,
  43. auth=HTTPBasicAuth(self.username, self.password),
  44. headers=headers,
  45. json=payload)
  46. logger.debug("[Watson TTS] status code: %s" % response.status_code)
  47. if response.status_code == 200:
  48. # OK we get the audio we can write the sound file
  49. FileManager.write_in_file(self.file_path, response.content)
  50. else:
  51. logger.debug("[Watson TTS] Fail to get audio. Header: %s" % response.headers)
  52. def get_payload(self):
  53. return {
  54. "text": self.words
  55. }