Files

73 lines
1.9 KiB
Python

"""ASR-микросервис: whisper-large-v3-russian + Qwen3-ASR-1.7B для calls24."""
import logging
from fastapi import FastAPI, UploadFile
from fastapi.responses import JSONResponse
from pydantic import BaseModel
from starlette.middleware.cors import CORSMiddleware
from .config import settings
from .engine import load_models
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = FastAPI(title="ASR Microservice", version="1.0.0")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
_models = {}
@app.on_event("startup")
async def startup_event():
import torch
device = torch.device(settings.DEVICE)
global _models
_models = load_models(device)
logger.info(f"Модели загружены: {list(_models.keys())}")
@app.get("/health")
async def health():
return {"status": "ok", "models": list(_models.keys())}
@app.post("/transcribe")
async def transcribe(file: UploadFile, model: str = "qwen3"):
"""Распознать загруженный аудиофайл (model в query-параметре)."""
import os
import tempfile
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
content = await file.read()
tmp.write(content)
tmp.close()
if model not in _models:
return JSONResponse(
status_code=400,
content={"error": f"Неизвестная модель: {model}. Доступны: {list(_models.keys())}"},
)
try:
result = _models[model].transcribe(tmp.name)
return {"model": model, "text": result}
except Exception as e:
logger.error(f"Ошибка распознавания: {e}")
return JSONResponse(status_code=500, content={"error": str(e)})
finally:
os.unlink(tmp.name)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)