# 8GB 显卡也能跑！EchoMimic 音频驱动数字人部署实战全记录

> 一张照片 + 一段音频 = 一个会说话的数字人视频。本文记录了在 RTX 2080 (8GB) 上从零部署 EchoMimic 的完整过程，包括环境搭建、模型下载、基础推理、长视频分段处理，以及如何用 512x512 推理 + 超分放大生成 720x1280 竖屏高清视频。

- 原文链接: https://laojin.blog/blog/20260324_echomimic_deploy_guide
- 作者: 老金
- 发布日期: 2026-03-24
- 标签: EchoMimic, 数字人, AIGC, 部署实战, GPU

---

**EchoMimic** 是蚂蚁集团支付宝终端技术部开源的**音频驱动人像动画生成系统**，论文已被 **AAAI 2025** 接收。

简单来说，它能做到：

- **纯音频驱动**：给一张人脸照片 + 一段说话音频，自动生成嘴唇同步的说话视频
- **音频 + 姿态驱动**：除了音频控制嘴唇，还能用预设的面部 landmark 控制头部姿态
- **运动同步**：从一段驱动视频中提取面部运动，对齐到参考图片上

支持中文、英文、甚至唱歌场景。更关键的是，它提供了**加速模式**，推理速度提升 10 倍——这让低显存显卡也能玩转。

**项目地址**：
- GitHub：https://github.com/antgroup/echomimic
- HuggingFace：https://huggingface.co/BadToBest/EchoMimic
- 论文：https://arxiv.org/abs/2407.08136

---

## 我的硬件环境

| 项目 | 配置 |
|------|------|
| GPU | NVIDIA GeForce RTX 2080 (8GB VRAM) |
| 系统 | Windows 10/11 |
| CUDA | 11.8 |
| Python | 3.8 (conda) |

官方测试环境是 A100 (80GB) / RTX 4090D (24GB) / V100 (16GB)，**8GB 显存并不在官方支持列表中**。但经过一番优化，完全可以跑起来。

---

## 环境搭建（手把手）

### 克隆代码

```bash
git clone https://github.com/BadToBest/EchoMimic
cd EchoMimic
```

### 创建 Conda 环境

```bash
conda create -n echomimic python=3.8
conda activate echomimic
```

### 安装依赖

```bash
pip install -r requirements.txt
```

核心依赖一览：

| 包名 | 版本 | 作用 |
|------|------|------|
| torch | 2.0.1 ~ 2.2.2 | PyTorch 深度学习框架 |
| diffusers | 0.24.0 (锁定) | Stable Diffusion 扩散模型库 |
| facenet_pytorch | 2.5.0 | MTCNN 人脸检测 |
| moviepy | 1.0.3 | 视频处理与拼接 |
| omegaconf | 2.3.0 | YAML 配置管理 |
| gradio | latest | Web UI 界面 |
| mediapipe | latest | 面部 landmark 提取 |
| opencv-python | latest | 图像/视频处理 |

> **踩坑提醒**：`diffusers` 必须是 `0.24.0`，版本不对会报各种奇怪错误。

### 下载预训练权重

这是最关键的一步，权重文件约 **10GB+**：

```bash
git lfs install
git clone https://huggingface.co/BadToBest/EchoMimic pretrained_weights
```

> 国内用户如果 HuggingFace 下载慢，可以用 ModelScope 镜像：
> https://www.modelscope.cn/models/BadToBest/EchoMimic

下载完成后，`pretrained_weights` 目录结构如下：

```
./pretrained_weights/
├── denoising_unet.pth           # 标准去噪 UNet
├── denoising_unet_acc.pth       # 加速版去噪 UNet（推荐）
├── reference_unet.pth           # 参考图编码 UNet
├── motion_module.pth            # 运动模块（标准）
├── motion_module_acc.pth        # 运动模块（加速版）
├── face_locator.pth             # 人脸定位器
├── sd-vae-ft-mse/               # Stable Diffusion VAE
├── sd-image-variations-diffusers/  # SD 基础模型架构
└── audio_processor/
    └── whisper_tiny.pt           # OpenAI Whisper Tiny 音频特征提取
```

其中 `_acc` 后缀的是加速版权重，**8GB 显存必须用这个**。

如果还需要姿态驱动功能，额外下载 `_pose` 和 `_pose_acc` 后缀的权重文件。

### FFmpeg（可选）

Linux/Mac 用户需要下载 ffmpeg-static 并设置环境变量：

