File size: 2,614 Bytes
3782968 518bb07 3782968 518bb07 3782968 518bb07 3782968 518bb07 3782968 518bb07 3782968 518bb07 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | 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() |