""" 语音识别V2路由 提供异步语音识别的API端点 """ from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app.database import get_db from app.models.user import User from app.middleware import get_current_user_from_request from app.schemas.model_schema import ApiResponse from app.schemas.audio_v2 import ( ASRRecognitionV2CreateRequest, ASRRecognitionV2Response, ASRRecognitionV2ListResponse, TaskListQueryParams ) from app.services.audio_v2 import ASRRecognitionV2Service router = APIRouter(prefix="/asr", tags=["语音识别V2"]) @router.post("/recognition", response_model=ApiResponse[ASRRecognitionV2Response]) async def create_recognition_task( request: ASRRecognitionV2CreateRequest, db: Session = Depends(get_db), current_user: User = Depends(get_current_user_from_request) ): """ 创建语音识别任务(异步) 提交音频文件URL进行异步识别,返回任务ID用于后续查询 Args: request: 创建请求(包含model和file_url) Returns: 任务信息(包含task_id) """ if not current_user.apikey: raise HTTPException( status_code=403, detail="未配置API密钥,请在用户设置中配置apikey" ) service = ASRRecognitionV2Service(db, current_user.id, current_user.apikey) result = await service.create_task(request) return ApiResponse( code=200, message="识别任务已创建", data=result ) @router.get("/recognition/{task_id}", response_model=ApiResponse[ASRRecognitionV2Response]) async def get_recognition_task( task_id: str, db: Session = Depends(get_db), current_user: User = Depends(get_current_user_from_request) ): """ 查询语音识别任务详情 根据task_id查询任务状态和识别结果 Args: task_id: 任务ID Returns: 任务详情(包含状态、结果等) """ service = ASRRecognitionV2Service(db, current_user.id, current_user.apikey) result = await service.get_task(task_id) return ApiResponse( code=200, message="success", data=result ) @router.get("/recognition", response_model=ApiResponse[ASRRecognitionV2ListResponse]) async def list_recognition_tasks( status: str = None, page: int = 1, page_size: int = 20, order_by: str = "created_at", order: str = "desc", db: Session = Depends(get_db), current_user: User = Depends(get_current_user_from_request) ): """ 查询语音识别任务列表 支持分页、筛选和排序 Args: status: 状态筛选(PENDING/PROCESSING/SUCCEEDED/FAILED) page: 页码(从1开始) page_size: 每页数量(1-100) order_by: 排序字段(created_at/updated_at) order: 排序方向(asc/desc) Returns: 任务列表(包含总数和分页数据) """ params = TaskListQueryParams( status=status, page=page, page_size=page_size, order_by=order_by, order=order ) service = ASRRecognitionV2Service(db, current_user.id, current_user.apikey) result = await service.list_tasks(params) return ApiResponse( code=200, message="success", data=result )