Removeit / app.py
Akwbw's picture
Create app.py
e9178c1 verified
Raw
History Blame Contribute Delete
2.14 kB
from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import FileResponse
from pydantic import BaseModel
import uuid
import os
import json
import torch
from TTS.api import TTS
# ---------------------------
# CONFIG
# ---------------------------
ALLOWED_API_KEYS = ["your_master_key_here"] # You can add/remove keys
MODEL_NAME = "coqui/XTTS-v2"
OUTPUT_DIR = "outputs"
os.makedirs(OUTPUT_DIR, exist_ok=True)
# ---------------------------
# LOAD MODEL (CPU mode)
# ---------------------------
device = "cpu"
tts = TTS(model_name=MODEL_NAME).to(device)
# ---------------------------
# FASTAPI INIT
# ---------------------------
app = FastAPI()
# ---------------------------
# REQUEST BODY
# ---------------------------
class TTSRequest(BaseModel):
api_key: str
text: str
language: str = "en"
speaker_wav: str | None = None
# ---------------------------
# ROOT
# ---------------------------
@app.get("/")
def root():
return {"message": "XTTS Custom API Running Successfully!"}
# ---------------------------
# TTS ENDPOINT
# ---------------------------
@app.post("/generate")
def generate_audio(req: TTSRequest):
# API KEY VALIDATION
if req.api_key not in ALLOWED_API_KEYS:
raise HTTPException(status_code=401, detail="Invalid API Key")
# FILE NAME
file_id = str(uuid.uuid4())
out_file = f"{OUTPUT_DIR}/{file_id}.wav"
# RUN TTS
try:
tts.tts_to_file(
text=req.text,
file_path=out_file,
speaker_wav=req.speaker_wav,
language=req.language
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# RETURN AUDIO FILE
return {"status": "success", "audio_url": f"/audio/{file_id}.wav"}
# ---------------------------
# AUDIO FILE SERVE
# ---------------------------
@app.get("/audio/{file_name}")
def get_audio(file_name: str):
file_path = os.path.join(OUTPUT_DIR, file_name)
if not os.path.exists(file_path):
raise HTTPException(status_code=404, detail="File not found")
return FileResponse(path=file_path, media_type="audio/wav")