TTS.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from core import AudioPlayer
  2. from core import Cache
  3. import logging
  4. import os
  5. import requests
  6. import sys
  7. from core import FileManager
  8. logging.basicConfig()
  9. logger = logging.getLogger("kalliope")
  10. class TTS:
  11. TTS_CONTENT_TYPE = "audio/mpeg"
  12. TTS_TIMEOUT_SEC = 30
  13. def __init__(self, cache_extension=None, volume=0.8):
  14. self.cache = Cache(module_name=self.__class__.__name__, cache_extension=cache_extension)
  15. self.audio_player = AudioPlayer(volume=volume)
  16. def play_audio(self, music_file, music_type, audio_frequency, cache=False):
  17. self.audio_player.init_play(music_type, audio_frequency)
  18. self.audio_player.play_audio(music_file)
  19. self.cache.remove_audio_file(music_file, cache)
  20. def say_generic(self, cache, language, words, get_audio_specific, audio_type, audio_frequency, voice=None):
  21. file_path = self.cache.get_audio_file_cache_path(words, language, voice)
  22. if get_audio_specific(language=language, words=words, file_path=file_path, cache=cache, voice=voice):
  23. self.play_audio(file_path, audio_type, audio_frequency, cache)
  24. @staticmethod
  25. def unify_key(key):
  26. return key.lower()
  27. @staticmethod
  28. def get_audio(file_path, cache, payload, url, content_type_expected=TTS_CONTENT_TYPE, timeout_expected=TTS_TIMEOUT_SEC):
  29. if not cache or not os.path.exists(file_path) or FileManager.file_is_empty(file_path):
  30. r = requests.get(url, params=payload, stream=True, timeout=timeout_expected)
  31. content_type = r.headers['Content-Type']
  32. logger.debug("Trying to get url: %s response code: %s and content-type: %s", r.url, r.status_code, content_type)
  33. try:
  34. if r.status_code == requests.codes.ok and content_type == content_type_expected:
  35. return FileManager.write_in_file(file_path, r.content)
  36. else:
  37. return False
  38. except IOError as e:
  39. logger.error("I/O error(%s): %s", e.errno, e.strerror)
  40. except ValueError:
  41. logger.error("Could not convert data to an integer.")
  42. except:
  43. logger.error("Unexpected error: %s", sys.exc_info()[0])
  44. else:
  45. return True