|
@@ -1,52 +1,61 @@
|
|
|
+import requests
|
|
|
+import re
|
|
|
+from core import FileManager
|
|
|
+from core.TTS.TTSModule import TTSModule, FailToLoadSoundFile
|
|
|
import logging
|
|
|
|
|
|
-import re
|
|
|
+logging.basicConfig()
|
|
|
+logger = logging.getLogger("kalliope")
|
|
|
|
|
|
-import requests
|
|
|
+TTS_URL = "http://www.acapela-group.com/demo-tts/DemoHTML5Form_V2_fr.php"
|
|
|
+TTS_CONTENT_TYPE = "audio/mpeg"
|
|
|
+TTS_TIMEOUT_SEC = 30
|
|
|
|
|
|
-from core import AudioPlayer
|
|
|
-from tts import TTS
|
|
|
|
|
|
-logging.basicConfig()
|
|
|
-logger = logging.getLogger("kalliope")
|
|
|
+class Acapela(TTSModule):
|
|
|
+ def __init__(self, **kwargs):
|
|
|
+ super(Acapela, self).__init__(**kwargs)
|
|
|
|
|
|
+ def say(self, words):
|
|
|
|
|
|
-class Acapela(TTS):
|
|
|
- TTS_LANGUAGES_DEFAULT = 'sonid15'
|
|
|
- TTS_VOICE_DEFAULT = 'Manon'
|
|
|
- TTS_URL = "http://www.acapela-group.com/demo-tts/DemoHTML5Form_V2_fr.php"
|
|
|
- TTS_CONTENT_TYPE = "audio/mpeg"
|
|
|
- TTS_TIMEOUT_SEC = 30
|
|
|
+ self.generate_and_play(words, self._generate_audio_file)
|
|
|
|
|
|
- def __init__(self):
|
|
|
- TTS.__init__(self)
|
|
|
+ @classmethod
|
|
|
+ def _generate_audio_file(cls):
|
|
|
|
|
|
- def say(self, words=None, language=TTS_LANGUAGES_DEFAULT, voice=TTS_VOICE_DEFAULT, cache=True):
|
|
|
- self.say_generic(cache, language, words, self.get_audio_acapela, AudioPlayer.PLAYER_MP3, AudioPlayer.AUDIO_MP3_22050_FREQUENCY, voice)
|
|
|
+ # Prepare payload
|
|
|
+ payload = cls.get_payload()
|
|
|
|
|
|
- def get_audio_acapela(self, **kwargs):
|
|
|
- language = kwargs.get('language', None)
|
|
|
- words = kwargs.get('words', None)
|
|
|
- cache = kwargs.get('cache', None)
|
|
|
- file_path = kwargs.get('file_path', None)
|
|
|
- voice = kwargs.get('voice', None)
|
|
|
- payload = Acapela.get_payload(language, voice, words)
|
|
|
- url = Acapela.get_audio_link(self.TTS_URL, payload)
|
|
|
+ # Get the mp3 URL from the page
|
|
|
+ url = Acapela.get_audio_link(cls.TTS_URL, payload)
|
|
|
|
|
|
- return TTS.get_audio(file_path, cache, payload, url)
|
|
|
+ # getting the mp3
|
|
|
+ r = requests.get(url, params=payload, stream=True, timeout=TTS_TIMEOUT_SEC)
|
|
|
+ content_type = r.headers['Content-Type']
|
|
|
|
|
|
- @staticmethod
|
|
|
- def get_audio_link(url, payload, timeout_expected=30):
|
|
|
- r = requests.post(url, payload, timeout=timeout_expected)
|
|
|
- data = r.content
|
|
|
- return re.search("(?P<url>https?://[^\s]+).mp3", data).group(0)
|
|
|
+ logger.debug("Trying to get url: %s response code: %s and content-type: %s",
|
|
|
+ r.url,
|
|
|
+ r.status_code,
|
|
|
+ content_type)
|
|
|
+ # Verify the response status code and the response content type
|
|
|
+ if r.status_code != requests.codes.ok or content_type != TTS_CONTENT_TYPE:
|
|
|
+ raise FailToLoadSoundFile("Fail while trying to remotely access the audio file")
|
|
|
|
|
|
- @staticmethod
|
|
|
- def get_payload(language, voice, words):
|
|
|
+ # OK we get the audio we can write the sound file
|
|
|
+ FileManager.write_in_file(cls.file_path, r.content)
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def get_payload(cls):
|
|
|
return {
|
|
|
- "MyLanguages": language,
|
|
|
- "MySelectedVoice": voice,
|
|
|
- "MyTextForTTS": words,
|
|
|
+ "MyLanguages": cls.language,
|
|
|
+ "MySelectedVoice": cls.voice,
|
|
|
+ "MyTextForTTS": cls.words,
|
|
|
"t": "1",
|
|
|
"SendToVaaS": ""
|
|
|
}
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def get_audio_link(url, payload, timeout_expected=TTS_TIMEOUT_SEC):
|
|
|
+ r = requests.post(url, payload, timeout=timeout_expected)
|
|
|
+ data = r.content
|
|
|
+ return re.search("(?P<url>https?://[^\s]+).mp3", data).group(0)
|