```bash
export FFMPEG_PATH=/path/to/ffmpeg-4.4-amd64-static
```

Windows 用户如果只用 Python 的 moviepy 做视频处理，可以跳过这步。

---

## 快速开始：第一次推理

### 标准模式 vs 加速模式

EchoMimic 提供两套推理脚本：

| 模式 | 脚本 | 步数 | CFG | 速度 (V100) | 显存需求 |
|------|------|------|-----|-------------|---------|
| **标准模式** | `infer_audio2vid.py` | 30 步 | 2.5 | ~7 分钟/240帧 | 16GB+ |
| **加速模式** | `infer_audio2vid_acc.py` | 6 步 | 1.0 | ~50 秒/240帧 | 8GB 可用 |

加速模式的秘密在于使用了 **v-prediction + Zero-SNR** 技术（配置在 `configs/inference/inference_v2.yaml` 中），配合专门训练的加速权重，仅需 6 步 DDIM 采样即可出图，速度提升约 **10 倍**。

### 配置你的用例

编辑 `configs/prompts/animation_acc.yaml`（加速模式配置）：

```yaml
# 关键配置项
weight_dtype: 'fp16'              # 半精度，省显存
inference_config: "./configs/inference/inference_v2.yaml"

# 你的测试用例
test_cases:
  "./your_image.png":             # 参考人脸图片
    - "./your_audio.wav"          # 说话音频
```

> **音频要求**：建议 WAV 格式，16kHz 采样率，单声道，16bit。

### 运行推理

```bash
conda activate echomimic

python -u infer_audio2vid_acc.py \
    --config ./configs/prompts/animation_acc.yaml \
    -W 512 -H 512 -L 1200 \
    --steps 6 --cfg 1.0 \
    --seed 420 \
    --context_frames 12 --context_overlap 3 \
    --fps 24 --device cuda
```

关键参数说明：

| 参数 | 说明 | 推荐值 |
|------|------|--------|
| `-W` / `-H` | 输出视频宽高 | 512 (8GB 显存上限) |
| `-L` | 最大生成帧数 (1200帧@24fps=50秒) | 1200 |
| `--steps` | DDIM 采样步数 | 6 (加速模式) |
| `--cfg` | 引导强度 | 1.0 (加速模式) |
| `--context_frames` | 时间窗口大小 | 12 |
| `--context_overlap` | 窗口重叠帧数 | 3 |
| `--fps` | 输出帧率 | 24 |
| `--seed` | 随机种子 (-1 为随机) | 420 |

输出视频会保存在 `output/日期/时间--seed_420-512x512/` 目录下。

### Web UI 模式

EchoMimic 还提供了基于 Gradio 的 Web 界面：

```bash
python -u webgui.py --server_port=3000
```

浏览器打开 `http://localhost:3000`，上传图片和音频即可在线生成。

---

## 8GB 显存优化实战

8GB 显存是个硬约束。以下是我总结的优化策略：

### 必须使用加速模式

标准模式 30 步推理在 8GB 上直接 OOM。加速模式 6 步是唯一选择：

- 权重用 `denoising_unet_acc.pth` + `motion_module_acc.pth`
- 步数设为 6，CFG 设为 1.0
- 精度用 fp16

### 分辨率限制

| 分辨率 | 8GB 可行性 | 说明 |
|--------|-----------|------|
| **512x512** | 可行 | 推荐，每段约 12 分钟 |
| 512x896 | 勉强 | 非常慢，30+ 分钟/段 |
| 720x1280 | 不可行 | OOM 或极慢 |

> 结论：**8GB 显存老老实实跑 512x512**，高分辨率靠后期超分解决。

### 长音频分段处理

EchoMimic 的 `-L 1200` 参数意味着最多生成 1200 帧（24fps 下 50 秒）。超过 60 秒的音频需要分段处理。

**核心思路**：

1. 将长音频按**静音点**自动拆分为 ≤55 秒的片段
2. 每段作为**独立子进程**推理（子进程结束后 GPU 显存自动释放）
3. 最后用 moviepy 拼接所有分段视频

音频拆分的关键代码逻辑：

```python
# 基于 RMS 能量检测静音点
window_size = framerate // 10  # 100ms 窗口
for i in range(n_windows):
    chunk = samples[i * window_size: (i + 1) * window_size]
    rms = math.sqrt(sum(s * s for s in chunk) / len(chunk))
    energies.append(rms)

# 在 [max_duration*0.7, max_duration] 范围内找最安静的点切割
```

