import os from flask import Flask, request, jsonify, send_file from TTS.api import TTS import gradio as gr # ------------------------- # 1️⃣ Flask API # ------------------------- app = Flask(__name__) # Models / Characters MODELS = { "Default Voice": "models/default_model", # Local model path "Hindi Voice": "models/hindi_model", # Local Hindi model } # Load TTS instances tts_instances = {name: TTS(model_name=path, progress_bar=False) for name, path in MODELS.items()} def synthesize(text, character): if character not in tts_instances: return None tts = tts_instances[character] output_path = f"/tmp/{character.replace(' ','_')}_output.wav" tts.tts_to_file(text=text, file_path=output_path) return output_path # Flask API endpoint @app.route("/generate", methods=["POST"]) def generate_api(): data = request.json text = data.get("text", "") character = data.get("character", "Default Voice") output_file = synthesize(text, character) if output_file: return send_file(output_file, mimetype="audio/wav") return jsonify({"error": "Failed to generate speech"}), 400 # ------------------------- # 2️⃣ Gradio UI # ------------------------- def gradio_generate(text, character): file_path = synthesize(text, character) return file_path with gr.Blocks() as demo: gr.Markdown("## 🎙️ Custom Multi-Character TTS") with gr.Row(): text_input = gr.Textbox(label="Enter Text", lines=5, placeholder="Type something...") character_dropdown = gr.Dropdown(choices=list(MODELS.keys()), label="Select Character", value="Default Voice") generate_btn = gr.Button("Generate Speech") audio_output = gr.Audio(label="Generated Audio", type="filepath") generate_btn.click(fn=gradio_generate, inputs=[text_input, character_dropdown], outputs=audio_output) # ------------------------- # 3️⃣ Launch Flask + Gradio # ------------------------- if __name__ == "__main__": import threading # Run Gradio in separate thread threading.Thread(target=lambda: demo.launch(server_name="0.0.0.0", server_port=7860, share=False)).start() # Run Flask API app.run(host="0.0.0.0", port=5000)