feat(#2001): 爆款标题样式配置面板后端支持 #2004

Merged
auto-approve-bot merged 5 commits from feat/2001-booming-title-style into develop 2026-09-21 03:01:39 +08:00
Owner

改动

1. SubtitleStyle 新增 line_overrides 字段

支持逐行独立样式覆盖,通过 ASS 内联 override 标签 {\c&HBBGGRR&\fsN\fnName\b1\i0\3c&H...\bordN\4c&H...\xshadN\yshadN} 实现。每行可覆盖:

  • color(主色)
  • font_size / size(字号)
  • font(字体名,支持优设标题黑/阿里普惠体/抖音美好体/思源黑体 Heavy 等新增字体)
  • bold / italic
  • stroke_color / stroke_width(描边色/宽)
  • shadow_color / shadow_offset_x / shadow_offset_y(阴影色/偏移)

支持负数行索引(-1 为最后一行);无匹配/空字段时回退主样式;非 dict 项自动过滤。

2. 数据模型新增 cover_title_config

AiAvatarRenderJob 新增 JSON 字段,封面独立标题配置,结构同 title_config。Alembic 迁移 083。Schema/Service/Route 全链路透传。

3. 部署 4 款爆款字体

拷贝到 /usr/share/fonts/truetype/xiaoxia/ 并 fc-cache:

  • 优设标题黑 (YouSheBiaoTiHei.ttf)
  • 阿里普惠体 Bold 2.0 (AlibabaPuHuiTi-Bold.ttf)
  • 抖音美好体 (DouyinSansBold.otf)
  • 思源黑体 Heavy (NotoSansSC-Black.otf)

FONT_NAME_MAP / DRAWTEXT_FONT_MAP / DRAWTEXT_FONT_SEARCH_PATHS 同步扩展,ASS 字幕和 drawtext 水印路径都可调用。

4. 覆盖 #1263

标题预设 T 图标需求可通过 line_overrides 配置首行大字号+粗体+彩色实现,无需额外字段。

测试

  • 新增 24 个单元测试覆盖 line_overrides 构造、负数索引、全字段组合、异常输入过滤、逐行 apply 场景
  • 现有 101 个 ASS builder 测试 + 78 个 subtitle_style 测试全绿

关联

## 改动 ### 1. SubtitleStyle 新增 line_overrides 字段 支持逐行独立样式覆盖,通过 ASS 内联 override 标签 `{\c&HBBGGRR&\fsN\fnName\b1\i0\3c&H...\bordN\4c&H...\xshadN\yshadN}` 实现。每行可覆盖: - color(主色) - font_size / size(字号) - font(字体名,支持优设标题黑/阿里普惠体/抖音美好体/思源黑体 Heavy 等新增字体) - bold / italic - stroke_color / stroke_width(描边色/宽) - shadow_color / shadow_offset_x / shadow_offset_y(阴影色/偏移) 支持负数行索引(-1 为最后一行);无匹配/空字段时回退主样式;非 dict 项自动过滤。 ### 2. 数据模型新增 cover_title_config AiAvatarRenderJob 新增 JSON 字段,封面独立标题配置,结构同 title_config。Alembic 迁移 083。Schema/Service/Route 全链路透传。 ### 3. 部署 4 款爆款字体 拷贝到 `/usr/share/fonts/truetype/xiaoxia/` 并 fc-cache: - 优设标题黑 (YouSheBiaoTiHei.ttf) - 阿里普惠体 Bold 2.0 (AlibabaPuHuiTi-Bold.ttf) - 抖音美好体 (DouyinSansBold.otf) - 思源黑体 Heavy (NotoSansSC-Black.otf) FONT_NAME_MAP / DRAWTEXT_FONT_MAP / DRAWTEXT_FONT_SEARCH_PATHS 同步扩展,ASS 字幕和 drawtext 水印路径都可调用。 ### 4. 覆盖 #1263 标题预设 T 图标需求可通过 line_overrides 配置首行大字号+粗体+彩色实现,无需额外字段。 ## 测试 - 新增 24 个单元测试覆盖 line_overrides 构造、负数索引、全字段组合、异常输入过滤、逐行 apply 场景 - 现有 101 个 ASS builder 测试 + 78 个 subtitle_style 测试全绿 ## 关联 - Issue #2001 - Closes #1263

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #2004 | | 预览链接 | [https://pr-2004.preview.xiaoxiajianji.com](https://pr-2004.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 5 commits 2026-09-21 02:44:00 +08:00
- SubtitleStyle 新增 line_overrides 字段,支持逐行独立样式覆盖
  (color/font_size/font/bold/italic/stroke_color/stroke_width/shadow)
  通过 ASS 内联 override 标签 {\c&H...\fsN\fn...} 实现
- ass_subtitle_builder 在标题/字幕换行后应用 line_overrides
- AiAvatarRenderJob 新增 cover_title_config 字段(封面独立标题配置,结构同 title_config)
- Alembic 迁移 083: ai_avatar_render_jobs.cover_title_config JSON NOT NULL 默认 {}
- Schema/Service/Route 全链路透传 cover_title_config
- 部署 4 款爆款字体到 /usr/share/fonts/truetype/xiaoxia/:
  优设标题黑、阿里普惠体 Bold 2.0、抖音美好体、思源黑体 Heavy
- FONT_NAME_MAP + DRAWTEXT_FONT_MAP + DRAWTEXT_FONT_SEARCH_PATHS 全量扩展
- 单元测试 24 个覆盖 line_overrides 逐行标签/负数索引/全字段组合/异常过滤
- 覆盖 #1263 标题预设 T 图标能力(通过 line_overrides 首行大字号+粗体实现)
CI 单测 mock job 缺少 cover_title_config 属性导致 pydantic ValidationError
develop 上 TTS preview 新增 style、pitch 参数透传,补齐对应单测断言
Merge branch 'origin/develop' into feat/2001-booming-title-style
test: 修复 CI GPU 环境下 lipsync 测试走 GPU 路径导致 call_args 为 None
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
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 / 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 / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped 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 / PR Build Worker Image (pull_request) Successful in 2m23s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m49s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m14s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m49s
AI Code Review / AI Code Review (pull_request) Successful in 6m57s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 9m50s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 10m35s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 12m6s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 16m7s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 16m40s
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 1s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 14m29s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 35s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 49s
ed45938382
CI 环境 USE_GPU_LIPSYNC=true,MagicMock 的 has_available_worker() 返回 truthy MagicMock,
导致 create_job 走 GPU 路径提前 return,submit_lipsync 未被调用,3 个依赖 MediaKit
路径的测试失败:
- test_create_job_api_failure: 未抛 MediaKitError
- test_create_job_direct_audio_skips_tts: submit_lipsync.call_args 为 None
- test_create_job_resigns_oss_urls_before_submit: 同上

在测试中显式设置 svc.settings.use_gpu_lipsync = False,强制走 MediaKit 路径验证相关逻辑。
xiaoxia force-pushed feat/2001-booming-title-style from 26c9d242c1 to ed45938382 2026-09-21 02:44:00 +08:00 Compare
auto-approve-bot merged commit 9ba036abb3 into develop 2026-09-21 03:01:39 +08:00
auto-approve-bot deleted branch feat/2001-booming-title-style 2026-09-21 03:01:46 +08:00

🗑️ 预览环境已清理

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

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

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