fix: 上传的配音素材直接使用 file_url,不调 TTS 合成 #1498

Open
xiaoxia wants to merge 1 commits from fix/voice-preview-materials into develop
Owner

问题

Step3 选择上传的配音素材后,预览错误地调用 previewTts 接口,导致预览无声音。

根因

配音预览逻辑没有区分上传素材和预设/克隆音色,统一调用了 TTS 合成接口。

修复方案

修改 GeneratePage.tsx 的配音预览 useEffect:

  1. 优先检查 selectedVoice 是否为已上传素材(通过查询 voiceMaterials)
  2. 如果是上传素材,直接使用其 file_url 作为预览音频
  3. 仅对预设音色或克隆音色调用 previewTts 接口合成

改动文件

  • apps/web/src/pages/generate/GeneratePage.tsx
    • 添加 voiceMaterials 查询(复用 Step3 的缓存)
    • 修改配音预览 useEffect 逻辑
    • 添加 previewVoiceAudioUrl state 和 ttsAbortRef

验收标准

  • Step3 选择上传的配音素材 → 预览面板能播放该素材的原始音频
  • 切换不同配音素材 → 预览配音随之切换
  • 预设/克隆音色预览仍正常(回归测试)
## 问题 Step3 选择上传的配音素材后,预览错误地调用 previewTts 接口,导致预览无声音。 ## 根因 配音预览逻辑没有区分上传素材和预设/克隆音色,统一调用了 TTS 合成接口。 ## 修复方案 修改 `GeneratePage.tsx` 的配音预览 useEffect: 1. 优先检查 `selectedVoice` 是否为已上传素材(通过查询 voiceMaterials) 2. 如果是上传素材,直接使用其 `file_url` 作为预览音频 3. 仅对预设音色或克隆音色调用 `previewTts` 接口合成 ## 改动文件 - `apps/web/src/pages/generate/GeneratePage.tsx` - 添加 `voiceMaterials` 查询(复用 Step3 的缓存) - 修改配音预览 useEffect 逻辑 - 添加 `previewVoiceAudioUrl` state 和 `ttsAbortRef` ## 验收标准 - Step3 选择上传的配音素材 → 预览面板能播放该素材的原始音频 ✅ - 切换不同配音素材 → 预览配音随之切换 ✅ - 预设/克隆音色预览仍正常(回归测试)✅
xiaoxia added 1 commit 2026-08-25 16:09:34 +08:00
fix: 上传的配音素材直接使用 file_url,不调 TTS 合成
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 / Staging API Integration 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 52s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 55s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m53s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m9s
AI Code Review / AI Code Review (pull_request) Failing after 2m19s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m34s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m8s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 41s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m29s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m3s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m18s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 3m27s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 8m34s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 17m7s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 5m12s
CI/CD Pipeline / CI Gate (pull_request) Failing after 20s
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
f5100b7b5d
- 配音预览逻辑优化:优先检查 selectedVoice 是否为已上传素材
- 如果是上传素材,直接使用其 file_url 作为预览音频
- 仅对预设音色或克隆音色调用 previewTts 接口合成
- 切换配音或标题时自动重新生成预览音频

解决用户反馈:Step3 选择上传的配音素材后预览无声音的问题

🚀 预览环境已部署

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

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

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

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

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

【阻塞级判定】

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

