Ttospeech / app.py
Akwbw's picture
Create app.py
de05859 verified
Raw
History Blame Contribute Delete
2.24 kB
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)