# Day 4: MuseTalk 口型同步完整修复

---

## 🐛 Next.js 启动参数修复 (14:41)

**问题**：`npm run dev -- --host 0.0.0.0` 报错 `unknown option '--host'`
**修复**：Next.js 使用 `-H` 而非 `--host`，修改 `DEPLOY_MANUAL.md`
**状态**：✅ 已修复

---

## 🔧 MuseTalk 推理完整修复

### 问题描述
视频生成后 `_lipsync.mp4` 文件大小与原视频完全一致 (28MB)，说明 MuseTalk 推理静默失败，执行了 fallback 逻辑（直接复制原视频）。

### 根因分析

#### 问题一：权重检测路径不匹配
`lipsync_service.py` 检查路径 `models/musetalk/musetalkV15`，但服务器上 `musetalkV15` 目录位于 `models/` 下，非嵌套结构。

**修复**：在服务器上创建符号链接
```bash
cd /home/rongye/ProgramFiles/ViGent/models/MuseTalk/models/musetalk
ln -s ../musetalkV15 musetalkV15
```

#### 问题二：音视频长度不匹配触发退出
`musetalk/utils/audio_processor.py` 中存在致命缺陷：

```python
# 原代码 - 音频比视频短时触发 assert 失败并 exit()
assert audio_clip.shape[1] == audio_feature_length_per_frame
...
except Exception as e:
    print(f"Error occurred: {e}")  # e 为空（AssertionError 无消息）
    exit()
```

日志表现：
```
Error occurred: 
whisper_feature.shape: torch.Size([1, 275, 5, 384])
audio_index: 266-276  ← 超出 275 范围
```

**修复**：重写为零填充逻辑，不再中断推理
```python
# 新代码 - 音频不足时使用零填充
if end_index > whisper_feature.shape[1]:
    available = whisper_feature[:, audio_index:]
    padding = torch.zeros(...)
    audio_clip = torch.cat([available, padding], dim=1)
```

### 修改的文件

| 文件 | 修改内容 |
|------|----------|
| `musetalk/utils/audio_processor.py` | 音视频长度不匹配时使用零填充 |
| `scripts/inference.py` | 增强错误日志，禁用 tqdm 避免输出干扰 |

### 验证结果

| 指标 | 修复前 | 修复后 |
|------|--------|--------|
| `_lipsync.mp4` 大小 | 28 MB (原视频) | 3.8 MB |
| 推理帧数 | 0 | 321 帧 |
| Exit code | 0 (静默失败) | 0 (真正成功) |

```
Executing: ffmpeg -y -v warning -r 60.0 -f image2 -i .../IMG_7384_.../%08d.png ...
Combining Audio...
Results saved to /home/rongye/.../debug_fixed.mp4
```

---

## 📝 文档更新 (15:30)

更新 `models/MuseTalk/DEPLOY.md`：
- 详细的权重路径总览（目录树形式）
- 关键软链接说明（`musetalk/musetalkV15`）
- 与服务器实际配置验证对齐
- 修正 dwpose 模型大小 (62MB → 387MB)

---

## ✅ Day 4 完成事项

- [x] 修复 Next.js 启动参数
- [x] 创建权重检测软链接
- [x] 修复 audio_processor.py 音视频长度不匹配问题
- [x] 增强 inference.py 错误日志
- [x] 验证 MuseTalk 推理生成 MP4
- [x] 更新 MuseTalk 部署文档
