fix: /tts/preview 解析克隆音色 UUID 为 CosyVoice voice_id #1497

Merged
auto-approve-bot merged 2 commits from fix/tts-preview-voice-clone-id into develop 2026-08-25 16:26:17 +08:00
Owner

问题

前端对克隆音色传的是 VoiceCloneProfile 的 id(UUID),但 CosyVoice API 需要的是 profile.voice_id(CosyVoice 返回的实际音色标识)。当前 /tts/preview 代码直接把 UUID 传给 CosyVoice,导致 418 错误。

修复

在 preview_tts 函数调用 cosyvoice_service.synthesize_speech() 之前,增加 voice_id 解析逻辑:

  1. 注入 VoiceCloneProfileRepository 依赖
  2. 用 request.voice_id 查询 VoiceCloneProfile
  3. 命中且 voice_id 非空 → 替换为实际 CosyVoice 音色 ID
  4. 命中但 voice_id 为空(克隆未完成)→ 返回 400
  5. 未命中 → 预设音色 ID,保持原逻辑不变

测试

新增 3 个单元测试,全部 11 个测试通过。

## 问题 前端对克隆音色传的是 VoiceCloneProfile 的 id(UUID),但 CosyVoice API 需要的是 profile.voice_id(CosyVoice 返回的实际音色标识)。当前 /tts/preview 代码直接把 UUID 传给 CosyVoice,导致 418 错误。 ## 修复 在 preview_tts 函数调用 cosyvoice_service.synthesize_speech() 之前,增加 voice_id 解析逻辑: 1. 注入 VoiceCloneProfileRepository 依赖 2. 用 request.voice_id 查询 VoiceCloneProfile 3. 命中且 voice_id 非空 → 替换为实际 CosyVoice 音色 ID 4. 命中但 voice_id 为空(克隆未完成)→ 返回 400 5. 未命中 → 预设音色 ID,保持原逻辑不变 ## 测试 新增 3 个单元测试,全部 11 个测试通过。
xiaoxia added 1 commit 2026-08-25 15:58:23 +08:00
fix: /tts/preview 解析克隆音色 UUID 为 CosyVoice voice_id
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 46s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 25s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m48s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m49s
AI Code Review / AI Code Review (pull_request) Failing after 1m54s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m6s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m11s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m57s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m44s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 5m54s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
7e7b73a2e1
前端传 VoiceCloneProfile UUID 作为 voice_id,但 CosyVoice 需要
profile.voice_id(实际音色标识)。当前代码直接传 UUID 导致 418 错误。

修复:
- preview_tts 注入 VoiceCloneProfileRepository 依赖
- 调用前用 request.voice_id 查询 profile
- 命中且 voice_id 非空 → 替换为实际音色 ID
- 命中但 voice_id 为空(克隆未完成)→ 返回 400
- 未命中 → 预设音色,保持原逻辑

新增 3 个测试覆盖克隆音色解析、未完成克隆、预设音色直通。

🚀 预览环境已部署

项目 详情
PR号 #1497
预览链接 https://pr-1497.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1497 | | 预览链接 | [https://pr-1497.preview.xiaoxiajianji.com](https://pr-1497.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-08-25 16:05:15 +08:00
fix: 补充克隆音色权限校验 + 测试 user_id mock
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 28s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 19s
AI Code Review / AI Code Review (pull_request) Successful in 1m44s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m46s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m47s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m37s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m40s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m11s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m48s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 6m20s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 8m22s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 6m45s
CI/CD Pipeline / CI Gate (pull_request) Successful in 14s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 1m1s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m6s
287a5dcd0f
AI Code Review 指出越权风险:未校验 VoiceCloneProfile 归属。
新增 profile.user_id != authenticated_user.user.id → 403。
补充 12 个测试全部通过。
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:否
  • 阻塞级问题数量:0 个

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:2 个

🔴 阻塞级问题(必须修复)

💡 改进建议(不阻塞合并)

  1. [apps/api/app/api/routes/tts.py: 384] 缺少类型提示

    • 具体内容:建议为依赖注入的 voice_clone_repo 参数添加类型注解(例如 VoiceCloneProfileRepository),以增强代码可读性并获得更好的 IDE 静态检查支持。
  2. [tests/unit/test_tts_preview.py] 减少测试代码重复

    • 具体内容:在多个测试用例(如 test_preview_tts_success, test_preview_tts_cosyvoice_error 等)中重复了相同的 mock_clone_repo 设置代码块。建议将其提取到 setUp 方法或使用 pytest fixture 来统一管理,以减少样板代码,提高测试代码的可维护性。

良好实践

  • 权限校验完善:新增的逻辑正确校验了克隆音色的归属权(user_id),有效防止了越权访问(IDOR漏洞)。
  • 边界条件处理:对克隆音色未完成(voice_id 为空)的情况进行了单独处理,返回了明确的 400 错误提示。
  • 测试覆盖全面:新增的测试用例覆盖了预设音色透传、克隆音色解析、权限校验失败以及克隆未完成等多种场景,确保了新功能的稳定性。

🤖 由 AI 代码审查机器人自动生成 | 2026-08-25 08:06:59 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[apps/api/app/api/routes/tts.py: 384] 缺少类型提示** - 具体内容:建议为依赖注入的 `voice_clone_repo` 参数添加类型注解(例如 `VoiceCloneProfileRepository`),以增强代码可读性并获得更好的 IDE 静态检查支持。 2. **[tests/unit/test_tts_preview.py] 减少测试代码重复** - 具体内容:在多个测试用例(如 `test_preview_tts_success`, `test_preview_tts_cosyvoice_error` 等)中重复了相同的 `mock_clone_repo` 设置代码块。建议将其提取到 `setUp` 方法或使用 pytest fixture 来统一管理,以减少样板代码,提高测试代码的可维护性。 ### ✅ 良好实践 - **权限校验完善**:新增的逻辑正确校验了克隆音色的归属权(`user_id`),有效防止了越权访问(IDOR漏洞)。 - **边界条件处理**:对克隆音色未完成(`voice_id` 为空)的情况进行了单独处理,返回了明确的 400 错误提示。 - **测试覆盖全面**:新增的测试用例覆盖了预设音色透传、克隆音色解析、权限校验失败以及克隆未完成等多种场景,确保了新功能的稳定性。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-25 08:06:59 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-08-25 16:15:37 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-08-25 16:15:41 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 41c1845aa1 into develop 2026-08-25 16:26:17 +08:00
auto-approve-bot deleted branch fix/tts-preview-voice-clone-id 2026-08-25 16:26:17 +08:00

🗑️ 预览环境已清理

PR #1497 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1497 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.