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