feat(#584): 智能匹配视频素材增强 — 多维度评分+多样性保证+项目级支持 #751

Merged
xiaoxia merged 2 commits from feat/smart-asset-matching-enhanced into develop 2026-07-23 13:17:55 +08:00
Owner

背景

一键生成的智能匹配素材功能太弱:

  1. 只有质量分+时长简单排序,维度单一
  2. 只在素材库模式下生效,项目级模式不支持
  3. 选出来的素材可能全是同类型(全是短视频或全是长视频),缺乏多样性

改动

新增 SmartAssetSelector 服务(apps/api/app/services/smart_asset_selector.py

4维度加权评分(总分0-1):

  • 质量分 quality_score:权重 0.5 — 核心维度
  • 分辨率适配:权重 0.2 — 接近1080p得分高,4K及以上满分
  • 时长合理性:权重 0.2 — 3-30秒最佳,过短过长扣分
  • 码率质量:权重 0.1 — 2-8Mbps最佳,估算自文件大小/时长

时长多样性保证:

  • 三桶分配:短(<5s) / 中(5-15s) / 长(>15s)
  • 每桶基础配额 = max(1, count/3)
  • 剩余名额从全局Top中取
  • 保证选出的素材时长分布均匀,不扎堆

质量门槛过滤:

  • 低于30分的素材直接排除(可配置)

API 层改造(generation_tasks.py

  • 智能匹配接入新的 SmartAssetSelector 服务
  • 项目级模式(无 asset_library_id 但有 project_id)也支持 random/smart 自动选取
  • 无符合条件素材时返回明确错误提示

验证

  • 28个智能选择单测全部通过(评分/选择/多样性/边界全覆盖)
  • 85个generation相关单测全部通过
## 背景 一键生成的智能匹配素材功能太弱: 1. 只有质量分+时长简单排序,维度单一 2. 只在素材库模式下生效,项目级模式不支持 3. 选出来的素材可能全是同类型(全是短视频或全是长视频),缺乏多样性 ## 改动 ### 新增 SmartAssetSelector 服务(`apps/api/app/services/smart_asset_selector.py`) **4维度加权评分(总分0-1):** - 质量分 quality_score:权重 0.5 — 核心维度 - 分辨率适配:权重 0.2 — 接近1080p得分高,4K及以上满分 - 时长合理性:权重 0.2 — 3-30秒最佳,过短过长扣分 - 码率质量:权重 0.1 — 2-8Mbps最佳,估算自文件大小/时长 **时长多样性保证:** - 三桶分配:短(<5s) / 中(5-15s) / 长(>15s) - 每桶基础配额 = max(1, count/3) - 剩余名额从全局Top中取 - 保证选出的素材时长分布均匀,不扎堆 **质量门槛过滤:** - 低于30分的素材直接排除(可配置) ### API 层改造(`generation_tasks.py`) - 智能匹配接入新的 SmartAssetSelector 服务 - 项目级模式(无 asset_library_id 但有 project_id)也支持 random/smart 自动选取 - 无符合条件素材时返回明确错误提示 ## 验证 - 28个智能选择单测全部通过(评分/选择/多样性/边界全覆盖) - 85个generation相关单测全部通过
xiaoxia added 2 commits 2026-07-23 10:55:21 +08:00
feat(#632): 配音素材库音频架构统一,迁移到audio图层混音
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 25s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 21s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 19s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 32s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 1m41s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 37s
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
PR Automation / Auto Approve on CI Green (pull_request) Successful in 42s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 33s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 38s
CI/CD Pipeline / Frontend Unit Tests (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 / Build Production 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 / 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
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m44s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 23s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 6m29s
AI Code Review / AI Code Review (pull_request) Successful in 7m25s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 11m25s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 31m20s
cd8fb98c1b
- UnifiedRenderService 增加 voiceover_audio_path 参数
- 新增 _maybe_add_voice_library_layer 方法,配音素材库音频加到audio图层
- 与TTS配音、BGM共享统一混音链路,支持音量平衡
- RenderAdapter 透传 voiceover_audio_path 参数
- 删除一键生成路径中后处理 _mux_audio_track 调用
- 行为:从替换音轨改为混音叠加,与TTS配音行为一致
feat(#584): 智能匹配视频素材增强 — 多维度评分+多样性保证+项目级支持
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 44s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m1s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m4s
AI Code Review / AI Code Review (pull_request) Successful in 6m8s
CI/CD Pipeline / PR Build Worker Image (pull_request) Failing after 30s
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 / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 41s
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 42s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 1m1s
CI/CD Pipeline / PR Build API Image (pull_request) Failing after 1m3s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Failing after 3m46s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Failing after 5m32s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 15m35s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 16m18s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 20m36s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 35s
898372c904
- 新增 SmartAssetSelector 智能素材选择服务
- 评分维度:质量分(50%) + 分辨率(20%) + 时长合理性(20%) + 码率(10%)
- 时长多样性保证:短/中/长三分桶配额,避免全是同类型素材
- 最低质量分门槛:自动过滤低于30分的低质量素材
- 项目级模式也支持 random/smart 自动选取(之前只有素材库模式支持)
- 28个单元测试覆盖评分、选择逻辑、多样性、边界情况

🚀 预览环境已部署

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

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

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

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

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

代码审查结果 - PR #751

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

  1. apps/api/app/api/routes/generation_tasks.py 第221-227行:当项目下无素材时逻辑漏洞。

    • 问题描述:代码逻辑为 if assets: ...,如果 asset_repository.find_by_project(project_id) 返回空列表,则跳过整个 if 块。此时 resolved_asset_ids 保持为空(或进入该分支前的状态),代码继续向下执行 use_case,可能导致下游逻辑报错或创建了无效的空任务,而不是返回明确的错误提示。
    • 修改建议:应将空列表检查独立出来,或者确保当 assets 为空时也抛出 HTTPException,提示用户项目下没有可用素材。
  2. apps/worker/video_processing/unified_render_service.py 第883行ResolvedClipactual_duration 参数赋值错误。

    • 问题描述:actual_duration 通常代表素材文件的真实物理时长。代码将其赋值为 video_duration(视频总时长)。如果配音音频文件时长短于视频时长(例如音频10s,视频60s),这里会导致 actual_duration (60s) 与实际文件长度 (10s) 不符。这可能导致渲染引擎在计算进度、分配缓冲区或进行时间轴映射时出现越界或逻辑错误。
    • 修改建议:actual_duration 应赋值为音频文件的真实时长(需读取文件获取或传入),duration(时间轴占用时长)可以设置为 video_duration(如果引擎支持自动补齐或混音),但 actual_duration 必须真实。
  3. apps/api/app/services/smart_asset_selector.py 第255行:类型安全缺失导致潜在崩溃。

    • 问题描述:quality_score = (quality / 100.0) ... 直接进行除法运算。如果数据库中的 quality_score 字段因脏数据或迁移问题存储了字符串类型(如 "80""null"),此行将直接抛出 TypeError,导致 API 500 错误。
    • 修改建议:增加类型转换或容错处理,例如 float(quality) if quality is not None else 0.5,并捕获可能的转换异常。

💡 建议(2个可选)

  1. apps/api/app/services/smart_asset_selector.py 第253-269行:循环内重复调用 getattr 影响性能。

    • 具体内容:在 _score_asset 方法中,多次对同一个 asset 对象调用 getattr(如 quality_score, width, height, duration, file_size)。建议在方法开头一次性提取所有需要的属性到局部变量,减少属性查找开销。
  2. apps/api/app/api/routes/generation_tasks.py 第133行:存在重复的过滤逻辑。

    • 具体内容:_select_assets_from_library 函数中已经过滤了 ready 状态和 video 类型的素材。当调用 SmartAssetSelector 时,其内部 select 方法又执行了一次完全相同的 statusmime_type 过滤。建议优化逻辑,避免对同一列表进行两次相同的遍历过滤。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 11:02:16 | 模型:

## 代码审查结果 - PR #751 ### ⚠️ 问题(3个需要修改) 1. **apps/api/app/api/routes/generation_tasks.py 第221-227行**:当项目下无素材时逻辑漏洞。 - 问题描述:代码逻辑为 `if assets: ...`,如果 `asset_repository.find_by_project(project_id)` 返回空列表,则跳过整个 `if` 块。此时 `resolved_asset_ids` 保持为空(或进入该分支前的状态),代码继续向下执行 `use_case`,可能导致下游逻辑报错或创建了无效的空任务,而不是返回明确的错误提示。 - 修改建议:应将空列表检查独立出来,或者确保当 `assets` 为空时也抛出 HTTPException,提示用户项目下没有可用素材。 2. **apps/worker/video_processing/unified_render_service.py 第883行**:`ResolvedClip` 的 `actual_duration` 参数赋值错误。 - 问题描述:`actual_duration` 通常代表素材文件的真实物理时长。代码将其赋值为 `video_duration`(视频总时长)。如果配音音频文件时长短于视频时长(例如音频10s,视频60s),这里会导致 `actual_duration` (60s) 与实际文件长度 (10s) 不符。这可能导致渲染引擎在计算进度、分配缓冲区或进行时间轴映射时出现越界或逻辑错误。 - 修改建议:`actual_duration` 应赋值为音频文件的真实时长(需读取文件获取或传入),`duration`(时间轴占用时长)可以设置为 `video_duration`(如果引擎支持自动补齐或混音),但 `actual_duration` 必须真实。 3. **apps/api/app/services/smart_asset_selector.py 第255行**:类型安全缺失导致潜在崩溃。 - 问题描述:`quality_score = (quality / 100.0) ...` 直接进行除法运算。如果数据库中的 `quality_score` 字段因脏数据或迁移问题存储了字符串类型(如 `"80"` 或 `"null"`),此行将直接抛出 `TypeError`,导致 API 500 错误。 - 修改建议:增加类型转换或容错处理,例如 `float(quality) if quality is not None else 0.5`,并捕获可能的转换异常。 ### 💡 建议(2个可选) 1. **apps/api/app/services/smart_asset_selector.py 第253-269行**:循环内重复调用 `getattr` 影响性能。 - 具体内容:在 `_score_asset` 方法中,多次对同一个 `asset` 对象调用 `getattr`(如 `quality_score`, `width`, `height`, `duration`, `file_size`)。建议在方法开头一次性提取所有需要的属性到局部变量,减少属性查找开销。 2. **apps/api/app/api/routes/generation_tasks.py 第133行**:存在重复的过滤逻辑。 - 具体内容:`_select_assets_from_library` 函数中已经过滤了 `ready` 状态和 `video` 类型的素材。当调用 `SmartAssetSelector` 时,其内部 `select` 方法又执行了一次完全相同的 `status` 和 `mime_type` 过滤。建议优化逻辑,避免对同一列表进行两次相同的遍历过滤。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 11:02:16 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 5aa8a96a43 into develop 2026-07-23 13:17:55 +08:00
xiaoxia deleted branch feat/smart-asset-matching-enhanced 2026-07-23 13:17:55 +08:00

🗑️ 预览环境已清理

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

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

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