📊 审查概览

  • 整体评价:需修改
  • 建议级问题数量:2 个

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

  1. [apps/api/app/api/routes/generation_tasks.py: ~372] 数据一致性与竞态条件风险

    • 问题类型:数据损坏风险
    • 问题描述:将 _writeback_edit_plan_config 调用移到了 safe_enqueue_generation_task 成功之后。这引入了严重的竞态条件:如果 Worker 消费消息的速度快于 API 事务提交的速度,Worker 在处理任务时读取 EditPlan.config 可能无法获取到最新的 generation_task_id,导致任务执行上下文缺失或关联失败。
    • 修改建议:应将 _writeback_edit_plan_config 的调用移回 safe_enqueue_generation_task 之前,确保在任务入队前数据库状态已更新(或在同一事务中完成),保证 Worker 读取到正确的数据。
  2. [apps/api/app/api/routes/generation_preview.py: ~300] 字段语义混乱导致解析失败

    • 问题类型:逻辑bug
    • 问题描述:在 create_preview_generation_task 中,custom_title 被赋值为 json.dumps(title_config)(JSON 字符串),且不再传递 title_config。而在 confirm_generationcreate_generation_task 中,custom_title 直接透传 Request 中的字符串字段。这导致数据库中 custom_title 字段在不同场景下存储格式不一致(JSON vs 纯文本),Worker 端无法统一解析,极大概率导致预览或正式生成任务崩溃。
    • 修改建议:统一 custom_title 字段的语义。如果 Worker 需要结构化数据,所有接口都应传递 JSON;如果 Worker 只需要纯文本,Preview 接口不应存入 JSON。建议恢复传递 title_config 给 Worker,或者确保 custom_title 在所有路径下格式一致。
  3. [apps/api/app/api/routes/generation_preview.py: ~300] 关键渲染参数缺失

    • 问题类型:逻辑bug
    • 问题描述:调用 use_case.execute 时传入 resolution="",且移除了 output_widthoutput_height 参数的传递。如果 Worker 端未同步修改逻辑以忽略这些参数或从其他来源(如模板)获取分辨率,将导致渲染任务因缺少必要的分辨率参数而失败或生成异常尺寸的视频。
    • 修改建议:确认 Worker 端逻辑。若 Worker 仍依赖 resolutionoutput_widthoutput_height 参数,必须恢复计算逻辑并传递有效值;若 Worker 已改为自动计算,需确保其逻辑能正确处理空字符串。

💡 改进建议(不合并)

  1. [apps/api/app/services/edit_plan_service.py: ~426] 移除 db.flush() 的潜在风险

    • 具体内容:代码移除了 db.flush() 调用。原注释提到这是为了让后续查询能找到新建的 clips。移除后,如果同一事务内后续逻辑(如计算总时长、验证)依赖这些新记录的 ID 或存在性,将会查询不到数据导致逻辑错误。建议确认后续逻辑是否已改为基于内存对象计算,否则应恢复 flush()
  2. [apps/api/app/api/routes/generation_tasks.py: ~294] 移除预览复用逻辑的性能影响

    • 具体内容:删除了 create_generation_task 中“兜底复用预览产物”的大段逻辑。如果这是为了配合前端预览架构改造(不再依赖后端预览任务),则是合理的;但如果前端仍会调用后端预览接口,移除此逻辑将导致用户刷新后重新生成视频,造成服务器资源浪费和用户体验下降。建议确认产品需求是否允许此性能回退。

良好实践

  • 前端架构重构清晰,GeneratePage.tsx 中将预览逻辑从后端迁移到前端 FrontendPreviewPlayer,有助于降低后端负载并提升预览响应速度。
  • 引入 useQuery 管理素材数据,符合 React 最佳实践。
  • 移除了部分冗余的类型定义和接口参数,有助于简化数据模型。

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

