fix: 修复预置音色voice_id并填充preview_url #1216

Merged
xiaoxia merged 4 commits from feat/preset-voice-previews into develop 2026-08-02 08:55:14 +08:00
Owner

问题

8个预置音色的 preview_url 全是空串,导致 #1195 试听功能无法工作。
此外 3 个音色 ID 在 CosyVoice v3 中不存在(longxiaochen_v3/longjing_v3/longbo_v3),调用会返回 418 错误。

修复

  1. 替换无效音色为 CosyVoice v3 真实可用音色:

    • longxiaochen_v3(龙小晨) → longsanshu_v3(龙三叔) — 沉稳质感男声
    • longjing_v3(龙静) → longyingjing_v3(龙应静) — 低调冷静女声
    • longbo_v3(龙博) → longshuo_v3(龙硕) — 博才干练男声
  2. 填充 preview_url:5个音色已通过 CosyVoice TTS 生成试听音频并填充 DashScope URL

    • longxiaochun_v3
    • longxiaoxia_v3
    • longyue_v3
    • longshu_v3
    • longtian_v3
    • 3个新音色待部署后生成
  3. 新增种子脚本 scripts/seed_test_voice_clones.py:为 staging 测试账号创建克隆音色测试数据

测试

  • 80 个预置音色相关单测全绿
  • 音色列表保持 8 个(5女3男)
