fix(#1196): TTS面板克隆音色试听改用/voice-clones/{id}/preview接口 #1205

Merged
xiaoxia merged 1 commits from fix/tts-clone-voice-preview-1196 into develop 2026-08-01 16:29:54 +08:00
Owner

改动说明

#1196 TTS面板克隆音色试听优化:

  1. VoiceSelector组件:克隆音色试听按钮增加loading态,合成中显示旋转图标并禁用
  2. useTtsPanel hookhandlePlayVoiceSample 接收完整voice对象,区分 type === "clone"type === "preset"
  3. 克隆音色试听逻辑:调用 /voice-clones/{id}/preview 接口实时合成音频,再播放
  4. 预设音色保持不变:直接使用 preview_url / audio_url 播放
  5. 错误处理:接口失败友好提示,播放失败统一处理

依赖

本PR基于#1195的API层改动(getVoiceClonePreview 函数),需在#1204之后合入。

相关Issue

#1196 智能剪辑配音可选克隆音色

## 改动说明 #1196 TTS面板克隆音色试听优化: 1. **VoiceSelector组件**:克隆音色试听按钮增加loading态,合成中显示旋转图标并禁用 2. **useTtsPanel hook**:`handlePlayVoiceSample` 接收完整voice对象,区分 `type === "clone"` 和 `type === "preset"` 3. **克隆音色试听逻辑**:调用 `/voice-clones/{id}/preview` 接口实时合成音频,再播放 4. **预设音色保持不变**:直接使用 `preview_url` / `audio_url` 播放 5. **错误处理**:接口失败友好提示,播放失败统一处理 ## 依赖 本PR基于#1195的API层改动(`getVoiceClonePreview` 函数),需在#1204之后合入。 ## 相关Issue #1196 智能剪辑配音可选克隆音色

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1205 | | 预览链接 | [https://pr-1205.preview.xiaoxiajianji.com](https://pr-1205.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot approved these changes 2026-08-01 01:41:11 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia force-pushed fix/tts-clone-voice-preview-1196 from 746a755df4 to 1ae20c278b 2026-08-01 01:56:10 +08:00 Compare
xiaoxia force-pushed fix/tts-clone-voice-preview-1196 from 837678384d to 517e0d6a04 2026-08-01 16:12:54 +08:00 Compare
xiaoxia added 1 commit 2026-08-01 16:23:05 +08:00
fix(#1196): TTS面板克隆音色试听改用/voice-clones/{id}/preview接口
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 24s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 44s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 42s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m16s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m46s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 3m6s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 55s
AI Code Review / AI Code Review (pull_request) Successful in 2m55s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m14s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m28s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m38s
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
CI/CD Pipeline / CI Gate (pull_request) Successful in 35s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 33s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 36s
b7ef9fed14
- VoiceSelector: 克隆音色试听按钮加loading态,点击时显示合成中
- useTtsPanel: handlePlayVoiceSample接收完整voice对象,区分preset/clone
- 克隆音色调用/voice-clones/{id}/preview接口实时合成试听音频
- 预设音色保持原有逻辑直接播放preview_url
- 统一错误处理和竞态防护
xiaoxia force-pushed fix/tts-clone-voice-preview-1196 from 517e0d6a04 to b7ef9fed14 2026-08-01 16:23:05 +08:00 Compare
Collaborator

代码审查结果 - PR #1205

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

  1. useTtsPanel.ts 第206行:异步竞态条件导致UI状态错误。
    • 问题描述:在 finally 块中直接调用 setLoadingSampleVoiceId(null) 会无条件清除加载状态。如果用户快速切换点击了两个不同的克隆音色(例如先点A,再点B),当A的请求完成时,finally 块会将 loadingSampleVoiceId 置为 null。此时B的请求可能仍在进行中,但UI上B的加载状态会消失,导致用户误以为B已准备好,从而可能触发重复请求或交互混乱。
    • 修改建议:应使用函数式更新状态,仅当当前结束的请求ID与状态中保存的ID一致时才清除状态。修改为:setLoadingSampleVoiceId(prev => prev === voiceId ? null : prev)。同时,第200行 catch 块中的 setLoadingSampleVoiceId(null) 是冗余的(因为 finally 必定执行),建议删除以保持逻辑单一。

💡 建议(1个可选)

  1. useTtsPanel.ts 第171行handlePlayVoiceSample 函数逻辑较长,建议将“克隆音色试听”的异步请求逻辑提取为独立的内部函数或自定义Hook,以提高代码可读性和可维护性。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-08-01 08:27:37 | 模型:

## 代码审查结果 - PR #1205 ### ⚠️ 问题(1个需要修改) 1. **useTtsPanel.ts 第206行**:异步竞态条件导致UI状态错误。 - **问题描述**:在 `finally` 块中直接调用 `setLoadingSampleVoiceId(null)` 会无条件清除加载状态。如果用户快速切换点击了两个不同的克隆音色(例如先点A,再点B),当A的请求完成时,`finally` 块会将 `loadingSampleVoiceId` 置为 `null`。此时B的请求可能仍在进行中,但UI上B的加载状态会消失,导致用户误以为B已准备好,从而可能触发重复请求或交互混乱。 - **修改建议**:应使用函数式更新状态,仅当当前结束的请求ID与状态中保存的ID一致时才清除状态。修改为:`setLoadingSampleVoiceId(prev => prev === voiceId ? null : prev)`。同时,第200行 `catch` 块中的 `setLoadingSampleVoiceId(null)` 是冗余的(因为 `finally` 必定执行),建议删除以保持逻辑单一。 ### 💡 建议(1个可选) 1. **useTtsPanel.ts 第171行**:`handlePlayVoiceSample` 函数逻辑较长,建议将“克隆音色试听”的异步请求逻辑提取为独立的内部函数或自定义Hook,以提高代码可读性和可维护性。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能关注 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-01 08:27:37 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 911c3b6866 into develop 2026-08-01 16:29:54 +08:00
xiaoxia deleted branch fix/tts-clone-voice-preview-1196 2026-08-01 16:29:55 +08:00

🗑️ 预览环境已清理

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

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

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