import asyncio import os from concurrent.futures import ThreadPoolExecutor import edge_tts from shortGPT.audio.voice_module import VoiceModule from shortGPT.config.languages import (EDGE_TTS_VOICENAME_MAPPING, LANGUAGE_ACRONYM_MAPPING, Language) def run_async_func(loop, func): return loop.run_until_complete(func) class EdgeTTSVoiceModule(VoiceModule): def __init__(self, voiceName): self.voiceName = voiceName super().__init__() def update_usage(self): return None def get_remaining_characters(self): return 999999999999 def generate_voice(self, text, outputfile): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) try: with ThreadPoolExecutor() as executor: loop.run_in_executor(executor, run_async_func, loop, self.async_generate_voice(text, outputfile)) finally: loop.close() if not os.path.exists(outputfile): print("An error happened during edge_tts audio generation, no output audio generated") raise Exception("An error happened during edge_tts audio generation, no output audio generated") return outputfile async def async_generate_voice(self, text, outputfile): try: communicate = edge_tts.Communicate(text, self.voiceName) with open(outputfile, "wb") as file: async for chunk in communicate.stream(): if chunk["type"] == "audio": file.write(chunk["data"]) except Exception as e: print("Error generating audio using edge_tts", e) raise Exception("An error happened during edge_tts audio generation, no output audio generated", e) return outputfile