实际效果：一段 228 秒的音频被自动拆分为 6 段（每段 22~45 秒），逐段推理后拼接，总耗时约 70 分钟。

---

## 进阶：生成 720x1280 竖屏高清视频

直接用 720x1280 推理在 8GB 显存上不可行。我的解决方案是**两步走**：

### Step 1：512x512 推理

先以低分辨率完成推理，确保显存够用、速度可接受。

### Step 2：Lanczos 超分放大

用 OpenCV 的 **Lanczos4 插值**（OpenCV 中最高质量的插值算法）逐帧将 512x512 放大到 720x1280：

```python
import cv2

# 逐帧读取 -> 放大 -> 写入
while True:
    ret, frame = cap.read()
    if not ret:
        break
    upscaled = cv2.resize(frame, (720, 1280),
                          interpolation=cv2.INTER_LANCZOS4)
    out.write(upscaled)
```

### Step 3：合并音轨

超分后的视频是纯画面，需要把原视频的音轨合并回来：

```python
from moviepy.editor import VideoFileClip

video = VideoFileClip("upscaled_video.mp4")
audio_src = VideoFileClip("original_with_audio.mp4")
final = video.set_audio(audio_src.audio)
final.write_videofile("final_720p.mp4", codec="libx264", audio_codec="aac")
```

### 完整流水线

整个流程可以封装成一个自动化脚本，一键执行：

```
拆分音频 → 512x512 推理 → Lanczos 超分到 720x1280 → 合并音轨 → 拼接最终视频
```

实测结果：228 秒音频，6 段视频，最终输出 **720x1280 竖屏视频 38.55 MB**。

---

## 用 Edge-TTS 生成中文语音

如果你没有现成的音频，可以用微软的 **Edge-TTS**（免费）生成高质量中文语音：

```bash
pip install edge-tts
```

```python
import edge_tts
import asyncio

async def generate_audio():
    communicate = edge_tts.Communicate(
        text="你好，我是老金，今天来聊聊AI新闻。",
        voice="zh-CN-YunjianNeural",  # 云健：成熟沉稳男声
        rate="+0%",
        pitch="-2Hz",  # 音调略低，更沉稳
    )
    await communicate.save("output.mp3")

asyncio.run(generate_audio())
```

常用的中文男声有：
- `zh-CN-YunjianNeural`（云健）：成熟沉稳，适合新闻播报
- `zh-CN-YunxiNeural`（云希）：年轻活力
- `zh-CN-YunyeNeural`（云野）：叙事风格

生成 MP3 后，用 ffmpeg 转换为 EchoMimic 需要的 WAV 格式：

```bash
ffmpeg -y -i output.mp3 -ar 16000 -ac 1 -sample_fmt s16 output.wav
```

---

## 四种推理模式一览

| 模式 | 脚本 | 输入 | 特点 |
|------|------|------|------|
| 纯音频驱动 | `infer_audio2vid.py` | 图片 + 音频 | 标准模式，30 步，高质量 |
| 纯音频驱动(加速) | `infer_audio2vid_acc.py` | 图片 + 音频 | **6 步，速度 10x，推荐** |
| 音频+姿态驱动 | `infer_audio2vid_pose.py` | 图片 + 音频 + landmark | 可控制头部姿态 |
| 音频+姿态驱动(加速) | `infer_audio2vid_pose_acc.py` | 图片 + 音频 + 视频/landmark | 含 motion_sync 功能 |

姿态驱动模式需要额外的 `_pose.pth` 权重文件，以及预处理好的 landmark `.pkl` 文件。可以用 `demo_motion_sync.py` 从驱动视频中提取。

---

## 踩坑记录

在 8GB 显存 + Windows 环境下部署，我遇到了不少问题，逐一记录：

### diffusers 版本

必须是 `0.24.0`。新版本的 API 不兼容，会报 `torch.utils._pytree._register_pytree_node is deprecated` 等各种警告，虽然能跑但可能出问题。

### Windows 终端编码

脚本中如果包含 emoji 字符（如 ✅），Windows 的 GBK 编码会报错：

```
UnicodeEncodeError: 'gbk' codec can't encode character '\u2705'
```

**解决**：去掉所有 emoji，用纯 ASCII 字符代替。

### FFmpeg 路径问题

