feat: #1798 AI数字人渲染合成管线
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check push changed paths (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 / Build Staging Worker Image (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 / 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 1m32s
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 / PR Build API Image (pull_request) Successful in 25s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m56s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m43s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m47s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m27s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 3m39s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 4m16s
AI Code Review / AI Code Review (pull_request) Successful in 7m50s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 9m51s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 8m43s
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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 4s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 7m27s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 6s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 32s

- 新增 AiAvatarRenderJob 数据模型 + Alembic 迁移脚本
- 新增 Schema: BRollSegment / CreateAiAvatarRenderRequest / AiAvatarRenderJobResponse
- 新增 AiAvatarRenderService: 创建/查询/列表/取消/重试渲染任务
- FFmpeg 滤镜构建: build_broll_overlay_filter (fullscreen + pip 模式)
- FFmpeg 封面提取: build_cover_extract_command
- Celery 异步任务: ai_avatar_render.execute
- 5 个 API 端点: POST 创建 / GET 列表 / GET 详情 / POST 取消 / POST 重试
- 修复 router.py 中重复注册 lipsync_router 的问题
- 44 个测试: 26 Service + 12 Route + 6 Filter
- 复用现有 drawtext/concat 滤镜,不修改现有函数签名
This commit is contained in:
saas-backend-agent
2026-09-08 17:51:50 +08:00
parent f7825e3956
commit 36970079ee
11 changed files with 1790 additions and 143 deletions
@@ -702,3 +702,34 @@ class LipsyncJobModel(Base):
completed_at = Column(DateTime, nullable=True)
created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc))
updated_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc))
class AiAvatarRenderJob(Base):
"""AI数字人渲染任务 — #1798"""
__tablename__ = "ai_avatar_render_jobs"
id = Column(String(36), primary_key=True)
user_id = Column(String(36), nullable=False, index=True)
project_id = Column(String(36), nullable=False, default="", index=True)
# 输入参数
lipsync_job_id = Column(String(36), nullable=False)
script_id = Column(String(36), nullable=False)
b_roll_segments = Column(JSON, nullable=False, default=list)
# b_roll_segments 格式: [{"script_segment_index": 0, "asset_url": "...", "mode": "fullscreen|pip", "start_time": 5.0, "end_time": 10.0}, ...]
title_config = Column(JSON, nullable=False, default=dict)
cover_config = Column(JSON, nullable=False, default=dict)
# 任务状态
status = Column(String(20), nullable=False, default="pending", index=True)
progress = Column(Integer, nullable=False, default=0)
output_video_url = Column(Text, nullable=False, default="")
output_cover_url = Column(Text, nullable=False, default="")
output_duration = Column(Float, nullable=False, default=0.0)
error_message = Column(Text, nullable=False, default="")
submitted_at = Column(DateTime, nullable=True)
started_at = Column(DateTime, nullable=True)
completed_at = Column(DateTime, nullable=True)
created_at = Column(DateTime(timezone=True), nullable=False, default=lambda: datetime.now(timezone.utc))
updated_at = Column(DateTime(timezone=True), nullable=False, default=lambda: datetime.now(timezone.utc))