fix: ASR字幕路径叠加标题,修复封面没有标题的问题 #1374

Merged
xiaoxia merged 4 commits from fix/cover-title-asr-path into develop 2026-08-15 14:21:09 +08:00
Owner

根因

  1. _maybe_generate_ass 的 ASR 路径直接 return,跳过了 generate_ass_subtitles()(负责标题叠加),导致 ASR 字幕生成的 ASS 文件中没有标题
  2. generation.py 设置 auto_generated=True 但未设置 enabled=True,导致模板 subtitle.enabled=false 时 ASR 路径从未被触发

修复

unified_render_service.py

  • ASR 路径生成 ASS 后,调用 _overlay_title_on_ass() 追加标题事件
  • ASR 无结果/失败时,如有标题仍降级生成标题 ASS
  • 新增 _overlay_title_on_ass() 辅助函数:复用 build_ass_content 生成 TitleStyle + Dialogue,插入到 ASR 生成的 ASS 文件中

generation.py

  • voice_ids 注入时同步设置 subtitle_cfg["enabled"] = True

测试

  • 新增 6 个测试覆盖:标题叠加到 ASR ASS、空标题 noop、ASR 保留原有事件、ASR+标题集成、ASR 无结果降级标题、ASR 失败降级标题
  • 全量 13651 passed