## 问题 8个预置音色的 `preview_url` 全是空串,导致 #1195 试听功能无法工作。 此外 3 个音色 ID 在 CosyVoice v3 中不存在(longxiaochen_v3/longjing_v3/longbo_v3),调用会返回 418 错误。 ## 修复 1. **替换无效音色**为 CosyVoice v3 真实可用音色: - longxiaochen_v3(龙小晨) → longsanshu_v3(龙三叔) — 沉稳质感男声 - longjing_v3(龙静) → longyingjing_v3(龙应静) — 低调冷静女声 - longbo_v3(龙博) → longshuo_v3(龙硕) — 博才干练男声 2. **填充 preview_url**:5个音色已通过 CosyVoice TTS 生成试听音频并填充 DashScope URL - longxiaochun_v3 ✅ - longxiaoxia_v3 ✅ - longyue_v3 ✅ - longshu_v3 ✅ - longtian_v3 ✅ - 3个新音色待部署后生成 3. **新增种子脚本** `scripts/seed_test_voice_clones.py`:为 staging 测试账号创建克隆音色测试数据 ## 测试 - 80 个预置音色相关单测全绿 - 音色列表保持 8 个(5女3男)

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1216 | | 预览链接 | [https://pr-1216.preview.xiaoxiajianji.com](https://pr-1216.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 4 commits 2026-08-02 08:47:42 +08:00
- 替换3个不存在的CosyVoice v3音色:
  - longxiaochen_v3(龙小晨) → longsanshu_v3(龙三叔)
  - longjing_v3(龙静) → longyingjing_v3(龙应静)
  - longbo_v3(龙博) → longshuo_v3(龙硕)
- 填充5个可用音色的preview_url(CosyVoice试听音频)
- 新增seed脚本scripts/seed_test_voice_clones.py用于staging测试数据
- 更新3个测试文件匹配新音色ID和描述
ci: rebase on latest develop (include #1214 #1215)
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 E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 33s
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 / Validate - Type Check (mypy) (pull_request) Successful in 52s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 58s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m22s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m40s
AI Code Review / AI Code Review (pull_request) Successful in 2m22s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m58s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m0s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m13s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 2m52s
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 / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m29s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m14s
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 45s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m1s
6397a25e41
xiaoxia force-pushed feat/preset-voice-previews from 7e534c1b1d to 6397a25e41 2026-08-02 08:47:42 +08:00 Compare
Collaborator

代码审查结果 - PR #1216

⚠️ 问题(2个需要修改)

  1. scripts/seed_test_voice_clones.py 第165-170行:事务回滚逻辑错误导致数据丢失

    • 问题描述:在循环中执行 create_clone_profile 时,如果中途某条记录插入失败触发异常,代码执行了 session.rollback()。由于 SQLAlchemy 默认不开启自动提交,回滚操作会撤销当前事务中所有未提交的更改(包括之前循环中已经成功插入但尚未 commit 的记录)。脚本继续执行后续循环,但之前成功的数据已丢失,最终只有最后一次成功的事务会被提交。
    • 后果:导致脚本报告的 total_created 数量与实际写入数据库的数量不一致,部分测试数据丢失。
    • 修改建议:应在每次成功创建后立即提交,或者将每个账号的处理包裹在独立的事务作用域中,避免一个失败导致全部回滚。
  2. [packages/domain/preset_voices.py] 第80-110行:破坏性变更导致存量数据失效

    • 问题描述:PR 修改了已存在的预置音色 ID(如 longxiaochen_v3 改为 longsanshu_v3longjing_v3 改为 longyingjing_v3 等)。voice_id 通常作为业务标识符被存储在数据库或用户配置中。直接修改 ID 会导致引用旧 ID 的数据无法找到对应音色,功能失效。
    • 后果:生产环境中已保存的用户配置(如默认音色选择)将失效,可能引发 404 错误或回退到默认行为。
    • 修改建议:保持旧 ID 不变,或者增加数据迁移逻辑将旧 ID 映射到新 ID;如果旧音色已下线,应将其标记为 deprecated 而非直接复用 ID 或删除。

💡 建议(2个可选)

  1. [packages/domain/preset_voices.py] 预览 URL 管理建议

    • 具体内容:新增的 preview_url 包含 Expires(过期时间)和 Signature 签名参数。硬编码这些 URL 意味着它们在 2026 年左右会失效。建议评估是否需要服务端签名代理,或者至少添加监控/文档提醒在过期前更新。此外,部分新增音色(如 longsanshu_v3)缺少 preview_url,需确认前端是否能处理空值。
  2. [scripts/seed_test_voice_clones.py] 敏感信息硬编码

    • 具体内容:脚本中硬编码了测试账号邮箱 18314979086@163.com。建议通过环境变量传入测试账号,以提高脚本在不同环境的通用性和安全性。

格式检查通过 | 逻辑审查需修改 | 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-08-02 00:50:05 | 模型:

## 代码审查结果 - PR #1216 ### ⚠️ 问题(2个需要修改) 1. **scripts/seed_test_voice_clones.py 第165-170行**:事务回滚逻辑错误导致数据丢失 - **问题描述**:在循环中执行 `create_clone_profile` 时,如果中途某条记录插入失败触发异常,代码执行了 `session.rollback()`。由于 SQLAlchemy 默认不开启自动提交,回滚操作会撤销当前事务中**所有**未提交的更改(包括之前循环中已经成功插入但尚未 commit 的记录)。脚本继续执行后续循环,但之前成功的数据已丢失,最终只有最后一次成功的事务会被提交。 - **后果**:导致脚本报告的 `total_created` 数量与实际写入数据库的数量不一致,部分测试数据丢失。 - **修改建议**:应在每次成功创建后立即提交,或者将每个账号的处理包裹在独立的事务作用域中,避免一个失败导致全部回滚。 2. **[packages/domain/preset_voices.py] 第80-110行**:破坏性变更导致存量数据失效 - **问题描述**:PR 修改了已存在的预置音色 ID(如 `longxiaochen_v3` 改为 `longsanshu_v3`,`longjing_v3` 改为 `longyingjing_v3` 等)。`voice_id` 通常作为业务标识符被存储在数据库或用户配置中。直接修改 ID 会导致引用旧 ID 的数据无法找到对应音色,功能失效。 - **后果**:生产环境中已保存的用户配置(如默认音色选择)将失效,可能引发 404 错误或回退到默认行为。 - **修改建议**:保持旧 ID 不变,或者增加数据迁移逻辑将旧 ID 映射到新 ID;如果旧音色已下线,应将其标记为 deprecated 而非直接复用 ID 或删除。 ### 💡 建议(2个可选) 1. **[packages/domain/preset_voices.py] 预览 URL 管理建议** - **具体内容**:新增的 `preview_url` 包含 `Expires`(过期时间)和 `Signature` 签名参数。硬编码这些 URL 意味着它们在 2026 年左右会失效。建议评估是否需要服务端签名代理,或者至少添加监控/文档提醒在过期前更新。此外,部分新增音色(如 `longsanshu_v3`)缺少 `preview_url`,需确认前端是否能处理空值。 2. **[scripts/seed_test_voice_clones.py] 敏感信息硬编码** - **具体内容**:脚本中硬编码了测试账号邮箱 `18314979086@163.com`。建议通过环境变量传入测试账号,以提高脚本在不同环境的通用性和安全性。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-02 00:50:05 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 2f26541188 into develop 2026-08-02 08:55:14 +08:00

🗑️ 预览环境已清理

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

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

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