import os from concurrent.futures import ThreadPoolExecutor from TTS.api import TTS from shortGPT.audio.voice_module import VoiceModule from shortGPT.config.languages import ( EDGE_TTS_VOICENAME_MAPPING, LANGUAGE_ACRONYM_MAPPING, Language, ) from torch.cuda import is_available def run_async_func(loop, func): return loop.run_until_complete(func) class CoquiVoiceModule(VoiceModule): def __init__(self, voiceName, language="en"): self.voiceName = voiceName self.device = "cuda" if is_available() else "cpu" self.language = language os.environ["COQUI_TOS_AGREED"] = "1" self.tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2") super().__init__() def update_usage(self): return None def get_remaining_characters(self): return 999999999999 def generate_voice(self, text, outputfile): try: self.tts.to(self.device) self.tts.tts_to_file( text=text, file_path=outputfile, speaker=self.voiceName, language=self.language, split_sentences=True, ) except Exception as e: print("Error generating audio using coqui audio", e) raise Exception( "An error happened during coqui audio generation, no output audio generated", e, ) if not os.path.exists(outputfile): print( "An error happened during coqui audio generation, no output audio generated" ) raise Exception( "An error happened during coqui audio generation, no output audio generated" ) return outputfile