ASR-микросервис: whisper-large-v3-russian + Qwen3-ASR-1.7B
This commit is contained in:
commit
11a646604b
8 files changed
+247
No files matched your search
+72
@@ -0,0 +1,72 @@
|
||||
"""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)
|
||||
Reference in new issue
Block a user