"""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)