8GB 显卡也能跑!EchoMimic 音频驱动数字人部署实战全记录
一张照片 + 一段音频 = 一个会说话的数字人视频。本文记录了在 RTX 2080 (8GB) 上从零部署 EchoMimic 的完整过程,包括环境搭建、模型下载、基础推理、长视频分段处理,以及如何用 512x512 推理 + 超分放大生成 720x1280 竖屏高清视频。
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 显存并不在官方支持列表中。但经过一番优化,完全可以跑起来。
环境搭建(手把手)
克隆代码
git clone https://github.com/BadToBest/EchoMimic
cd EchoMimic
创建 Conda 环境
conda create -n echomimic python=3.8
conda activate echomimic
安装依赖
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+:
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 并设置环境变量:
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(加速模式配置):
# 关键配置项
weight_dtype: 'fp16' # 半精度,省显存
inference_config: "./configs/inference/inference_v2.yaml"
# 你的测试用例
test_cases:
"./your_image.png": # 参考人脸图片
- "./your_audio.wav" # 说话音频
音频要求:建议 WAV 格式,16kHz 采样率,单声道,16bit。
运行推理
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 界面:
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 秒的音频需要分段处理。
核心思路:
- 将长音频按静音点自动拆分为 ≤55 秒的片段
- 每段作为独立子进程推理(子进程结束后 GPU 显存自动释放)
- 最后用 moviepy 拼接所有分段视频
音频拆分的关键代码逻辑:
# 基于 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:
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:合并音轨
超分后的视频是纯画面,需要把原视频的音轨合并回来:
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(免费)生成高质量中文语音:
pip install edge-tts
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 格式:
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 显存自动回收:
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 采样函数
核心工作流程:
- Reference UNet 编码参考图片的外观特征
- Whisper Tiny 提取音频的语音特征
- MTCNN 检测人脸并生成 face mask
- Face Locator 将人脸条件编码为空间特征
- Denoising UNet (3D) 在时间维度上扩散去噪,生成视频帧
- Context Scheduler 使用滑动窗口策略处理长视频
效果展示
以下是实际生成的几组数据:
基础版(512x512)
| 项目 | 数据 |
|---|---|
| 音频时长 | 228 秒 (3.8 分钟) |
| 分段数 | 6 段 |
| 每段推理时间 | 约 12 分钟 |
| 总耗时 | 约 70 分钟 |
| 输出大小 | 15.45 MB |
| 分辨率 | 512x512 |
高清竖屏版(720x1280)
| 项目 | 数据 |
|---|---|
| 推理分辨率 | 512x512 |
| 超分后分辨率 | 720x1280 |
| 总耗时 | 约 80 分钟 (含超分) |
| 输出大小 | 38.55 MB |
总结与建议
适合什么场景?
- 短视频/自媒体的数字人口播
- 新闻播报、产品介绍
- 虚拟主播原型验证
- AI 形象代言
我的建议
- 8GB 显存完全够用,但必须用加速模式 + fp16 + 512x512
- 长视频一定要分段处理,单段控制在 55 秒以内
- 高分辨率走后处理超分,不要硬扛原生高分辨率推理
- 音频质量很关键,Edge-TTS 的云健男声效果相当不错
- 参考图片选正脸、光线好的照片,效果会好很多
EchoMimic 系列
如果你的需求更复杂,可以关注 EchoMimic 的后续版本:
- EchoMimic V2:支持半身动画
- EchoMimic V3:1.3B 参数,统一多模态多任务
以上就是在 RTX 2080 (8GB) 上部署 EchoMimic 的完整实战记录。希望对同样想玩数字人但显卡不够豪华的同学有所帮助。