4.1 KiB
4.1 KiB
Day 3: MuseTalk 推理环境修复与验证
🔧 MuseTalk 推理环境修复
问题描述
MuseTalk 口型同步功能失效。后端日志显示任务完成,但生成的视频与原视频大小完全一致(28MB),说明执行了 fallback 逻辑(直接复制原视频),MuseTalk 推理过程静默失败。
根本原因分析
- PyTorch 版本不兼容:服务器安装了 PyTorch 2.5.1+cu121,但 mmcv 没有以此版本预编译的 CUDA 扩展,导致
import mmcv失败。 - MMLab 依赖缺失:conda 环境中缺少
mmcv,mmdet,mmengine等必要依赖。 - 模型路径错误:HuggingFace 下载的模型结构包含嵌套目录(如
models/musetalk/musetalk/),且部分文件夹名称不符合代码预期(如服务器上为sd-vae-ft-mse,代码期望sd-vae)。 - 模型权重缺失:缺少
dwpose,syncnet,face-parse-bisent等辅助模型权重。
解决方案
1. 环境重建
降级 PyTorch 并安装官方推荐的 MMLab 版本:
# 降级 PyTorch (配合 CUDA 11.8)
pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118
# 安装 MMLab 依赖
pip install --no-cache-dir -U openmim
mim install mmengine
mim install "mmcv==2.0.1"
mim install "mmdet==3.1.0"
pip install chumpy --no-build-isolation
pip install "mmpose==1.1.0" --no-deps
2. 模型目录修复
重组目录结构并创建符号链接以匹配代码预期:
cd models/MuseTalk/models
# 修复 sd-vae 路径
ln -s sd-vae-ft-mse sd-vae
# 修复 config.json 命名
cd musetalk && ln -s musetalk.json config.json
3. 补全缺失模型
下载 dwpose, syncnet, face-parse-bisent 模型到对应目录。
结果
- ✅ 推理脚本成功运行:测试脚本成功加载所有模型并处理视频帧。
- ✅ 帧生成确认:在输出目录中验证生成了 593 帧 PNG 图片。
⚠️ 遗留问题
- 视频合成未完成:虽然推理生成了帧图片,但最终的 MP4 视频文件尚未生成。可能是
inference.py中调用 ffmpeg 进行视频合成的步骤有问题,或者 ffmpeg 调用参数需要调整。需要进一步排查视频合成逻辑。
🛠️ 视频合成问题修复
问题分析
经排查 inference.py 代码,发现以下问题:
- FFmpeg 调用静默失败:原代码使用
os.system()调用 ffmpeg,无法捕获错误输出,且忽略了返回值。 - API 参数不匹配:
musetalk_api.py传递--video_path等命令行参数,但inference.py仅支持 YAML 配置文件,导致 API 调用时参数解析错误。 - 临时文件清理过早:发生错误时立即删除了临时帧,导致无法排查问题。
- 路径兼容性:FFmpeg 命令中对路径的处理可能在某些 shell 环境下存在问题。
修复方案
已重写 scripts/inference.py:
- 增强 FFmpeg 调用:替换
os.system为subprocess.run(..., check=True, capture_output=True),即使失败也能打印完整的 stdout/stderr 错误日志。 - 支持命令行参数:添加
--video_path、--audio_path和--output_path参数支持,使其能直接被 API 调用(通过构建临时任务配置)。 - 优化错误处理:增加 try-except 块,并在失败时保留临时文件以便调试,添加了详细的 Traceback 打印。
- 完善参数映射:自动处理
output_path到output_vid_name的映射。
下一步
- 将本地更新的
models/MuseTalk/scripts/inference.py同步到服务器。 - 在服务器上运行测试,观察 FFmpeg 是否成功合成 MP4。
- 验证 API 端到端调用是否成功。
🐛 前端端口配置修复 (17:03)
问题:后端日志或文档指引访问 3002 端口,但 Next.js 默认启动在 3000,导致无法访问。 修复:
- 修改
frontend/package.json默认启动命令为next dev -p 3002。 - 更新
DEPLOY_MANUAL.md明确端口参数--port 3002。 状态:✅ 已修复