fix(1978): MuseTalk 封装强制替换为 TTS 驱动音轨 + 音频长于视频时循环画面 #1997

Merged
auto-approve-bot merged 2 commits from fix/1978-musetalk-audio-mux-loop into develop 2026-09-20 02:27:45 +08:00

2 Commits

Author SHA1 Message Date
xiaoxia bd5b4025a3 Merge remote-tracking branch 'origin/develop' into fix/1978-musetalk-audio-mux-loop
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 / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (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 / 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 Worker Image (pull_request) Successful in 39s
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 / PR Build API Image (pull_request) Successful in 42s
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
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m15s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m39s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m51s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m43s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 4m48s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 5m16s
AI Code Review / AI Code Review (pull_request) Successful in 6m28s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 8m53s
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 / CI Gate (pull_request) Successful in 1s
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
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 6m46s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 28s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 3m4s
2026-09-20 02:15:01 +08:00
xiaoxia 54f9fe0dc1 fix(1978): MuseTalk 封装强制用 TTS 驱动音频替换音轨 + 音频长于视频时循环画面
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
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 API 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 Web 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 38s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 40s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m19s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m54s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m56s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 3m57s
AI Code Review / AI Code Review (pull_request) Successful in 6m36s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 7m53s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 10m43s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 19m33s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 20m27s
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 / CI Gate (pull_request) Failing after 1s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
严重 bug:结果视频保留了源视频音轨(波形比对相关系数 0.9998,与 TTS
驱动音频无关),口型同步配的是原声。根因是最终 ffmpeg 封装没写 -map,
默认流选择把第一个输入(源视频/无声画面)的自带音轨带进了结果。

修复(deploy/gpu_worker/musetalk_server.py):
- 新增 _mux_video_with_audio() 统一封装:强制 -map 0:v:0 -map 1:a:0,
  画面只取 MuseTalk 无声产物,音轨只取第二个输入的驱动音频,AAC 128k
- 新增 _get_media_duration() 探测音视频时长
- 音频不超过视频(容差 0.25s):-c:v copy -shortest 无损秒封装
- 音频长于视频(TTS 15s vs 视频 9s 常见):-stream_loop -1 循环画面,
  h264_nvenc 硬件重编码(RTX2060),-t 精确卡到音频时长,不截短语音
- _pick_video_encoder():MUSE_VIDEO_ENCODER=auto 探测 NVENC,不可用或
  编码失败自动回退 libx264(veryfast);preset 随编码器选择
- MUSE_ENABLE_VIDEO_LOOP(默认开)/ 请求 form enable_video_loop 单任务覆盖
- 示例推理先产出无声 visual_silent.mp4(-an)再走统一 mux,真实 MuseTalk
  接入时直接把无声产物路径传给 _mux_video_with_audio
- README:新增 2.2 更新部署(wget 拉新文件+systemctl 重启)、环境变量表、
  工程记录 #9/#10

测试 test_1978_musetalk_audio_mux.py(10 用例):
- 命令构造:非循环 copy+map、容差边界、循环 stream_loop/NVENC/-t 无 -shortest、
  关循环、NVENC 失败回退 libx264(p4→veryfast)、copy 失败抛出、编码器探测
- 真实 ffmpeg 端到端(环境无 ffmpeg 自动 skip):源视频内置 200Hz 音轨+
  驱动音频 800Hz,过零率验证结果音轨主频 800Hz(非源轨),2s 画面+5s 音频
  循环输出时长≈5s;短音频路径输出≈1s 且音轨 800Hz
2026-09-20 01:47:36 +08:00