You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.8 KiB
63 lines
1.8 KiB
import random
|
|
import requests
|
|
from requests.exceptions import JSONDecodeError
|
|
from utils import settings
|
|
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/
|
|
|
|
|
|
class StreamlabsPolly:
|
|
def __init__(self):
|
|
self.url = "https://streamlabs.com/polly/speak"
|
|
self.max_chars = 550
|
|
self.voices = voices
|
|
|
|
def run(self, text, filepath, random_voice: bool = False):
|
|
if random_voice:
|
|
voice = self.randomvoice()
|
|
else:
|
|
if not settings.config["settings"]["tts"]["streamlabs_polly_voice"]:
|
|
raise ValueError(
|
|
f"Please set the config variable STREAMLABS_VOICE to a valid voice. options are: {voices}"
|
|
)
|
|
voice = str(settings.config["settings"]["tts"]["streamlabs_polly_voice"]).capitalize()
|
|
body = {"voice": voice, "text": text, "service": "polly"}
|
|
response = requests.post(self.url, data=body)
|
|
if not check_ratelimit(response):
|
|
self.run(text, filepath, random_voice)
|
|
|
|
else:
|
|
try:
|
|
voice_data = requests.get(response.json()["speak_url"])
|
|
with open(filepath, "wb") as f:
|
|
f.write(voice_data.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")
|
|
|
|
def randomvoice(self):
|
|
return random.choice(self.voices)
|