import requests | |
import time | |
class StatusError(Exception): | |
pass | |
# Custom cache dictionary | |
cache = {} | |
def synthesis(text, speaker=None): | |
if speaker is None: | |
speaker = 1 | |
# Check if the result is already in the cache | |
cache_key = (text, speaker) | |
if cache_key in cache: | |
return cache[cache_key] | |
url = f"https://api.tts.quest/v3/voicevox/synthesis?text={text}&speaker={speaker}" | |
resp = requests.get(url) | |
resp.raise_for_status() | |
data = resp.json() | |
is_ready = check_audio_status(data["audioStatusUrl"]) | |
if not is_ready: | |
raise StatusError("Unexpected status") | |
resp = requests.get(data["mp3DownloadUrl"]) | |
audio_content = resp.content | |
# Cache the result | |
cache[cache_key] = audio_content | |
return audio_content | |
def check_audio_status(url): | |
is_ready = False | |
while not is_ready: | |
resp = requests.get(url) | |
resp.raise_for_status() | |
data = resp.json() | |
is_ready = data["isAudioReady"] | |
time.sleep(0.5) | |
return is_ready | |