File size: 2,120 Bytes
7cbe545
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""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()