import gradio as gr from TTS.api import TTS import os import secrets import json from cryptography.fernet import Fernet import base64 from fastapi import FastAPI, HTTPException, Depends from fastapi.security import HTTPBearer from pydantic import BaseModel # Model (super light – 180 MB only) tts = TTS("tts_models/multilingual/multi-dataset/your_tts", progress_bar=False, gpu=False) # Pre-load Urdu/Hindi voices tts.synthesizer.tts_to_file("", speaker_wav="https://huggingface.co/Bhai-Lang/Urdu-Hindi-TTS-Coqui/resolve/main/male_urdu.wav", language="ur", file_path="temp.wav") # API Key system (same as before) KEY_FILE = "keys.json" fernet = Fernet(os.getenv("KEY", Fernet.generate_key()).encode()) def load_keys(): try: with open(KEY_FILE) as f: return json.load(f) except: return {} def save_keys(d): with open(KEY_FILE, "w") as f: json.dump(d, f) db = load_keys() def gen_key(name): if name in db: return "Already exists" key = secrets.token_urlsafe(20) db[name] = fernet.encrypt(key.encode()).decode() save_keys(db) return f"Bearer {key}" def speak(text, lang="ur"): speaker = "male_urdu.wav" if lang == "ur" else "female_hindi.wav" tts.tts_to_file(text=text, speaker_wav=speaker, language=lang, file_path="out.wav") return open("out.wav", "rb").read() # Gradio def ui(text, lang): audio = speak(text, "ur" if "urdu" in lang.lower() else "hi") return audio, "Done!" with gr.Blocks() as demo: gr.Markdown("# Urdu + Hindi TTS – 1GB Free Tier Working 100%") txt = gr.Textbox(label="Text", placeholder="اَلسَّلَامُ عَلَيْكُمْ یا नमस्ते भाई", lines=5) lang = gr.Radio(["Urdu", "Hindi"], value="Urdu") btn = gr.Button("Speak") audio = gr.Audio() btn.click(ui, [txt, lang], [audio, gr.Textbox()]) with gr.Tab("API Key"): name = gr.Textbox(label="Your Name") out = gr.Textbox(label="Your Key", lines=2) gr.Button("Generate Key").click(gen_key, name, out) # API app = FastAPI() bearer = HTTPBearer() async def auth(cred=Depends(bearer)): token = cred.credentials.split()[-1] for v in db.values(): try: if fernet.decrypt(v.encode()).decode() == token: return True except: pass raise HTTPException(401, "Invalid key") class R(BaseModel): text: str lang: str = "ur" # ur or hi @app.post("/tts") async def api(r: R, x=Depends(auth)): audio = speak(r.text, r.lang) return {"audio_base64": base64.b64encode(audio).decode()} demo.launch()