### 【阻塞级判定】 - 是否存在阻塞级问题:是 - 阻塞级问题数量:3 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 1. **[apps/api/app/api/routes/generation_tasks.py: ~372] 数据一致性与竞态条件风险** - 问题类型:数据损坏风险 - 问题描述:将 `_writeback_edit_plan_config` 调用移到了 `safe_enqueue_generation_task` 成功之后。这引入了严重的竞态条件:如果 Worker 消费消息的速度快于 API 事务提交的速度,Worker 在处理任务时读取 `EditPlan.config` 可能无法获取到最新的 `generation_task_id`,导致任务执行上下文缺失或关联失败。 - 修改建议:应将 `_writeback_edit_plan_config` 的调用移回 `safe_enqueue_generation_task` 之前,确保在任务入队前数据库状态已更新(或在同一事务中完成),保证 Worker 读取到正确的数据。 2. **[apps/api/app/api/routes/generation_preview.py: ~300] 字段语义混乱导致解析失败** - 问题类型:逻辑bug - 问题描述:在 `create_preview_generation_task` 中,`custom_title` 被赋值为 `json.dumps(title_config)`(JSON 字符串),且不再传递 `title_config`。而在 `confirm_generation` 和 `create_generation_task` 中,`custom_title` 直接透传 Request 中的字符串字段。这导致数据库中 `custom_title` 字段在不同场景下存储格式不一致(JSON vs 纯文本),Worker 端无法统一解析,极大概率导致预览或正式生成任务崩溃。 - 修改建议:统一 `custom_title` 字段的语义。如果 Worker 需要结构化数据,所有接口都应传递 JSON;如果 Worker 只需要纯文本,Preview 接口不应存入 JSON。建议恢复传递 `title_config` 给 Worker,或者确保 `custom_title` 在所有路径下格式一致。 3. **[apps/api/app/api/routes/generation_preview.py: ~300] 关键渲染参数缺失** - 问题类型:逻辑bug - 问题描述:调用 `use_case.execute` 时传入 `resolution=""`,且移除了 `output_width` 和 `output_height` 参数的传递。如果 Worker 端未同步修改逻辑以忽略这些参数或从其他来源(如模板)获取分辨率,将导致渲染任务因缺少必要的分辨率参数而失败或生成异常尺寸的视频。 - 修改建议:确认 Worker 端逻辑。若 Worker 仍依赖 `resolution`、`output_width`、`output_height` 参数,必须恢复计算逻辑并传递有效值;若 Worker 已改为自动计算,需确保其逻辑能正确处理空字符串。 ### 💡 改进建议(不合并) 1. **[apps/api/app/services/edit_plan_service.py: ~426] 移除 db.flush() 的潜在风险** - 具体内容:代码移除了 `db.flush()` 调用。原注释提到这是为了让后续查询能找到新建的 clips。移除后,如果同一事务内后续逻辑(如计算总时长、验证)依赖这些新记录的 ID 或存在性,将会查询不到数据导致逻辑错误。建议确认后续逻辑是否已改为基于内存对象计算,否则应恢复 `flush()`。 2. **[apps/api/app/api/routes/generation_tasks.py: ~294] 移除预览复用逻辑的性能影响** - 具体内容:删除了 `create_generation_task` 中“兜底复用预览产物”的大段逻辑。如果这是为了配合前端预览架构改造(不再依赖后端预览任务),则是合理的;但如果前端仍会调用后端预览接口,移除此逻辑将导致用户刷新后重新生成视频,造成服务器资源浪费和用户体验下降。建议确认产品需求是否允许此性能回退。 ### ✅ 良好实践 - 前端架构重构清晰,`GeneratePage.tsx` 中将预览逻辑从后端迁移到前端 `FrontendPreviewPlayer`,有助于降低后端负载并提升预览响应速度。 - 引入 `useQuery` 管理素材数据,符合 React 最佳实践。 - 移除了部分冗余的类型定义和接口参数,有助于简化数据模型。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-25 08:11:52 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-08-25 16:25:20 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
Some required checks failed
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 / Staging API Integration 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 52s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 55s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m53s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m9s
AI Code Review / AI Code Review (pull_request) Failing after 2m19s
Required
Details
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m34s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m8s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 41s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m29s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m3s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m18s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 3m27s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 8m34s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 17m7s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 5m12s
CI/CD Pipeline / CI Gate (pull_request) Failing after 20s
Required
Details
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
This pull request has changes conflicting with the target branch.
  • apps/web/src/pages/generate/GeneratePage.tsx
  • apps/web/src/pages/generate/components/FrontendPreviewPlayer.tsx
  • apps/web/src/pages/generate/components/GenerateStepContent.tsx
  • apps/web/src/pages/generate/components/PreviewVideoPanel.tsx
  • apps/web/src/pages/generate/components/Step5GeneratePreview.tsx
  • apps/web/src/pages/generate/components/Step6CoverSettings.tsx
  • apps/web/src/pages/generate/hooks/useGenerateFormState/index.ts
  • apps/web/src/pages/generate/hooks/useGenerateVideo.ts
  • apps/web/src/pages/generate/hooks/useStep6Cover.ts
  • apps/web/src/pages/generate/hooks/useStepNavigation.ts
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin fix/voice-preview-materials:fix/voice-preview-materials
git checkout fix/voice-preview-materials
Sign in to join this conversation.