refactor(viral-video): #2106 删除 _step_musetalk 步骤
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 / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
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 / Check if frontend-only change (pull_request) Successful in 2s
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 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 / PR Build API Image (pull_request) Successful in 51s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m0s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m7s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 4m45s
AI Code Review / AI Code Review (pull_request) Successful in 7m14s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 10m39s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 20m32s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 20m41s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 24m10s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 26m22s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 31s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 5m18s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 1h9m19s
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 2s

爆款视频由 Seedance 2.5 直接生成人物口型,不需要 MuseTalk 事后对口型。
MuseTalk 是 AI 数字人路线(上传人物视频+配音→对嘴型)用的,跟爆款视频是两条不同路线。

- 删除 _step_musetalk 函数
- resume_pipeline 直接把 render 输出传给 upload
- 更新流水线 docstring 为 9 步
- 删除/更新对应单测
- ViralVideoStage.MUSETALK 枚举值保留以避免前端 breaking change
This commit is contained in:
xiaoxia
2026-09-30 20:42:12 +08:00
parent 6ff57b2feb
commit 22e04d65a7
3 changed files with 7 additions and 38 deletions
+7 -20
View File
@@ -1,6 +1,6 @@
"""爆款视频 Celery 编排器 — ViralVideoOrchestrator.
10 步流水线:
9 步流水线(Seedance 2.5 直生口型,不再走 MuseTalk):
1. 图片 VLM 分析
1.5 [v1.3] 视频风格分析(如用户上传参考视频)
2. 用户文案意图解析
@@ -8,10 +8,9 @@
4. 分镜脚本生成
5. 合规审核(6 维度,不通过自动重写 1 次)
6. CosyVoice 配音
7. BGM 选择
8. UnifiedRenderService 渲染
9. 数字人口型(MuseTalk)
10. OSS 上传 + 通知 + 扣点
7. BGM 选择(素材未就绪时跳过)
8. Seedance 逐分镜生成 + ffmpeg concat + 混 TTS
9. OSS 上传 + 通知 + 扣点
"""
from __future__ import annotations
@@ -593,14 +592,6 @@ def _make_placeholder_clip(tmpdir, idx: int, duration: int):
return out
def _step_musetalk(job: ViralVideoJob, video_path: str) -> str:
"""步骤 9: 数字人口型。P1:MuseTalk GPU 端点未就绪前统一跳过。"""
if not job.persona_id:
return video_path
logger.info("[爆款视频] persona_id=%s 已设置,但 MuseTalk GPU 端点未就绪,跳过口型同步", job.persona_id)
return video_path
def _step_upload(job: ViralVideoJob, video_path: str) -> str:
"""步骤 10: OSS 上传。"""
try:
@@ -760,14 +751,10 @@ def resume_viral_video_pipeline(self: Task, job_id: str) -> dict:
video_path = _step_render(job, storyboard, tts_path, bgm)
_emit_progress(job_id, ViralVideoStage.RENDERING, 88.0, "渲染完成")
# ── Step 9: MuseTalk(P1:端点未就绪前跳过) ──
_emit_progress(job_id, ViralVideoStage.MUSETALK, 90.0, "正在处理数字人口型...")
final_video_path = _step_musetalk(job, video_path)
_emit_progress(job_id, ViralVideoStage.MUSETALK, 93.0, "数字人处理完成")
# ── Step 10: OSS 上传 + 扣点 ──
# ── Step 9: OSS 上传 + 扣点 ──
# 注:爆款视频由 Seedance 2.5 直接生成口型,不需要 MuseTalk 事后对口型(MuseTalk 是 AI 数字人路线用的)。
_emit_progress(job_id, ViralVideoStage.UPLOADING, 95.0, "正在上传视频...")
video_url = _step_upload(job, final_video_path)
video_url = _step_upload(job, video_path)
job.credits_cost = CREDITS_VIRAL_VIDEO_COST
# TODO: 调用 credits.deduct() 实际扣点(#1895 总开关为 false 时不扣,保留 TODO)
-3
View File
@@ -456,7 +456,6 @@ class TestPipelineIntegration:
"""流水线端到端集成测试(mock 外部依赖)。"""
@patch("apps.worker.worker_app.tasks.viral_video._step_upload")
@patch("apps.worker.worker_app.tasks.viral_video._step_musetalk")
@patch("apps.worker.worker_app.tasks.viral_video._step_render")
@patch("apps.worker.worker_app.tasks.viral_video._step_bgm_select")
@patch("apps.worker.worker_app.tasks.viral_video._step_tts")
@@ -481,7 +480,6 @@ class TestPipelineIntegration:
mock_tts,
mock_bgm,
mock_render,
mock_musetalk,
mock_upload,
):
"""测试 resume 流水线能从确认状态走到完成。"""
@@ -509,7 +507,6 @@ class TestPipelineIntegration:
mock_tts.return_value = None # P1: TTS 返回 Path|None,mock 用 None 跳过混音
mock_bgm.return_value = None # P1: BGM 未就绪前返回 None
mock_render.return_value = "/tmp/video.mp4"
mock_musetalk.return_value = "/tmp/video_final.mp4"
mock_upload.return_value = "https://oss.example.com/final.mp4"
result = resume_viral_video_pipeline.run("job-001")
-15
View File
@@ -155,21 +155,6 @@ class TestBGMSkip:
assert _step_bgm_select(mock_job) is None
class TestMuseTalkSkip:
def test_musetalk_no_persona_passes_through(self, mock_job):
from apps.worker.worker_app.tasks.viral_video import _step_musetalk
mock_job.persona_id = ""
assert _step_musetalk(mock_job, "/tmp/video.mp4") == "/tmp/video.mp4"
def test_musetalk_with_persona_still_skips(self, mock_job):
"""GPU 端点未就绪前,即使有 persona 也直接返回原路径。"""
from apps.worker.worker_app.tasks.viral_video import _step_musetalk
mock_job.persona_id = "persona-1"
assert _step_musetalk(mock_job, "/tmp/video.mp4") == "/tmp/video.mp4"
# ── P0-1: call_video_generation 参数构造 ──────────────────────────