import requests from requests.exceptions import JSONDecodeError from utils import settings from attr import attrs, attrib from attr.validators import instance_of from TTS.common import BaseApiTTS, get_random_voice from utils.voice import check_ratelimit voices = [ "Brian", "Emma", "Russell", "Joey", "Matthew", "Joanna", "Kimberly", "Amy", "Geraint", "Nicole", "Justin", "Ivy", "Kendra", "Salli", "Raveena", ] # valid voices https://lazypy.ro/tts/ @attrs class StreamlabsPolly(BaseApiTTS): random_voice: bool = attrib( validator=instance_of(bool), default=False ) url: str = "https://streamlabs.com/polly/speak" max_chars: int = 550 def make_request( self, text, ): """ Makes a requests to remote TTS service Args: text: text to be voice over Returns: Request's response """ voice = ( get_random_voice(voices) if self.random_voice else str(settings.config["settings"]["tts"]["streamlabs_polly_voice"]).capitalize() if str(settings.config["settings"]["tts"]["streamlabs_polly_voice"]).lower() in [ voice.lower() for voice in voices] else get_random_voice(voices) ) response = requests.post( self.url, data={ "voice": voice, "text": text, "service": "polly", }) if not check_ratelimit(response): return self.make_request(text) else: try: results = requests.get(response.json()["speak_url"]) return results.content except (KeyError, JSONDecodeError): try: if response.json()["error"] == "No text specified!": raise ValueError("Please specify a text to convert to speech.") except (KeyError, JSONDecodeError): print("Error occurred calling Streamlabs Polly")