fix(#549): 预设配音无声 - 字幕对齐TTS配音模式 + ASR缓存 #628

Merged
auto-approve-bot merged 6 commits from fix/549-preset-voice-one-click-gen into develop 2026-07-20 12:49:54 +08:00
Owner

问题

预设配音选择后生成视频听不到声音。

根因

前端预设配音模式(preset)只传 config.voice_id,不传 custom_text。原桥接逻辑只有 voice_id+custom_text 同时存在才触发 TTS,导致预设配音场景下 TTS 配音从未被触发。

修复方案

新增字幕对齐配音模式:检测到 voice_id + subtitle.auto_generated=true + 有ASR服务时,先做ASR识别字幕,再用字幕文本逐句生成TTS配音,按字幕时间轴对齐。

关键改动

  1. _maybe_add_voiceover_layer 扩展:支持三种触发方式

    • config.tts.enabled=true → 标准配置
    • voice_id + custom_text → 整段配音(custom模式)
    • voice_id + auto_generated字幕 → 字幕对齐配音(preset模式)
  2. ASR结果缓存_generate_asr_subtitles 增加缓存,字幕叠加和TTS配音共用一次ASR调用

  3. 支持标准 align_mode=subtitle:tts配置里直接设也能走字幕对齐

降级策略

  • ASR无结果 → 跳过配音,不阻断主流程
  • 无ASR服务 → 不触发字幕对齐模式
  • TTS生成失败 → 优雅降级,日志告警

测试

新增7个单元测试,173个测试全绿。

注:PR #626 只修了 custom_text 桥接,是本修复的子集;本PR包含且超越 #626 修复范围,#626 可关闭

## 问题 预设配音选择后生成视频听不到声音。 ## 根因 前端预设配音模式(preset)只传 `config.voice_id`,不传 `custom_text`。原桥接逻辑只有 voice_id+custom_text 同时存在才触发 TTS,导致预设配音场景下 TTS 配音从未被触发。 ## 修复方案 新增**字幕对齐配音模式**:检测到 `voice_id` + `subtitle.auto_generated=true` + 有ASR服务时,先做ASR识别字幕,再用字幕文本逐句生成TTS配音,按字幕时间轴对齐。 ### 关键改动 1. **`_maybe_add_voiceover_layer` 扩展**:支持三种触发方式 - `config.tts.enabled=true` → 标准配置 - `voice_id + custom_text` → 整段配音(custom模式) - `voice_id + auto_generated字幕` → 字幕对齐配音(preset模式) 2. **ASR结果缓存**:`_generate_asr_subtitles` 增加缓存,字幕叠加和TTS配音共用一次ASR调用 3. **支持标准 `align_mode=subtitle`**:tts配置里直接设也能走字幕对齐 ### 降级策略 - ASR无结果 → 跳过配音,不阻断主流程 - 无ASR服务 → 不触发字幕对齐模式 - TTS生成失败 → 优雅降级,日志告警 ## 测试 新增7个单元测试,173个测试全绿。 > 注:PR #626 只修了 custom_text 桥接,是本修复的子集;本PR包含且超越 #626 修复范围,#626 可关闭
xiaoxia added 2 commits 2026-07-20 11:17:52 +08:00
根因:前端一键生成页面传 config.voice_id + config.custom_text(顶层字段),
      统一渲染引擎从 config.tts 嵌套对象读取TTS配置,路径完全不匹配,
      导致 TTS 配音从未被触发,选了预设配音也等于没选。

修复:在 _maybe_add_voiceover_layer 增加桥接兼容逻辑——
      当 tts.enabled 为 False 但顶层有 voice_id + custom_text 时,
      自动映射为 tts 配置并触发配音生成。

新增4个单元测试覆盖:桥接触发、tts配置优先、缺文本不触发、无配置不触发。
fix(#549): 预设配音无声 - 新增字幕对齐TTS配音模式 + ASR缓存
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 / Build Staging Worker Image (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 / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (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 / Staging E2E Tests (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 / Check if frontend-only change (pull_request) Successful in 10s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 17s
AI Code Review / AI Code Review (pull_request) Failing after 32s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 37s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Failing after 2m6s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m21s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m24s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m24s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m35s
681b468135
根因:
1. 前端预设配音模式(preset)只传voice_id,不传custom_text
2. 原桥接逻辑只有voice_id+custom_text同时存在才触发TTS
3. 预设配音场景下TTS从未被触发=无声

修复:
- 新增字幕对齐配音模式:voice_id + subtitle.auto_generated=true → 用ASR字幕生成逐句TTS配音
- ASR结果缓存:字幕和配音共用一次ASR调用,避免重复识别
- 支持config.tts.align_mode=subtitle标准配置也走字幕对齐
- 新增7个单元测试覆盖预设配音+自动字幕全场景

补充:
- 保留原custom_text桥接逻辑(自定义文案配音场景)
- ASR无结果时优雅降级,不阻断主流程
xiaoxia added 1 commit 2026-07-20 11:31:44 +08:00
style: black format test_unified_render_service.py
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 / 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 / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 17s
AI Code Review / AI Code Review (pull_request) Failing after 35s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 4s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 35s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 4m6s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Failing after 1m56s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 5m28s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 7m8s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m38s
ed56676d14
xiaoxia added 1 commit 2026-07-20 11:44:30 +08:00
style: 修复ruff E741 ambiguous variable name (l -> layer)
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 / 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 / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 21s
AI Code Review / AI Code Review (pull_request) Failing after 32s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 4s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 4m3s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Failing after 22s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m30s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 2m11s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 6m58s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m33s
40b9468fb6
xiaoxia added 1 commit 2026-07-20 12:10:50 +08:00
fix(test): 修复E741变量名替换不完整导致的NameError
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 / 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 / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 18s
AI Code Review / AI Code Review (pull_request) Failing after 28s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 37s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 33s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 3m36s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 4m41s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m54s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m49s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 13m46s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 22m32s
7fd3dcd985
auto-approve-bot approved these changes 2026-07-20 12:15:44 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
Collaborator

Auto merge skipped after multiple 405 errors: PR may have conflicts or unresolved checks. Please review manually. This is not a CI failure.

Auto merge skipped after multiple 405 errors: PR may have conflicts or unresolved checks. Please review manually. This is not a CI failure.
xiaoxia added 1 commit 2026-07-20 12:44:07 +08:00
merge: 合并develop解决冲突
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 / 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 / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 15s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 18s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 41s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m44s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 2m46s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m5s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m33s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 5m44s
AI Code Review / AI Code Review (pull_request) Successful in 6m17s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 38s
13ab35ecd8
xiaoxia force-pushed fix/549-preset-voice-one-click-gen from 8f8854bbdb to 13ab35ecd8 2026-07-20 12:44:07 +08:00 Compare
auto-approve-bot merged commit f01f4803e4 into develop 2026-07-20 12:49:54 +08:00
auto-approve-bot deleted branch fix/549-preset-voice-one-click-gen 2026-07-20 12:49:54 +08:00
Collaborator

代码审查结果 - PR #628

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

  1. apps/worker/video_processing/unified_render_service.py 第650行左右:严重逻辑错误,异常处理导致变量未定义。

    • 问题描述:在 _generate_asr_subtitles 方法中,try 块内定义了 timeline,随后的 except Exception: pass 捕获了所有异常但未处理。如果 self.asr_service.transcribe(...) 抛出异常,代码会继续执行到 self._asr_timeline_cache = timeline,此时 timeline 未被赋值,将导致 UnboundLocalError 崩溃。
    • 后果:ASR 识别失败时会导致渲染进程崩溃,且无法记录具体错误原因。
  2. apps/worker/video_processing/unified_render_service.py 第763行左右:严重逻辑错误,配置变量未生效。

    • 问题描述:在 _maybe_add_voiceover_layer 方法中,新增代码定义并修改了局部变量 tts_cfg(用于设置 align_mode 等新字段),但在后续的条件判断和实际调用中,使用的是旧变量 tts_config(如 if use_subtitle_align or tts_config.align_mode == "subtitle")。
    • 后果:针对 tts_cfg 的配置修改(如开启字幕对齐模式)全部丢失,导致新功能逻辑失效,代码依然使用旧的(可能为空或默认的)tts_config 进行判断和调用。

💡 建议(1个可选)

  1. apps/worker/video_processing/unified_render_service.py 第637-639行:避免使用裸 except 捕获所有异常。
    • 建议描述except Exception: pass 会掩盖包括 KeyboardInterrupt 在内的所有错误,且没有任何日志输出,极难排查问题。建议捕获具体的异常类型(如 ASRServiceError),或至少在 except 块中添加 logger.error("ASR识别失败", exc_info=True) 并返回一个空的 SubtitleTimeline 对象以保证流程健壮性。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-07-20 12:50:25 | 模型:

## 代码审查结果 - PR #628 ### ⚠️ 问题(2个需要修改) 1. **apps/worker/video_processing/unified_render_service.py 第650行左右**:严重逻辑错误,异常处理导致变量未定义。 - **问题描述**:在 `_generate_asr_subtitles` 方法中,`try` 块内定义了 `timeline`,随后的 `except Exception: pass` 捕获了所有异常但未处理。如果 `self.asr_service.transcribe(...)` 抛出异常,代码会继续执行到 `self._asr_timeline_cache = timeline`,此时 `timeline` 未被赋值,将导致 `UnboundLocalError` 崩溃。 - **后果**:ASR 识别失败时会导致渲染进程崩溃,且无法记录具体错误原因。 2. **apps/worker/video_processing/unified_render_service.py 第763行左右**:严重逻辑错误,配置变量未生效。 - **问题描述**:在 `_maybe_add_voiceover_layer` 方法中,新增代码定义并修改了局部变量 `tts_cfg`(用于设置 `align_mode` 等新字段),但在后续的条件判断和实际调用中,使用的是旧变量 `tts_config`(如 `if use_subtitle_align or tts_config.align_mode == "subtitle"`)。 - **后果**:针对 `tts_cfg` 的配置修改(如开启字幕对齐模式)全部丢失,导致新功能逻辑失效,代码依然使用旧的(可能为空或默认的)`tts_config` 进行判断和调用。 ### 💡 建议(1个可选) 1. **apps/worker/video_processing/unified_render_service.py 第637-639行**:避免使用裸 except 捕获所有异常。 - **建议描述**:`except Exception: pass` 会掩盖包括 `KeyboardInterrupt` 在内的所有错误,且没有任何日志输出,极难排查问题。建议捕获具体的异常类型(如 `ASRServiceError`),或至少在 `except` 块中添加 `logger.error("ASR识别失败", exc_info=True)` 并返回一个空的 `SubtitleTimeline` 对象以保证流程健壮性。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-20 12:50:25 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🗑️ 预览环境已清理

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

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

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