fix(#1195): 我的音色页面试听按钮对接/voice-clones/{id}/preview接口 #1204

Merged
xiaoxia merged 1 commits from fix/voice-clone-preview-frontend-1195 into develop 2026-08-01 16:20:35 +08:00
Owner

改动说明

#1195 克隆音色试听前端对接:

  1. API层:新增 VoiceClonePreviewResponse 类型和 getVoiceClonePreview 函数
  2. 播放逻辑:我的音色页面试听从直接使用 sample_url 改为调用 /voice-clones/{id}/preview 接口获取音频URL后播放
  3. 加载态:新增 loadingPreviewId 状态,合成中按钮显示「合成中…」并禁用
  4. 错误处理:接口失败Toast提示,播放失败友好提示

相关Issue

#1195 克隆音色试听接口前端对接

## 改动说明 #1195 克隆音色试听前端对接: 1. **API层**:新增 `VoiceClonePreviewResponse` 类型和 `getVoiceClonePreview` 函数 2. **播放逻辑**:我的音色页面试听从直接使用 `sample_url` 改为调用 `/voice-clones/{id}/preview` 接口获取音频URL后播放 3. **加载态**:新增 `loadingPreviewId` 状态,合成中按钮显示「合成中…」并禁用 4. **错误处理**:接口失败Toast提示,播放失败友好提示 ## 相关Issue #1195 克隆音色试听接口前端对接
xiaoxia force-pushed fix/voice-clone-preview-frontend-1195 from fac8eae5c9 to 1e360a84eb 2026-07-31 15:51:26 +08:00 Compare
xiaoxia force-pushed fix/voice-clone-preview-frontend-1195 from d6367cf846 to 99c08f51f1 2026-08-01 01:36:41 +08:00 Compare

🚀 预览环境已部署

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

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

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

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

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

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia force-pushed fix/voice-clone-preview-frontend-1195 from 3c67a1a702 to dd34c9cde0 2026-08-01 01:56:05 +08:00 Compare
xiaoxia added 1 commit 2026-08-01 16:12:21 +08:00
fix(#1195): 我的音色页面试听按钮对接/voice-clones/{id}/preview接口
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 / 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 40s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 52s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 56s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m21s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m9s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 47s
AI Code Review / AI Code Review (pull_request) Successful in 2m22s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m47s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m20s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m50s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m54s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
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 6s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 38s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 49s
74f146bbaf
- API层新增VoiceClonePreviewResponse类型和getVoiceClonePreview函数
- useMyVoices hook播放逻辑改为先调接口获取音频URL再播放
- 新增loadingPreviewId状态,试听合成中显示加载态
- VoiceCard增加isLoading prop,加载时按钮显示"合成中…"并禁用
- 错误处理:接口失败Toast提示,播放失败友好提示
xiaoxia force-pushed fix/voice-clone-preview-frontend-1195 from e91023e345 to 74f146bbaf 2026-08-01 16:12:21 +08:00 Compare
Collaborator

代码审查结果 - PR #1204

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

  1. apps/web/src/pages/my-voices/hooks/useMyVoices.ts 第38-40行:音频切换逻辑存在状态污染风险

    • 问题描述:在切换播放时,代码仅执行了 pause() 和置空引用,但未移除旧音频对象的 onended 事件监听器。如果前一个音频在后台播放结束(或缓冲结束),其 onended 回调仍会触发,导致 setPlayingId(null) 被错误执行,从而打断当前正在播放的音频的 UI 状态。
    • 后果:导致 UI 状态与实际播放不符(例如音频 B 正在播放,但界面显示暂停),且用户无法正常进行暂停操作。
  2. apps/web/src/pages/my-voices/hooks/useMyVoices.ts 第43-45行:阻止了在加载期间切换音色的逻辑

    • 问题描述:代码中判断 if (loadingPreviewId && loadingPreviewId !== voice.id) { return },导致当音色 A 正在生成试听时,用户点击音色 B 会被直接忽略,无任何反馈。
    • 后果:用户体验极差,界面看似卡死或无响应,用户必须等待上一个请求完成才能切换,不符合播放器常规交互逻辑。

💡 建议(1个可选)

  1. apps/web/src/pages/my-voices/hooks/useMyVoices.ts:建议引入 AbortController 取消未完成的请求
    • 具体内容:当前逻辑中,如果用户快速切换音色,前一个 getVoiceClonePreview 请求仍在后台运行。建议使用 AbortController 在开始新请求前取消旧请求,既节省服务器资源,也能从根本上解决竞态条件(Race Condition)问题。

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


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

## 代码审查结果 - PR #1204 ### ⚠️ 问题(2个需要修改) 1. **apps/web/src/pages/my-voices/hooks/useMyVoices.ts 第38-40行**:音频切换逻辑存在状态污染风险 - **问题描述**:在切换播放时,代码仅执行了 `pause()` 和置空引用,但未移除旧音频对象的 `onended` 事件监听器。如果前一个音频在后台播放结束(或缓冲结束),其 `onended` 回调仍会触发,导致 `setPlayingId(null)` 被错误执行,从而打断当前正在播放的音频的 UI 状态。 - **后果**:导致 UI 状态与实际播放不符(例如音频 B 正在播放,但界面显示暂停),且用户无法正常进行暂停操作。 2. **apps/web/src/pages/my-voices/hooks/useMyVoices.ts 第43-45行**:阻止了在加载期间切换音色的逻辑 - **问题描述**:代码中判断 `if (loadingPreviewId && loadingPreviewId !== voice.id) { return }`,导致当音色 A 正在生成试听时,用户点击音色 B 会被直接忽略,无任何反馈。 - **后果**:用户体验极差,界面看似卡死或无响应,用户必须等待上一个请求完成才能切换,不符合播放器常规交互逻辑。 ### 💡 建议(1个可选) 1. **apps/web/src/pages/my-voices/hooks/useMyVoices.ts**:建议引入 AbortController 取消未完成的请求 - **具体内容**:当前逻辑中,如果用户快速切换音色,前一个 `getVoiceClonePreview` 请求仍在后台运行。建议使用 `AbortController` 在开始新请求前取消旧请求,既节省服务器资源,也能从根本上解决竞态条件(Race Condition)问题。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-01 08:14:38 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 25bbfdda6b into develop 2026-08-01 16:20:35 +08:00
xiaoxia deleted branch fix/voice-clone-preview-frontend-1195 2026-08-01 16:20:35 +08:00

🗑️ 预览环境已清理

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

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

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