voxygen.py 1.8 KB

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