voxygen.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import logging
  2. import requests
  3. from core import FileManager
  4. from core.TTS.TTSModule import TTSModule, MissingTTSParameter, FailToLoadSoundFile
  5. logging.basicConfig()
  6. logger = logging.getLogger("kalliope")
  7. TTS_URL = "https://www.voxygen.fr/sites/all/modules/voxygen_voices/assets/proxy/index.php"
  8. TTS_TIMEOUT_SEC = 30
  9. TTS_CONTENT_TYPE = "audio/mpeg"
  10. class Voxygen(TTSModule):
  11. def __init__(self, **kwargs):
  12. super(Voxygen, self).__init__(**kwargs)
  13. self.voice = kwargs.get('voice', None)
  14. if self.voice is None:
  15. raise MissingTTSParameter("voice parameter is required by the Voxygen TTS")
  16. def say(self, words):
  17. self.generate_and_play(words, self._generate_audio_file)
  18. def _generate_audio_file(self):
  19. payload = self.get_payload(self.voice, self.words)
  20. # getting the mp3
  21. r = requests.get(TTS_URL, params=payload, stream=True, timeout=TTS_TIMEOUT_SEC)
  22. content_type = r.headers['Content-Type']
  23. logger.debug("Voxygen : Trying to get url: %s response code: %s and content-type: %s",
  24. r.url,
  25. r.status_code,
  26. content_type)
  27. try:
  28. if r.status_code == requests.codes.ok and content_type == TTS_CONTENT_TYPE:
  29. return FileManager.write_in_file(self.file_path, r.content)
  30. else:
  31. return False
  32. except IOError as e:
  33. logger.error("I/O error(%s): %s", e.errno, e.strerror)
  34. except ValueError:
  35. logger.error("Could not convert data to an integer.")
  36. @staticmethod
  37. def get_payload(voice, words):
  38. return {
  39. "method": "redirect",
  40. "text": words,
  41. "voice": voice
  42. }