feat: #1767 BGM 池差异化分配,打破变体间音频指纹一致性 #1785

Merged
auto-approve-bot merged 1 commits from fix/1767-bgm-pool-diversify into develop 2026-09-08 10:12:53 +08:00
Owner

背景

当前批量生成时多个变体共用同一首 BGM,YouTube Content ID 音频准确率高,音频一致是查重高危信号。

方案:三层递进

策略一:BGM 池分配(核心)

  • 新增 packages/domain/bgm_pool.py:10 首 BGM 池,覆盖 upbeat/relax/tech/commerce 四种风格
  • 根据源 plan 的 BGM preset_id 推断风格,筛选同风格候选池
  • 每个变体基于 variantSeed 随机分配不同 BGM(可复现)
  • 尽量保证同一批次不重复

策略二:BGM 段落差异化(补充)

  • bgm_mixer.py 支持 audio_offset:FFmpeg -ss seek 到不同位置
  • 不同变体从同一 BGM 的不同段落开始(5s 量化,最大 30s 偏移)

策略三:BGM 音量微调

  • bgm_mixer.py 支持 volume_adjust_db:dB 转线性系数追加到滤镜链
  • ±3dB 离散步进(-3, -2, -1, 0, 1, 2, 3),不影响配音清晰度

代码改动

文件 改动
packages/domain/bgm_pool.py 🆕 BGM 池定义 + 风格匹配 + 变体分配 + 段落偏移 + 音量微调
apps/worker/video_processing/bgm_mixer.py BGMConfigaudio_offset/volume_adjust_dbprepare_bgm_track 支持 -ss seek 和 dB 滤镜
apps/api/app/services/edit_plan_service.py ensure_batch_variant_plans 调用 allocate_bgm_pool_for_variants,写入 plan.config["bgm"]
tests/unit/test_bgm_pool.py 🆕 31 个新单测

约束遵守

  • 不破坏现有单视频 BGM 选择逻辑(单视频不走池分配)
  • BGM 风格匹配视频内容(通过源 plan preset_id → style → mood 筛选)
  • BGM 切换不影响配音清晰度(±3dB 安全范围)
  • 分配可复现(同 seed 同结果)

测试

tests/unit/test_bgm_pool.py: 31 passed
tests/unit/test_bgm_mixer_pure.py + test_bgm_mixer.py: 全绿
全量相关测试 279 passed
## 背景 当前批量生成时多个变体共用同一首 BGM,YouTube Content ID 音频准确率高,音频一致是查重高危信号。 ## 方案:三层递进 ### 策略一:BGM 池分配(核心) - 新增 `packages/domain/bgm_pool.py`:10 首 BGM 池,覆盖 upbeat/relax/tech/commerce 四种风格 - 根据源 plan 的 BGM preset_id 推断风格,筛选同风格候选池 - 每个变体基于 `variantSeed` 随机分配不同 BGM(可复现) - 尽量保证同一批次不重复 ### 策略二:BGM 段落差异化(补充) - `bgm_mixer.py` 支持 `audio_offset`:FFmpeg `-ss` seek 到不同位置 - 不同变体从同一 BGM 的不同段落开始(5s 量化,最大 30s 偏移) ### 策略三:BGM 音量微调 - `bgm_mixer.py` 支持 `volume_adjust_db`:dB 转线性系数追加到滤镜链 - ±3dB 离散步进(-3, -2, -1, 0, 1, 2, 3),不影响配音清晰度 ## 代码改动 | 文件 | 改动 | |------|------| | `packages/domain/bgm_pool.py` | 🆕 BGM 池定义 + 风格匹配 + 变体分配 + 段落偏移 + 音量微调 | | `apps/worker/video_processing/bgm_mixer.py` | `BGMConfig` 加 `audio_offset`/`volume_adjust_db`,`prepare_bgm_track` 支持 `-ss` seek 和 dB 滤镜 | | `apps/api/app/services/edit_plan_service.py` | `ensure_batch_variant_plans` 调用 `allocate_bgm_pool_for_variants`,写入 `plan.config["bgm"]` | | `tests/unit/test_bgm_pool.py` | 🆕 31 个新单测 | ## 约束遵守 - ✅ 不破坏现有单视频 BGM 选择逻辑(单视频不走池分配) - ✅ BGM 风格匹配视频内容(通过源 plan preset_id → style → mood 筛选) - ✅ BGM 切换不影响配音清晰度(±3dB 安全范围) - ✅ 分配可复现(同 seed 同结果) ## 测试 ``` tests/unit/test_bgm_pool.py: 31 passed tests/unit/test_bgm_mixer_pure.py + test_bgm_mixer.py: 全绿 全量相关测试 279 passed ```

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1785 | | 预览链接 | [https://pr-1785.preview.xiaoxiajianji.com](https://pr-1785.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-09-08 10:06:45 +08:00
feat: #1767 BGM 池差异化分配,打破变体间音频指纹一致性
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
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 / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 16s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 35s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 34s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API 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 / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 1m51s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m44s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m33s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m17s
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 / Validate - Style (pull_request) Successful in 2m20s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m33s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 4m56s
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 / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m26s
AI Code Review / AI Code Review (pull_request) Successful in 6m35s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 33s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 47s
91c67f0af4
三层递进策略:
- 策略一(核心):10 首 BGM 池,按源 BGM 风格筛选候选,每变体基于 variantSeed 分配不同 BGM
- 策略二(补充):段落差异化,不同变体从同一 BGM 的不同偏移位置开始播放(5s 量化,最大 30s)
- 策略三:音量微调 ±3dB 离散步进,混音比例有微小差异

代码改动:
- 新增 packages/domain/bgm_pool.py:BGM 池定义 + 风格匹配 + 变体分配 + 段落偏移 + 音量微调
- bgm_mixer.py:BGMConfig 加 audio_offset/volume_adjust_db,prepare_bgm_track 支持 -ss seek 和 dB volume 滤镜
- edit_plan_service.py:ensure_batch_variant_plans 中调用 allocate_bgm_pool_for_variants,写入 plan.config['bgm']

31 个新单测覆盖池定义/风格匹配/分配/段落偏移/音量微调/验收条件

约束:不破坏单视频 BGM 选择逻辑;BGM 风格匹配源 plan;分配可复现
xiaoxia force-pushed fix/1767-bgm-pool-diversify from a5ec3079f1 to 91c67f0af4 2026-09-08 10:06:45 +08:00 Compare
auto-approve-bot merged commit 98cf571ab3 into develop 2026-09-08 10:12:53 +08:00
auto-approve-bot deleted branch fix/1767-bgm-pool-diversify 2026-09-08 10:12:53 +08:00

🗑️ 预览环境已清理

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

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

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