fix: 预览模式配音降级处理 - ASR 不可用时走整段配音模式 (#1294) #1307

Closed
xiaoxia wants to merge 1 commits from fix/issue-1294-preview-voiceover-asr-fallback into develop
Owner

问题

预览模式下,即使 ASR 不可用,配音也应该能工作。当前代码要求 self.asr_service is not None 才能触发配音(方式B),导致预览模式下配音完全不生效。

根因

unified_render_service.py:682 的条件过于严格:

elif top_voice_id and subtitle_cfg.get("auto_generated", False) and self.asr_service is not None:

ASR 只是用来做字幕对齐的,预览场景可以降级为整段配音模式(方式A),不依赖 ASR。

修复方案

  1. render_adapter.py:468 - 修复 import 路径

    • from services.asr_service_factory import get_asr_service
    • from apps.worker.services.asr_service_factory import get_asr_service
  2. unified_render_service.py:682 - 方式B 条件调整

    • ASR 可用时走字幕对齐模式(方式B)
    • ASR 不可用时降级为整段配音模式(方式A),使用 subtitle.text 作为配音内容

关联 Issue

#1294

## 问题 预览模式下,即使 ASR 不可用,配音也应该能工作。当前代码要求 `self.asr_service is not None` 才能触发配音(方式B),导致预览模式下配音完全不生效。 ## 根因 `unified_render_service.py:682` 的条件过于严格: ```python elif top_voice_id and subtitle_cfg.get("auto_generated", False) and self.asr_service is not None: ``` ASR 只是用来做字幕对齐的,预览场景可以降级为整段配音模式(方式A),不依赖 ASR。 ## 修复方案 1. **render_adapter.py:468** - 修复 import 路径 - `from services.asr_service_factory import get_asr_service` - → `from apps.worker.services.asr_service_factory import get_asr_service` 2. **unified_render_service.py:682** - 方式B 条件调整 - ASR 可用时走字幕对齐模式(方式B) - ASR 不可用时降级为整段配音模式(方式A),使用 `subtitle.text` 作为配音内容 ## 关联 Issue #1294
xiaoxia added 1 commit 2026-08-08 18:18:45 +08:00
fix: 预览模式配音降级处理 - ASR 不可用时走整段配音模式
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 / Build Staging API 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 28s
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 48s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m1s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m31s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m45s
AI Code Review / AI Code Review (pull_request) Successful in 2m2s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m2s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m3s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 2m8s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 3m3s
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 3m38s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m14s
CI/CD Pipeline / CI Gate (pull_request) Failing after 6s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 21s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 25s
088ef64b68
- render_adapter.py: 修复 import 路径 (services -> apps.worker.services)
- unified_render_service.py: 方式B 条件调整
  - ASR 可用时走字幕对齐模式(方式B)
  - ASR 不可用时降级为整段配音模式(方式A),使用 subtitle.text 作为配音内容
- 解决预览模式下配音完全不生效的问题

关联 Issue #1294

🚀 预览环境已部署

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

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

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

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

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

代码审查结果 - PR #1307

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

  1. apps/worker/video_processing/unified_render_service.py 第708行:降级逻辑存在数据空指针风险,可能导致静音或渲染失败。

    • else 分支(ASR不可用时的降级逻辑)中,代码通过 subtitle_cfg.get("text", "") 获取文本用于整段配音。
    • 问题分析:当 subtitle_cfg.get("auto_generated") 为 True 时,通常意味着字幕文本是由 ASR 服务生成的。如果此时 self.asr_service 为 None(触发了降级),极大概率意味着 ASR 服务未运行或不可用,因此 subtitle_cfg 中很可能根本不存在有效的 text 字段(或者为空)。
    • 后果subtitle_text_content 将为空字符串,导致传递给 TTS 的 tts_cfg["text"] 为空。这将导致 TTS 引擎生成静音音频或直接报错,进而导致视频渲染失败或生成无效视频。
    • 修改建议:在获取 subtitle_text_content 后,必须判断其是否为空。如果为空,说明既没有 ASR 服务也没有预设文本,此时应记录 Error 日志并跳过 TTS 生成或抛出明确异常,而不是继续执行生成静音的流程。
  2. apps/worker/video_processing/render_adapter.py 第468行:模块导入路径变更需确认环境一致性。

    • 问题分析:代码将导入路径从 services.asr_service_factory 修改为 apps.worker.services.asr_service_factory
    • 后果:这是一个破坏性变更。如果目标部署环境中模块尚未移动到新路径,或者该文件被其他服务引用,会导致 ImportError。虽然此处有 try-except 捕获并返回 None,会导致 ASR 功能在运行时不可用,触发上述文件中的降级逻辑,属于隐蔽的功能降级。
    • 修改建议:确保该 PR 包含了模块文件的物理移动,并确认所有引用该服务的地方均已同步更新路径,避免运行时动态导入失败。

💡 建议(1个可选)

  1. apps/worker/video_processing/unified_render_service.py:建议增加降级逻辑的告警监控。
    • 当进入 else 分支(ASR 不可用降级)时,虽然使用了整段配音兜底,但用户体验(字幕对齐失效)已经受损。建议在此处增加 Warning 级别的日志或发送监控指标,以便运维人员感知 ASR 服务的健康状态。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-08-08 10:20:47 | 模型:

## 代码审查结果 - PR #1307 ### ⚠️ 问题(2个需要修改) 1. **apps/worker/video_processing/unified_render_service.py 第708行**:降级逻辑存在数据空指针风险,可能导致静音或渲染失败。 - 在 `else` 分支(ASR不可用时的降级逻辑)中,代码通过 `subtitle_cfg.get("text", "")` 获取文本用于整段配音。 - **问题分析**:当 `subtitle_cfg.get("auto_generated")` 为 True 时,通常意味着字幕文本是由 ASR 服务生成的。如果此时 `self.asr_service` 为 None(触发了降级),极大概率意味着 ASR 服务未运行或不可用,因此 `subtitle_cfg` 中很可能根本不存在有效的 `text` 字段(或者为空)。 - **后果**:`subtitle_text_content` 将为空字符串,导致传递给 TTS 的 `tts_cfg["text"]` 为空。这将导致 TTS 引擎生成静音音频或直接报错,进而导致视频渲染失败或生成无效视频。 - **修改建议**:在获取 `subtitle_text_content` 后,必须判断其是否为空。如果为空,说明既没有 ASR 服务也没有预设文本,此时应记录 Error 日志并跳过 TTS 生成或抛出明确异常,而不是继续执行生成静音的流程。 2. **apps/worker/video_processing/render_adapter.py 第468行**:模块导入路径变更需确认环境一致性。 - **问题分析**:代码将导入路径从 `services.asr_service_factory` 修改为 `apps.worker.services.asr_service_factory`。 - **后果**:这是一个破坏性变更。如果目标部署环境中模块尚未移动到新路径,或者该文件被其他服务引用,会导致 `ImportError`。虽然此处有 `try-except` 捕获并返回 None,会导致 ASR 功能在运行时不可用,触发上述文件中的降级逻辑,属于隐蔽的功能降级。 - **修改建议**:确保该 PR 包含了模块文件的物理移动,并确认所有引用该服务的地方均已同步更新路径,避免运行时动态导入失败。 ### 💡 建议(1个可选) 1. **apps/worker/video_processing/unified_render_service.py**:建议增加降级逻辑的告警监控。 - 当进入 `else` 分支(ASR 不可用降级)时,虽然使用了整段配音兜底,但用户体验(字幕对齐失效)已经受损。建议在此处增加 Warning 级别的日志或发送监控指标,以便运维人员感知 ASR 服务的健康状态。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-08 10:20:47 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia closed this pull request 2026-08-09 08:53:51 +08:00

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #1307 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
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 / Build Staging API 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 28s
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 48s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m1s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m31s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m45s
AI Code Review / AI Code Review (pull_request) Successful in 2m2s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m2s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m3s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 2m8s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 3m3s
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 3m38s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m14s
CI/CD Pipeline / CI Gate (pull_request) Failing after 6s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 21s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 25s

Pull request closed

Sign in to join this conversation.