## 根因 1. `_maybe_generate_ass` 的 ASR 路径直接 `return`,跳过了 `generate_ass_subtitles()`(负责标题叠加),导致 ASR 字幕生成的 ASS 文件中没有标题 2. `generation.py` 设置 `auto_generated=True` 但未设置 `enabled=True`,导致模板 `subtitle.enabled=false` 时 ASR 路径从未被触发 ## 修复 ### unified_render_service.py - ASR 路径生成 ASS 后,调用 `_overlay_title_on_ass()` 追加标题事件 - ASR 无结果/失败时,如有标题仍降级生成标题 ASS - 新增 `_overlay_title_on_ass()` 辅助函数:复用 `build_ass_content` 生成 TitleStyle + Dialogue,插入到 ASR 生成的 ASS 文件中 ### generation.py - `voice_ids` 注入时同步设置 `subtitle_cfg["enabled"] = True` ## 测试 - 新增 6 个测试覆盖:标题叠加到 ASR ASS、空标题 noop、ASR 保留原有事件、ASR+标题集成、ASR 无结果降级标题、ASR 失败降级标题 - 全量 13651 passed
xiaoxia added 1 commit 2026-08-15 13:49:35 +08:00
fix: ASR字幕路径叠加标题,修复封面没有标题的问题
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 Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (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 / Check if frontend-only change (pull_request) Successful in 33s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m20s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m26s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m33s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m59s
AI Code Review / AI Code Review (pull_request) Failing after 2m28s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m11s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m49s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m50s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m28s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 3m58s
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production API 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 / Integration Tests (pull_request) Successful in 2m53s
CI/CD Pipeline / CI Gate (pull_request) Failing after 7s
17761124c2
根因:
1. _maybe_generate_ass 的 ASR 路径直接 return,跳过了 generate_ass_subtitles()
   (负责标题叠加),导致 ASR 字幕生成的 ASS 文件中没有标题
2. generation.py 设置 auto_generated=True 但未设置 enabled=True,
   导致模板 subtitle.enabled=false 时 ASR 路径从未被触发

修复:
- unified_render_service.py:
  - ASR 路径生成 ASS 后,调用 _overlay_title_on_ass() 追加标题事件
  - ASR 无结果/失败时,如有标题仍降级生成标题 ASS
  - 新增 _overlay_title_on_ass() 辅助函数:复用 build_ass_content
    生成 TitleStyle + Dialogue,插入到 ASR 生成的 ASS 文件中
- generation.py:
  - voice_ids 注入时同步设置 subtitle_cfg['enabled'] = True

新增 6 个测试,全量 13651 passed

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1374 | | 预览链接 | [https://pr-1374.preview.xiaoxiajianji.com](https://pr-1374.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot added 1 commit 2026-08-15 13:53:35 +08:00
style: auto-format with black + isort + prettier [skip ci-format-check]
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 API Integration Tests (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 / Check if frontend-only change (pull_request) Successful in 31s
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 1m43s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 1m43s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m47s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m49s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m53s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m49s
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 / PR Build API Image (pull_request) Successful in 3m14s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m58s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m14s
CI/CD Pipeline / CI Gate (pull_request) Failing after 6s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m3s
AI Code Review / AI Code Review (pull_request) Failing after 6m30s
486fa7b20d
xiaoxia added 1 commit 2026-08-15 14:04:34 +08:00
fix: ruff E741 - rename ambiguous variable 'l' to 'ln' in test_overlay_title_on_ass
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 / 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 45s
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 - Migration (alembic) (pull_request) Successful in 1m11s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m15s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 28s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m17s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m42s
AI Code Review / AI Code Review (pull_request) Failing after 2m20s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m6s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m9s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m29s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m9s
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 / Integration Tests (pull_request) Successful in 1m40s
CI/CD Pipeline / CI Gate (pull_request) Successful in 8s
3d9e084a32
auto-approve-bot approved these changes 2026-08-15 14:10:31 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia added 1 commit 2026-08-15 14:14:51 +08:00
fix: 隔离_overlay_title_on_ass异常,防止ASR数据被覆盖
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 / 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 1m12s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m20s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m22s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m40s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m10s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m24s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m23s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m28s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m1s
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production API 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
AI Code Review / AI Code Review (pull_request) Successful in 4m29s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m27s
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 30s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 30s
25873c0b89
AI Review发现:_overlay_title_on_ass在ASR的try块内,如果叠加标题失败,
会进入except分支覆盖已生成的ASR字幕数据。

修复:用独立try-except包裹_overlay_title_on_ass调用,叠加失败时
记录warning但保留ASR生成的ASS文件。

新增测试:test_overlay_failure_preserves_asr_data 验证叠加失败时
ASR数据完整保留。
Collaborator

代码审查结果 - PR #1374

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

  1. apps/worker/video_processing/unified_render_service.py 第171行:索引计算逻辑错误,当 ASS 文件中不存在 [Events] 段或 Format: Layer, 行(即 events_format_idx 为 -1)时,执行 events_format_idx += 1 会导致索引变为 0。随后的插入操作会将标题 Dialogue 错误地插入到文件头部(如 [Script Info] 之后),导致 ASS 文件结构损坏,字幕无法正常渲染。
  2. apps/worker/worker_app/tasks/generation.py 第1208行:强制将 subtitle_cfg["enabled"] 设为 True 会覆盖用户的配置。如果用户明确配置了“不显示字幕”但配置了“显示标题”,此修改会导致系统强制生成 ASR 字幕并显示,违背了用户意图,属于功能逻辑错误。

💡 建议(1个可选)

  1. apps/worker/video_processing/unified_render_service.py 第179行:使用 splitlines()"\n".join() 会统一换行符为 \n。如果原文件是 Windows 风格(\r\n),写入后会被改变。建议在读取时记录换行符类型或统一使用 \r\n(ASS 标准通常兼容),以避免 Git diff 出现大量换行符变更或某些严格播放器的兼容性问题。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-08-15 06:19:21 | 模型:

## 代码审查结果 - PR #1374 ### ⚠️ 问题(2个需要修改) 1. **apps/worker/video_processing/unified_render_service.py 第171行**:索引计算逻辑错误,当 ASS 文件中不存在 `[Events]` 段或 `Format: Layer,` 行(即 `events_format_idx` 为 -1)时,执行 `events_format_idx += 1` 会导致索引变为 0。随后的插入操作会将标题 Dialogue 错误地插入到文件头部(如 `[Script Info]` 之后),导致 ASS 文件结构损坏,字幕无法正常渲染。 2. **apps/worker/worker_app/tasks/generation.py 第1208行**:强制将 `subtitle_cfg["enabled"]` 设为 `True` 会覆盖用户的配置。如果用户明确配置了“不显示字幕”但配置了“显示标题”,此修改会导致系统强制生成 ASR 字幕并显示,违背了用户意图,属于功能逻辑错误。 ### 💡 建议(1个可选) 1. **apps/worker/video_processing/unified_render_service.py 第179行**:使用 `splitlines()` 再 `"\n".join()` 会统一换行符为 `\n`。如果原文件是 Windows 风格(`\r\n`),写入后会被改变。建议在读取时记录换行符类型或统一使用 `\r\n`(ASS 标准通常兼容),以避免 Git diff 出现大量换行符变更或某些严格播放器的兼容性问题。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-15 06:19:21 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit d7bc908ed3 into develop 2026-08-15 14:21:09 +08:00

🗑️ 预览环境已清理

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

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

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