yangrongzhao
Inflect-Micro-v2 TTS: AX650 NPU3, U16 AXMODEL
7cbe545
Raw
History Blame Contribute Delete
2.12 kB
"""OpenAI-compatible TTS Server for AX650 NPU3.
Start: python -m inflect_tts_sdk.server --port 8000
API: POST /v1/audio/speech
"""
from __future__ import annotations
import io, sys, argparse
from pathlib import Path
try:
from fastapi import FastAPI
from fastapi.responses import Response
import uvicorn
except ImportError:
sys.exit("pip install fastapi uvicorn")
def create_app(model_dir: str | None = None):
app = FastAPI(title="Inflect-Micro-v2 TTS", version="1.0.0")
engine = None
def get_engine():
nonlocal engine
if engine is None:
sys.path.insert(0, str(Path(__file__).resolve().parent))
from tts_engine import InflectTTSEngine
engine = InflectTTSEngine(model_dir=model_dir)
return engine
@app.get("/health")
async def health():
return {"status": "ok", "model": "inflect-micro-v2", "hw": "AX650-NPU3"}
@app.get("/v1/models")
async def models():
return {"object": "list", "data": [
{"id": "inflect-micro-v2", "object": "model", "owned_by": "owensong"}
]}
@app.post("/v1/audio/speech")
async def speech(request: dict):
text = request.get("input", "")
if not text:
return Response(status_code=400)
eng = get_engine()
sr, wav = eng.synthesize(
text,
speed=float(request.get("speed", 1.0)),
variation=float(request.get("variation", 0.667)),
)
buf = io.BytesIO()
import soundfile as sf
sf.write(buf, wav, sr, format="WAV")
return Response(content=buf.getvalue(), media_type="audio/wav")
return app
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--host", default="0.0.0.0")
ap.add_argument("--port", type=int, default=8000)
ap.add_argument("--model-dir", default=None)
args = ap.parse_args()
app = create_app(args.model_dir)
print(f"🎤 Inflect-Micro-v2 TTS Server → http://{args.host}:{args.port}")
uvicorn.run(app, host=args.host, port=args.port)
if __name__ == "__main__":
main()