返回博客

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

2026年3月24日

一张照片 + 一段音频 = 一个会说话的数字人视频。本文记录了在 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 的完整实战记录。希望对同样想玩数字人但显卡不够豪华的同学有所帮助。