| 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 | |