""" 长文本转音频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 ( LongTextAudioCreateRequest, LongTextAudioResponse, LongTextAudioListResponse, TaskListQueryParams ) from app.services.audio_v2 import LongTextAudioService router = APIRouter(prefix="/long-text", tags=["长文本转音频V2"]) @router.post("", response_model=ApiResponse[LongTextAudioResponse]) async def create_long_text_task( request: LongTextAudioCreateRequest, db: Session = Depends(get_db), current_user: User = Depends(get_current_user_from_request) ): """ 创建长文本转音频任务(异步) 提交长文本进行分段合成,返回任务ID用于后续查询 文本长度必须超过500字符,否则请使用普通语音合成接口 Args: request: 创建请求(包含model、voice、text等) Returns: 任务信息(包含task_id、分段信息等) """ if not current_user.apikey: raise HTTPException( status_code=403, detail="未配置API密钥,请在用户设置中配置apikey" ) service = LongTextAudioService(db, current_user.id, current_user.apikey) result = await service.create_task(request) return ApiResponse( code=200, message="长文本转音频任务已创建", data=result ) @router.get("/{task_id}", response_model=ApiResponse[LongTextAudioResponse]) async def get_long_text_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: 任务详情(包含状态、进度、分段信息、音频URL等) """ service = LongTextAudioService(db, current_user.id, current_user.apikey) result = await service.get_task(task_id) return ApiResponse( code=200, message="success", data=result ) @router.get("", response_model=ApiResponse[LongTextAudioListResponse]) async def list_long_text_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 = LongTextAudioService(db, current_user.id, current_user.apikey) result = await service.list_tasks(params) return ApiResponse( code=200, message="success", data=result )