| from __future__ import annotations |
|
|
| import json |
| from typing import List, Optional |
|
|
| from fastapi import APIRouter, File, Form, UploadFile |
|
|
| try: |
| from services.asr_service import list_supported_models, transcribe_with_model |
| except ImportError: |
| from .services.asr_service import list_supported_models, transcribe_with_model |
|
|
|
|
| router = APIRouter() |
|
|
|
|
| def _parse_model_ids(model_id: Optional[str], model_ids: Optional[str]) -> List[str]: |
| if model_ids: |
| try: |
| parsed = json.loads(model_ids) |
| if isinstance(parsed, list): |
| return [str(item) for item in parsed if str(item).strip()] |
| except json.JSONDecodeError: |
| return [item.strip() for item in model_ids.split(",") if item.strip()] |
|
|
| if model_id: |
| return [model_id] |
|
|
| return [] |
|
|
|
|
| @router.get("/test-asr/models") |
| async def get_test_asr_models(): |
| return {"models": list_supported_models()} |
|
|
|
|
| @router.post("/test-asr") |
| async def test_asr( |
| audio: UploadFile = File(...), |
| model_id: Optional[str] = Form(None), |
| model_ids: Optional[str] = Form(None), |
| ): |
| audio_bytes = await audio.read() |
| selected_model_ids = _parse_model_ids(model_id, model_ids) |
|
|
| if not selected_model_ids: |
| return { |
| "model_id": model_id, |
| "transcription": None, |
| "processing_time_seconds": None, |
| "error": "Provide model_id for one model or model_ids for comparison mode.", |
| } |
|
|
| results = [ |
| transcribe_with_model( |
| model_id=item, |
| audio_bytes=audio_bytes, |
| filename=audio.filename, |
| ) |
| for item in selected_model_ids |
| ] |
|
|
| if len(results) == 1: |
| return results[0] |
|
|
| return {"results": results} |
|
|