long_text_audio_router.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. """
  2. 长文本转音频V2路由
  3. 提供长文本分段合成的API端点
  4. """
  5. from fastapi import APIRouter, Depends, HTTPException
  6. from sqlalchemy.orm import Session
  7. from app.database import get_db
  8. from app.models.user import User
  9. from app.middleware import get_current_user_from_request
  10. from app.schemas.model_schema import ApiResponse
  11. from app.schemas.audio_v2 import (
  12. LongTextAudioCreateRequest,
  13. LongTextAudioResponse,
  14. LongTextAudioListResponse,
  15. TaskListQueryParams
  16. )
  17. from app.services.audio_v2 import LongTextAudioService
  18. router = APIRouter(prefix="/long-text", tags=["长文本转音频V2"])
  19. @router.post("", response_model=ApiResponse[LongTextAudioResponse])
  20. async def create_long_text_task(
  21. request: LongTextAudioCreateRequest,
  22. db: Session = Depends(get_db),
  23. current_user: User = Depends(get_current_user_from_request)
  24. ):
  25. """
  26. 创建长文本转音频任务(异步)
  27. 提交长文本进行分段合成,返回任务ID用于后续查询
  28. 文本长度必须超过500字符,否则请使用普通语音合成接口
  29. Args:
  30. request: 创建请求(包含model、voice、text等)
  31. Returns:
  32. 任务信息(包含task_id、分段信息等)
  33. """
  34. if not current_user.apikey:
  35. raise HTTPException(
  36. status_code=403,
  37. detail="未配置API密钥,请在用户设置中配置apikey"
  38. )
  39. service = LongTextAudioService(db, current_user.id, current_user.apikey)
  40. result = await service.create_task(request)
  41. return ApiResponse(
  42. code=200,
  43. message="长文本转音频任务已创建",
  44. data=result
  45. )
  46. @router.get("/{task_id}", response_model=ApiResponse[LongTextAudioResponse])
  47. async def get_long_text_task(
  48. task_id: str,
  49. db: Session = Depends(get_db),
  50. current_user: User = Depends(get_current_user_from_request)
  51. ):
  52. """
  53. 查询长文本转音频任务详情
  54. 根据task_id查询任务状态、进度和合成结果
  55. Args:
  56. task_id: 任务ID
  57. Returns:
  58. 任务详情(包含状态、进度、分段信息、音频URL等)
  59. """
  60. service = LongTextAudioService(db, current_user.id, current_user.apikey)
  61. result = await service.get_task(task_id)
  62. return ApiResponse(
  63. code=200,
  64. message="success",
  65. data=result
  66. )
  67. @router.get("", response_model=ApiResponse[LongTextAudioListResponse])
  68. async def list_long_text_tasks(
  69. status: str = None,
  70. page: int = 1,
  71. page_size: int = 20,
  72. order_by: str = "created_at",
  73. order: str = "desc",
  74. db: Session = Depends(get_db),
  75. current_user: User = Depends(get_current_user_from_request)
  76. ):
  77. """
  78. 查询长文本转音频任务列表
  79. 支持分页、筛选和排序
  80. Args:
  81. status: 状态筛选(PENDING/PROCESSING/SUCCEEDED/FAILED)
  82. page: 页码(从1开始)
  83. page_size: 每页数量(1-100)
  84. order_by: 排序字段(created_at/updated_at)
  85. order: 排序方向(asc/desc)
  86. Returns:
  87. 任务列表(包含总数和分页数据)
  88. """
  89. params = TaskListQueryParams(
  90. status=status,
  91. page=page,
  92. page_size=page_size,
  93. order_by=order_by,
  94. order=order
  95. )
  96. service = LongTextAudioService(db, current_user.id, current_user.apikey)
  97. result = await service.list_tasks(params)
  98. return ApiResponse(
  99. code=200,
  100. message="success",
  101. data=result
  102. )