import os import tempfile import threading import gradio as gr from TTS.api import TTS os.environ["COQUI_TOS_AGREED"] = "1" MODEL_PATH = "models/xtts" CONFIG_PATH = "models/xtts/config.json" VOCAB_PATH = "models/xtts/vocab.json" SPEAKERS_PATH = "models/xtts/speakers_xtts.pth" for p in [MODEL_PATH, CONFIG_PATH, VOCAB_PATH, SPEAKERS_PATH]: if not os.path.exists(p): raise RuntimeError(f"Missing file: {p}") tts = None model_ready = False def load_model(): global tts, model_ready print("🔁 Loading XTTS model once...") tts = TTS( model_path=MODEL_PATH, config_path=CONFIG_PATH, progress_bar=False, gpu=False ) model_ready = True print("✅ XTTS model loaded!") threading.Thread(target=load_model, daemon=True).start() def tts_api(text, speaker_wav): if not model_ready: raise gr.Error("Model loading... wait 30 seconds") if not text or speaker_wav is None: raise gr.Error("Provide text and speaker audio") out_path = os.path.join(tempfile.gettempdir(), "out.wav") tts.tts_to_file( text=text, speaker_wav=speaker_wav, language="en", file_path=out_path ) return out_path demo = gr.Interface( fn=tts_api, inputs=[ gr.Textbox(label="Text"), gr.Audio(type="filepath", label="Speaker WAV"), ], outputs=gr.Audio(type="filepath"), api_name="tts" ) demo.queue() demo.launch()