voice_clone_router.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. VoiceCloneV2CreateRequest,
  13. VoiceCloneV2Response,
  14. VoiceCloneV2ListResponse,
  15. TaskListQueryParams
  16. )
  17. from app.services.audio_v2 import VoiceCloneV2Service
  18. router = APIRouter(prefix="/voice-clone", tags=["声音克隆V2"])
  19. @router.post("", response_model=ApiResponse[VoiceCloneV2Response])
  20. async def create_voice_clone_task(
  21. request: VoiceCloneV2CreateRequest,
  22. db: Session = Depends(get_db),
  23. current_user: User = Depends(get_current_user_from_request)
  24. ):
  25. """
  26. 创建声音克隆任务(异步)
  27. 提交音频样本进行声音克隆,返回任务ID用于后续查询
  28. Args:
  29. request: 创建请求(包含target_model、prefix、audio_url等)
  30. Returns:
  31. 任务信息(包含task_id)
  32. """
  33. if not current_user.apikey:
  34. raise HTTPException(
  35. status_code=403,
  36. detail="未配置API密钥,请在用户设置中配置apikey"
  37. )
  38. service = VoiceCloneV2Service(db, current_user.id, current_user.apikey)
  39. result = await service.create_task(request)
  40. return ApiResponse(
  41. code=200,
  42. message="声音克隆任务已创建",
  43. data=result
  44. )
  45. @router.get("/{task_id}", response_model=ApiResponse[VoiceCloneV2Response])
  46. async def get_voice_clone_task(
  47. task_id: str,
  48. db: Session = Depends(get_db),
  49. current_user: User = Depends(get_current_user_from_request)
  50. ):
  51. """
  52. 查询声音克隆任务详情
  53. 根据task_id查询任务状态和克隆结果
  54. Args:
  55. task_id: 任务ID
  56. Returns:
  57. 任务详情(包含状态、voice_id等)
  58. """
  59. service = VoiceCloneV2Service(db, current_user.id, current_user.apikey)
  60. result = await service.get_task(task_id)
  61. return ApiResponse(
  62. code=200,
  63. message="success",
  64. data=result
  65. )
  66. @router.get("", response_model=ApiResponse[VoiceCloneV2ListResponse])
  67. async def list_voice_clone_tasks(
  68. status: str = None,
  69. page: int = 1,
  70. page_size: int = 20,
  71. order_by: str = "created_at",
  72. order: str = "desc",
  73. db: Session = Depends(get_db),
  74. current_user: User = Depends(get_current_user_from_request)
  75. ):
  76. """
  77. 查询声音克隆任务列表
  78. 支持分页、筛选和排序
  79. Args:
  80. status: 状态筛选(PENDING/PROCESSING/SUCCEEDED/FAILED)
  81. page: 页码(从1开始)
  82. page_size: 每页数量(1-100)
  83. order_by: 排序字段(created_at/updated_at)
  84. order: 排序方向(asc/desc)
  85. Returns:
  86. 任务列表(包含总数和分页数据)
  87. """
  88. params = TaskListQueryParams(
  89. status=status,
  90. page=page,
  91. page_size=page_size,
  92. order_by=order_by,
  93. order=order
  94. )
  95. service = VoiceCloneV2Service(db, current_user.id, current_user.apikey)
  96. result = await service.list_tasks(params)
  97. return ApiResponse(
  98. code=200,
  99. message="success",
  100. data=result
  101. )