| 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 |
|
|
| |
| tts = TTS("tts_models/multilingual/multi-dataset/your_tts", progress_bar=False, gpu=False) |
| |
| 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") |
|
|
| |
| 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() |
|
|
| |
| 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) |
|
|
| |
| 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" |
|
|
| @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() |