Windows 上 ffmpeg 可能不在 PATH 中。两种解决方案：
- 安装 ffmpeg 并加入 PATH
- 用 moviepy 替代 ffmpeg 做视频处理（moviepy 底层也用 ffmpeg，但它会自动找）

### 长视频显存不释放

如果在同一个进程中连续推理多段视频，GPU 显存不会自动释放。

**解决**：每段视频用**独立子进程**推理，子进程结束后 GPU 显存自动回收：

```python
cmd = [python_path, "-u", "infer_audio2vid_acc.py", "--config", config, ...]
subprocess.run(cmd)  # 子进程结束后显存自动释放
```

### Real-ESRGAN 安装失败

想用 AI 超分辨率（Real-ESRGAN）来放大视频，但安装后报错：

```
ModuleNotFoundError: No module named 'torchvision.transforms.functional_tensor'
```

这是 `basicsr` 库和当前 `torchvision` 版本不兼容导致的。

**解决**：放弃 Real-ESRGAN，改用 OpenCV 的 `INTER_LANCZOS4` 插值，对数字人视频这种规整内容效果已经相当好了。

### 720x1280 在 8GB 上不可行

直接用 720x1280 分辨率推理，要么 OOM，要么慢到不可接受（一段 45 秒的音频推理超过 30 分钟还没出结果）。

**解决**：512x512 推理 + 后期 Lanczos 超分放大，这是 8GB 显存下的最优解。

---

## 项目架构速览

对于想深入了解或二次开发的同学，这里简单梳理下核心架构：

```
src/
├── models/
│   ├── unet_2d_condition.py    # Reference UNet (编码参考图外观)
│   ├── unet_3d_echo.py         # Denoising UNet (3D 时序去噪核心)
│   ├── face_locator.py         # 人脸条件编码器
│   ├── motion_module.py        # 时间自注意力运动模块
│   ├── mutual_self_attention.py # 参考图注意力注入
│   └── whisper/                # 内置 Whisper 音频特征提取
├── pipelines/
│   ├── pipeline_echo_mimic.py      # 标准推理 Pipeline
│   ├── pipeline_echo_mimic_acc.py  # 加速推理 Pipeline
│   └── context.py                  # 时间窗口滑动调度
└── utils/
    ├── draw_utils.py           # Landmark 可视化
    ├── motion_utils.py         # 运动对齐
    └── step_func.py            # v-prediction 采样函数
```

**核心工作流程**：

1. **Reference UNet** 编码参考图片的外观特征
2. **Whisper Tiny** 提取音频的语音特征
3. **MTCNN** 检测人脸并生成 face mask
4. **Face Locator** 将人脸条件编码为空间特征
5. **Denoising UNet (3D)** 在时间维度上扩散去噪，生成视频帧
6. **Context Scheduler** 使用滑动窗口策略处理长视频

---

## 效果展示

以下是实际生成的几组数据：

### 基础版（512x512）

| 项目 | 数据 |
|------|------|
| 音频时长 | 228 秒 (3.8 分钟) |
| 分段数 | 6 段 |
| 每段推理时间 | 约 12 分钟 |
| 总耗时 | 约 70 分钟 |
| 输出大小 | 15.45 MB |
| 分辨率 | 512x512 |

### 高清竖屏版（720x1280）

| 项目 | 数据 |
|------|------|
| 推理分辨率 | 512x512 |
| 超分后分辨率 | 720x1280 |
| 总耗时 | 约 80 分钟 (含超分) |
| 输出大小 | 38.55 MB |

---

## 总结与建议

### 适合什么场景？

- 短视频/自媒体的数字人口播
- 新闻播报、产品介绍
- 虚拟主播原型验证
- AI 形象代言

### 我的建议

1. **8GB 显存完全够用**，但必须用加速模式 + fp16 + 512x512
2. **长视频一定要分段处理**，单段控制在 55 秒以内
3. **高分辨率走后处理超分**，不要硬扛原生高分辨率推理
4. **音频质量很关键**，Edge-TTS 的云健男声效果相当不错
5. **参考图片选正脸、光线好的照片**，效果会好很多

### EchoMimic 系列

如果你的需求更复杂，可以关注 EchoMimic 的后续版本：
- **EchoMimic V2**：支持半身动画
- **EchoMimic V3**：1.3B 参数，统一多模态多任务

---

以上就是在 RTX 2080 (8GB) 上部署 EchoMimic 的完整实战记录。希望对同样想玩数字人但显卡不够豪华的同学有所帮助。

---
