| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- """
- 长文本转音频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
- )
|