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
Owner

严重 bug

结果视频保留了源视频音轨(波形比对与原轨相关系数 0.9998、与 TTS 无关),数字人口型配的是原声。根因:最终 ffmpeg 封装未写 -map,默认流选择把第一个输入自带音轨带进结果。

修复(deploy/gpu_worker/musetalk_server.py)

  1. 音轨替换:新增 _mux_video_with_audio(),强制 -map 0:v:0 -map 1:a:0——画面只取 MuseTalk 无声产物,音轨只取驱动音频(AAC 128k)
  2. 时长对齐:新增 _get_media_duration();音频不超过视频(容差 0.25s)时 -c:v copy -shortest 秒封装;音频长于视频时 -stream_loop -1 循环画面 + h264_nvenc 硬件重编码 + -t <音频时长>,不截短语音
  3. 编码器自适应MUSE_VIDEO_ENCODER=auto(默认)探测 NVENC,不可用/编码失败自动回退 libx264(veryfast);preset 随编码器选择(nvenc p4 / x264 veryfast)
  4. 开关 MUSE_ENABLE_VIDEO_LOOP(默认 1),请求 form 支持 enable_video_loop 单任务覆盖
  5. 示例推理改为先产出无声 visual_silent.mp4(-an)再统一 mux,真实 MuseTalk 接入时把无声产物路径传给 _mux_video_with_audio 即可

部署(RTX2060 必做)

README 新增 2.2 节:wget 重新拉取 develop 的 musetalk_server.py → systemctl restart musetalk-server → curl /health。

测试(10 新用例,46 个 GPU worker 相关全绿)

  • 命令构造:非循环 copy+显式 map、容差边界、循环路径 stream_loop/NVENC/-t 且无 -shortest、关闭循环、NVENC 失败回退 libx264(p4→veryfast)、copy 失败抛出、编码器探测
  • 真实 ffmpeg 端到端(无 ffmpeg 环境自动 skip):源视频内置 200Hz 音轨 + 驱动音频 800Hz,过零率验证结果音轨主频为 800Hz(证明非源轨);2s 画面+5s 音频循环输出时长≈5s;短音频路径≈1s 且音轨仍为 800Hz
  • black/isort/ruff 通过
## 严重 bug 结果视频保留了源视频音轨(波形比对与原轨相关系数 0.9998、与 TTS 无关),数字人口型配的是原声。根因:最终 ffmpeg 封装未写 -map,默认流选择把第一个输入自带音轨带进结果。 ## 修复(deploy/gpu_worker/musetalk_server.py) 1. **音轨替换**:新增 `_mux_video_with_audio()`,强制 `-map 0:v:0 -map 1:a:0`——画面只取 MuseTalk 无声产物,音轨只取驱动音频(AAC 128k) 2. **时长对齐**:新增 `_get_media_duration()`;音频不超过视频(容差 0.25s)时 `-c:v copy -shortest` 秒封装;音频长于视频时 `-stream_loop -1` 循环画面 + `h264_nvenc` 硬件重编码 + `-t <音频时长>`,不截短语音 3. **编码器自适应**:`MUSE_VIDEO_ENCODER=auto`(默认)探测 NVENC,不可用/编码失败自动回退 libx264(veryfast);preset 随编码器选择(nvenc p4 / x264 veryfast) 4. 开关 `MUSE_ENABLE_VIDEO_LOOP`(默认 1),请求 form 支持 `enable_video_loop` 单任务覆盖 5. 示例推理改为先产出无声 visual_silent.mp4(-an)再统一 mux,真实 MuseTalk 接入时把无声产物路径传给 `_mux_video_with_audio` 即可 ## 部署(RTX2060 必做) README 新增 2.2 节:wget 重新拉取 develop 的 musetalk_server.py → systemctl restart musetalk-server → curl /health。 ## 测试(10 新用例,46 个 GPU worker 相关全绿) - 命令构造:非循环 copy+显式 map、容差边界、循环路径 stream_loop/NVENC/-t 且无 -shortest、关闭循环、NVENC 失败回退 libx264(p4→veryfast)、copy 失败抛出、编码器探测 - **真实 ffmpeg 端到端**(无 ffmpeg 环境自动 skip):源视频内置 200Hz 音轨 + 驱动音频 800Hz,过零率验证结果音轨主频为 800Hz(证明非源轨);2s 画面+5s 音频循环输出时长≈5s;短音频路径≈1s 且音轨仍为 800Hz - black/isort/ruff 通过
xiaoxia added 1 commit 2026-09-20 01:50:36 +08:00
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
54f9fe0dc1
严重 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

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1997 | | 预览链接 | [https://pr-1997.preview.xiaoxiajianji.com](https://pr-1997.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-09-20 02:18:05 +08:00
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
bd5b4025a3
auto-approve-bot merged commit b0b81a5d60 into develop 2026-09-20 02:27:45 +08:00
auto-approve-bot deleted branch fix/1978-musetalk-audio-mux-loop 2026-09-20 02:27:47 +08:00

🗑️ 预览环境已清理

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

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

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