from fastapi import FastAPI, Response
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from kokoro import KPipeline
import soundfile as sf
import numpy as np
import io
app = FastAPI()
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])
pipe = KPipeline(lang_code='e')
class Req(BaseModel):
input: str
voice: str = "ef_dora"
speed: float = 1.0
INDEX_HTML = """
Kokoro TTS
Kokoro TTS (espanol)
Listo.
Descargar wav
"""
@app.get("/", response_class=None)
def index():
from fastapi.responses import HTMLResponse
return HTMLResponse(INDEX_HTML)
@app.post("/v1/audio/speech")
def speech(r: Req):
parts = [a for _, _, a in pipe(r.input[:1000], voice=r.voice, speed=r.speed)]
wav = np.concatenate(parts) if len(parts) > 1 else parts[0]
buf = io.BytesIO()
sf.write(buf, wav, 24000, format="WAV")
return Response(content=buf.getvalue(), media_type="audio/wav")