返回博客

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

作者 约 6 分钟读完

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


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

简单来说,它能做到:

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

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

项目地址:


我的硬件环境

项目配置
GPUNVIDIA GeForce RTX 2080 (8GB VRAM)
系统Windows 10/11
CUDA11.8
Python3.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

核心依赖一览:

包名版本作用
torch2.0.1 ~ 2.2.2PyTorch 深度学习框架
diffusers0.24.0 (锁定)Stable Diffusion 扩散模型库
facenet_pytorch2.5.0MTCNN 人脸检测
moviepy1.0.3视频处理与拼接
omegaconf2.3.0YAML 配置管理
gradiolatestWeb UI 界面
mediapipelatest面部 landmark 提取
opencv-pythonlatest图像/视频处理

踩坑提醒: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.py30 步2.5~7 分钟/240帧16GB+
加速模式infer_audio2vid_acc.py6 步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
--stepsDDIM 采样步数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 秒的音频需要分段处理。

核心思路:

  1. 将长音频按静音点自动拆分为 ≤55 秒的片段
  2. 每段作为独立子进程推理(子进程结束后 GPU 显存自动释放)
  3. 最后用 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 采样函数

核心工作流程:

  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 的完整实战记录。希望对同样想玩数字人但显卡不够豪华的同学有所帮助。