Avatarify Python 视频会议数字人实战指南:从安装部署到 First Order Motion Model 驱动原理
【免费下载链接】avatarify-pythonAvatars for Zoom, Skype and other video-conferencing apps.项目地址: https://gitcode.com/gh_mirrors/ava/avatarify-python
导读
Avatarify Python 是一个开源的照片级真实感数字人(Photorealistic Avatar)项目,它把经典的 First Order Motion Model 图像动画算法与虚拟摄像头技术结合起来,让你在 Zoom、Skype、Teams、Slack 等任意可切换视频源的会议软件中,用自己的面部动作实时驱动任意一张静态人像(名人、StyleGAN 生成的不存在之人,乃至你自己的照片)。本指南完整覆盖该仓库 README.md 与 安装文档 的全部内容,并深入 afy/ 源码层,讲解本地 GPU 与远程 GPU 两种运行模式、三平台安装步骤、完整键盘控制集、头像对齐技巧,以及模型推理管线的底层实现。读完你将能够独立完成 Avatarify Python 的部署、调参、运行与问题排查。
提示:Avatarify Python 需要手动下载并安装一些依赖,适合具备基础命令行经验的用户。若你希望开箱即用,仓库维护者更推荐使用图形界面的 Avatarify Desktop 版本;本文档仍以 Avatarify Python 为主线展开。
一、项目定位与两种运行模式
Avatarify Python 基于 First Order Motion Model(一阶运动模型)实现——该算法仅需一张静态源图与一段驱动视频,即可通过关键点(keypoint)与局部仿射变换(Jacobian)的迁移生成高度逼真的人脸动画。项目在仓库根目录 README.md 中明确说明这一点,整个推理核心正是围绕该模型展开。
根据 安装文档 的 Requirements 一节,Avatarify 支持两种运行模式:
- 本地模式(locally):在你的电脑上直接跑完整推理,需要一块支持 CUDA 的 NVIDIA 显卡;没有 NVIDIA GPU 时会回退到 CPU,速度极慢。
- 远程模式(remotely):把繁重的神经网络推理放到 Google Colab 或带 GPU 的专用服务器上,本机只负责采集摄像头画面并显示合成视频流。此模式对电脑本身没有特殊要求,仅需稳定的网络连接。
无论哪种模式,你都需要一个可用的摄像头(webcam)——它是驱动头像的"输入设备"。
二、系统要求与硬件基线
安装文档给出了本地模式在部分 NVIDIA 显卡上的性能基线(帧率数据来自官方文档的实测记录,实际表现会因驱动、分辨率与后台负载而异):
| 显卡 | 帧率(fps) |
|---|---|
| GeForce GTX 1080 Ti | 33 |
| GeForce GTX 1070 | 15 |
| GeForce GTX 950 | 9 |
- 无 NVIDIA GPU 时,PyTorch 会回退到 CPU,官方 FAQ 明确说明性能会大幅下降(<1 fps),MacBook 用户尤其会感受到这一点——Mac 笔记本普遍没有 CUDA 显卡。
- 没有 NVIDIA GPU 又想流畅运行,官方给出的路线是远程模式:把推理任务卸载到 Colab 或远程 GPU 服务器,笔记本只负责视频流的收发。
三、安装部署(Install)
3.1 下载网络权重
无论哪种平台,第一步都是下载模型权重文件vox-adv-cpk.pth.tar(约 228 MB,md5sum8a45a24037871c045fbb8a6a8aa95ebc)。权重文件从安装文档提供的公开下载渠道获取后,直接放置在仓库根目录(avatarify-python 目录)下,不要解压。该文件名与 run.sh 中FOMM_CKPT=vox-adv-cpk.pth.tar的约定一一对应,启动脚本会在该路径下加载检查点。
3.2 Linux 安装
Linux 通过v4l2loopback内核模块创建虚拟摄像头。安装步骤如下:
- 下载并安装 [Miniconda Python 3.7]:
bash Miniconda3-latest-Linux-x86_64.sh- 克隆仓库并执行安装脚本(需要 sudo 权限):
git clone https://gitcode.com/gh_mirrors/ava/avatarify-python.git cd avatarify-python bash scripts/install.sh- 下载网络权重并放入仓库根目录。
来看 scripts/install.sh 究竟做了什么,它能帮你理解依赖结构:
- 先校验
conda与git是否可用; - 克隆并编译安装
v4l2loopback(make && sudo make install),这是虚拟摄像头的内核基础; - 创建名为
avatarify的 conda 环境(Python 3.7),环境名与 scripts/settings.sh 中CONDA_ENV_NAME=avatarify对应; - 安装
numpy==1.19.0、scikit-image、python-blosc==1.7.0以及pytorch==1.7.1、torchvision、cudatoolkit=11.0; - 克隆 First Order Motion Model 实现到
fomm/子目录; - 执行 requirements.txt 安装其余 Python 依赖:
opencv-python==4.2.0.34(视频采集)、face-alignment==1.3.3(人脸关键点检测)、pyzmq==20.0.0(远程模式消息传输)、msgpack-numpy(张量序列化)、pyyaml(配置解析)、requests、pyfakewebcam==0.1.0(Linux 虚拟摄像头写入)。
3.3 Mac 安装
Mac 平台使用 CamTwist 创建虚拟摄像头:
- 安装 Miniconda Python 3.7(或通过 Homebrew Cask:
brew install --cask miniconda); - 下载/克隆仓库并运行安装脚本:
git clone https://gitcode.com/gh_mirrors/ava/avatarify-python.git cd avatarify-python bash scripts/install_mac.sh- 下载并安装 CamTwist。
注意:在 Mac 上 Avatarify 只能通过 Google Colab 或带 GPU 的专用服务器(远程模式)运行——这是官方文档的明确说明,原因是 Mac 缺少 CUDA 显卡。
3.4 Windows 安装
Windows 指南针对 Windows 10 测试通过,核心链路是"Avatarify 输出窗口 + OBS Studio + VirtualCam 插件":
- 安装 [Miniconda Python 3.8];
- 安装 [Git];
- 打开 Anaconda Prompt,逐条执行(不要改动命令):
git clone https://gitcode.com/gh_mirrors/ava/avatarify-python.git cd avatarify-python scripts\install_windows.bat- 下载权重文件放入仓库根目录;
- 运行
run_windows.bat。安装成功后会出现 "cam" 和 "avatarify" 两个窗口,保持它们打开; - 安装 OBS Studio 与 VirtualCam 插件(选择 "Install and register only 1 virtual camera");
- 运行 OBS Studio → Sources 添加 Windows Capture,窗口选择 "[python.exe]: avatarify",随后 Edit → Transform → Fit to screen;
- OBS 菜单 Tools → VirtualCam,勾选 AutoStart、Buffered Frames 设为 0,点击 Start;
- 此时 Zoom 等软件中即可选择
OBS-Camera摄像头。步骤 10-11(OBS 配置)只需在首次设置时执行一次。
Windows 的安装脚本与配置文件对应关系:run_windows.bat对应启动入口,scripts/settings_windows.bat中维护摄像头索引等设置。
3.5 Docker 方式(仅 Linux)
Docker 镜像只在 Linux 上提供。部署步骤:
- 按 Docker 官方文档安装 Docker,并配置非 root 用户权限;
- 使用 GPU(强烈建议):安装 NVIDIA 驱动与 nvidia-docker;
- 克隆仓库并安装依赖(即 v4l2loopback 内核模块):
git clone https://gitcode.com/gh_mirrors/ava/avatarify-python.git cd avatarify-python bash scripts/install_docker.sh- 构建镜像:
cd avatarify-python docker build -t avatarify .scripts/install_docker.sh 与 install.sh 的区别在于它只安装 v4l2loopback 内核模块,Python 环境全部封装进镜像。仓库根目录的 Dockerfile 揭示了镜像内容:基础镜像为nvcr.io/nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04,默认 Python 3.7,镜像内克隆了 avatarify 与 fomm 源码并固定 commit,pip安装 PyTorch CUDA 10.0 wheel 与两份 requirements;暴露 5557/5558 两个端口(远程 worker 的输入/输出通信端口),默认 CMD 以--is-worker模式启动——也就是说 Docker 镜像默认就是一台"远程 GPU worker",与 afy/arguments.py 中--is-worker、--in-port、--out-port的参数设计完全对应。
四、添加自定义头像(Setup avatars)
仓库自带一批名人头像,位于 avatars/ 目录(einstein.jpg、eminem.jpg、jobs.jpg、mona.jpg、obama.jpg、potter.jpg、ronaldo.png、schwarzenegger.png 等),开箱即用。想扩充头像库非常简单:把任意人像图片复制进avatars文件夹即可,运行时可随时用键盘热键切换。
官方文档给出了三条提升画面质量的头像图片建议:
- 对头像图片做正方形裁剪;
- 人脸在画面中的占比要适中——不要太近也不要太远,以自带标准头像为参考;
- 优先选择背景均匀的照片,可显著减少合成时的视觉伪影(artifacts)。
五、运行 Avatarify(Run)
运行前必须插好摄像头。官方强调:务必在 Avatarify 启动之后再启动视频会议软件,这样会议软件才能正确枚举到虚拟摄像头。
5.1 Linux
bash run.sh- 运行脚本会自动创建虚拟摄像头
/dev/video9,相关配置在 scripts/settings.sh 中:CAMID_VIRT=9(虚拟摄像头设备号,注释特别提醒:该值必须大于v4l2-ctl --list-devices列出的最大设备号,但不要设得过大——已知 Zoom 无法识别类似 99 这样的高设备号)、CONDA_ENV_NAME=avatarify(conda 环境名)。 - 可用
v4l2-ctl --list-devices查看系统所有视频设备。 - 没有安装 GPU 时加
--no-gpus标志;想用 Docker 运行加--docker标志。
启动后会出现两个窗口:cam窗口用于控制你的面部位置(对齐参考),avatarify窗口用于预览头像动画效果。随后参照下文"驱动你的头像"小节进行操作。
5.2 Mac
由于 Mac 无法本地推理,运行流程为:
- 先按 Google Colab 或专用服务器的方式启动远程推理端(在 Mac 上 Avatarify 只支持远程模式);
- 打开 CamTwist;
- 选择
Desktop+并点击Select; - 在 Settings 中选择
Confine to Application Window,并在下拉菜单里选中python (avatarify)窗口。
同样会弹出cam与avatarify两个窗口。
5.3 Windows
cd C:\path\to\avatarify run_windows.bat随后运行 OBS Studio,它会自动把 Avatarify 的画面推流到OBS-Camera虚拟摄像头。降低延迟技巧:在 OBS 预览窗口上右键,取消勾选 Enable Preview。
5.4 run.sh 深度解析:启动参数与调用链
run.sh 是 Linux 启动的核心入口,其参数解析逻辑值得展开(源码可查):
| run.sh 参数 | 作用 | 透传效果 |
|---|---|---|
--no-conda | 跳过 conda 环境激活(适用于已手动激活环境的情况) | 无 |
--no-vcam | 跳过虚拟摄像头创建,并向程序透传--no-stream | 强制不输出视频流 |
--keep-ps | 不 kill 掉残留的afy/cam_fomm.py进程 | 无 |
--docker | 改用 docker run 方式启动 | 自动附加 GPU 运行时参数 |
--no-gpus | Docker 模式不使用 GPU | 跳过--gpus all/--runtime=nvidia |
--is-worker | 以远程 worker 身份启动 | 透传,Docker 下映射 5557/5558 端口 |
--is-client/--is-local-client | 以客户端身份启动 | 透传,Docker 下设置网络模式 |
非 Docker 路径下,脚本会先 kill 残留进程,source scripts/settings.sh,调用 scripts/create_virtual_camera.sh 执行sudo modprobe v4l2loopback exclusive_caps=1 video_nr=$CAMID_VIRT card_label="avatarify"创建虚拟摄像头,激活 conda 环境,最终以如下参数启动推理主程序(见 afy/cam_fomm.py):
python afy/cam_fomm.py \ --config fomm/config/vox-adv-256.yaml \ --checkpoint vox-adv-cpk.pth.tar \ --virt-cam 9 \ --relative \ --adapt_scale注意--relative(相对关键点坐标)与--adapt_scale(根据关键点凸包自适应运动幅度)默认开启,这是获得自然动画的两个关键开关,对应 afy/predictor_local.py 中normalize_kp()的use_relative_movement与adapt_movement_scale逻辑。
六、键盘控制全集(Controls)
官方文档给出了完整的控制键位表,运行时可通过这些热键实时操控:
| 键位 | 功能 |
|---|---|
| 1-9 | 立即切换前 9 个头像 |
| Q | 开启 StyleGAN 生成头像(按下即采样一个"从未存在过的人",每次按下换一个新面孔) |
| 0 | 切换头像显示开/关 |
| A / D | 上一个/下一个头像(按文件夹顺序) |
| W / S | 摄像头画面放大/缩小 |
| U / H / J / K | 平移摄像头画面:H-左、K-右、U-上、J-下,每次 5 像素;按住 Shift 则每次 1 像素 |
| Shift-Z | 重置摄像头缩放与平移 |
| Z / C | 调节头像目标叠加层(overlay)透明度 |
| X | 重置参考帧(以当前帧为新的驱动参考) |
| F | 切换参考帧自动搜索模式 |
| R | 镜像参考窗口 |
| T | 镜像输出窗口 |
| L | 重新加载头像列表(新增头像后无需重启) |
| I | 显示 FPS |
| O | 切换人脸检测叠加层 |
| ESC | 退出 |
七、驱动你的头像:对齐与参考帧原理
这是获得高质量动画效果的关键章节。官方文档给出的核心原则:
- 对齐:在
cam窗口中,尽可能让你的脸在比例和位置上与目标头像对齐。使用 W/S 缩放、U/H/J/K 平移来微调。对齐满意后按X,以当前帧作为参考帧(reference frame)来驱动后续整个动画。 - 表情匹配:使用图像叠加层(Z/C 键)或人脸检测叠加层(O 键)来尽量对齐你与头像的面部表情。
进阶:参考帧自动搜索(F 键)。手动对齐不理想时,可以按 F 让程序自动寻找更优的参考帧。代价是帧率会下降,但搜索期间你可以继续转动头部——当程序发现你的面部姿态与头像的匹配度高于当前参考帧时,预览窗口会闪烁绿色提示。屏幕上还会显示两个数字:第一个是你当前与头像的对齐程度,第二个是当前参考帧的对齐程度。让第一个数字尽量小,10 左右通常就是很好的对齐状态。完成后再按 F 退出搜索模式。
官方同时说明:不需要做到完全精确,某些非标准配置也可能取得更好效果,以上只是良好的起点。
从源码看,这一机制对应 afy/predictor_local.py 中的状态管理:start_frame/start_frame_kp记录参考帧及其关键点,set_source_image()通过kp_detector(FOMM 的关键点检测器)提取源图关键点kp_source,驱动过程中normalize_kp()计算kp_driving相对kp_driving_initial的位移差(kp_value_diff),叠加到源关键点上,并用源/驱动关键点凸包面积之比(ConvexHull(...).volume开方)做运动幅度自适应缩放——这正是--relative与--adapt_scale两个参数在推理层的具体实现,也是"参考帧对齐质量决定动画自然度"这一经验的数学根源。
八、配置视频会议软件
Avatarify 输出的是一个虚拟摄像头,因此任何允许更换视频输入源的会议软件都能接入(Zoom、Skype、Hangouts、Slack 等)。不同平台使用的虚拟摄像头名称不同:
| 平台 | 虚拟摄像头名称 |
|---|---|
| Linux | avatarify(v4l2loopback,card_label 即 "avatarify") |
| Mac | CamTwist(Desktop+ 捕获 avatarify 窗口) |
| Windows | OBS-Camera(OBS VirtualCam 插件) |
各主流软件的接入方式:
- Skype:设置 → 音频和视频,选择
avatarify(Linux)、CamTwist(Mac)或OBS-Camera(Windows)摄像头。 - Zoom:设置 → 视频,在 Camera 下拉菜单中选择对应虚拟摄像头。
- Teams:头像 → 设置 → 设备,在 Camera 下拉菜单中选择。
- Slack:发起通话,允许浏览器使用摄像头,点击设置图标,在 Video settings 下拉菜单中选择。
九、源码级原理:本地推理管线与远程传输
9.1 推理主程序与命令行参数
程序入口为 afy/cam_fomm.py,所有命令行参数在 afy/arguments.py 中集中定义,完整参数表如下(默认值均取自源码):
| 参数 | 默认值 | 说明 |
|---|---|---|
--config | 无 | FOMM 模型配置文件路径 |
--checkpoint | vox-cpk.pth.tar | 权重检查点路径(本地运行实为vox-adv-cpk.pth.tar) |
--relative | False(关闭) | 使用相对/绝对关键点坐标,run.sh 默认开启 |
--adapt_scale | False(关闭) | 基于关键点凸包自适应运动幅度,run.sh 默认开启 |
--no-pad | False | 不对输出图像做 padding |
--enc_downscale | 1.0 | 编码器输入下采样倍数,牺牲少量画质换取性能提升 |
--virt-cam | 0 | 虚拟摄像头设备 ID(Linux) |
--no-stream | False | Linux 下强制不输出视频流 |
--verbose | False | 打印额外调试信息 |
--hide-rect | False | 隐藏预览窗口中的辅助矩形 |
--avatars | ./avatars | 头像目录路径 |
--is-worker | False | 作为远程 GPU worker 进程运行 |
--is-client | False | 作为客户端运行 |
--in-port | 5557 | 远程 worker 输入端口 |
--out-port | 5558 | 远程 worker 输出端口 |
--in-addr | None | 入站消息 socket 地址,如example.com:5557 |
--out-addr | None | 出站消息 socket 地址,如example.com:5558 |
--jpg_quality | 95 | 视频帧 JPEG 压缩质量(远程传输用) |
源码中的校验逻辑值得注意:以--is-client启动时,必须同时提供--in-addr与--out-addr,否则直接抛出ValueError——这是远程模式下客户端与 worker 建立连接的强制约束。
9.2 模型加载与推理
afy/predictor_local.py 中的PredictorLocal类展示了完整的模型装配过程:
load_checkpoints()从 YAML 配置读取model_params,实例化 FOMM 的OcclusionAwareGenerator(遮挡感知生成器)与KPDetector(关键点检测器),再用检查点中的generator、kp_detector键加载权重并置为 eval 模式;- 设备选择逻辑为
device or ('cuda' if torch.cuda.is_available() else 'cpu')——与文档"无 NVIDIA GPU 自动回退 CPU"的描述一致; - 同时初始化
face_alignment.FaceAlignment(2D 关键点,flip_input=True)用于实时人脸姿态对齐与参考帧搜索打分(对应 F 键功能); - 输入图像经
to_tensor()归一化(/255、NCHW 布局)后送入kp_detector提取关键点。
9.3 摄像头选择与全局配置
仓库根目录的 config.yaml 控制摄像头枚举行为:
# how many cameras to query at the first start query_n_cams: 4 # camera configuration path cam_config: ./cam.yamlquery_n_cams: 4表示首次启动时最多探测 4 个摄像头设备;cam_config指向./cam.yaml(该文件由程序运行时生成/维护,用于持久化摄像头选择)。摄像头探测与多设备选择逻辑在 afy/camera_selector.py 与 afy/videocaptureasync.py 中实现,后者提供了异步视频帧读取封装,避免摄像头帧读取阻塞推理主循环。
9.4 远程模式网络架构
仓库通过afy/下多个模块实现了完整的远程 worker/client 架构:worker 端为 afy/predictor_worker.py,客户端为 afy/predictor_remote.py,底层通信基于 afy/networking.py 的 ZMQ(pyzmq)消息封装,帧数据经msgpack-numpy序列化、JPEG(--jpg_quality控制压缩比)编码后传输。这与 Dockerfile 暴露的 5557/5558 端口、arguments.py 的--in-port/--out-port/--in-addr/--out-addr参数形成闭环:远程 GPU 服务器以--is-worker监听 5557/5558,本地客户端以--is-client携带地址参数连接,笔记本因此可以完全不依赖本地 GPU。官方文档还提供了基于 ngrok/SSH 的公网隧道脚本(scripts/open_tunnel_ngrok.sh、scripts/open_tunnel_ssh.sh),用于打通云端 worker 与本机客户端的网络通道。
十、FAQ 精选
Q:运行 Avatarify 需要编程知识吗?A:不需要真正编程,但需要基本的命令行操作经验(Windows 用户可按官方视频教程操作)。
Q:为什么在我的 MacBook 上运行很慢?A:模型需要 CUDA 显卡执行重计算,MacBook 没有这类 GPU,只能回退到 CPU,算力不足以流畅运行。
Q:没有 NVIDIA GPU 能运行吗?A:能,但性能会骤降(<1 fps)。推荐改用 Google Colab 或远程 GPU 服务器的远程模式。
Q:如何添加新头像?A:把头像图片放入avatars文件夹即可(详见上文"添加自定义头像"一节)。
Q:头像看起来扭曲变形?A:需要校准面部位置,按上文"驱动你的头像"的对齐技巧操作(对齐后按 X 设置参考帧)。
Q:可以用在商业用途吗?A:不可以。Avatarify 与 First Order Motion Model 均采用 Creative Commons 非商业(Non-Commercial)许可,禁止商业使用。
Q:支持哪些视频会议软件?A:任何能更换视频输入源的软件都支持(Zoom、Skype、Hangouts、Slack 等),因为它本质是一个虚拟摄像头。
十一、卸载与故障排查
- 卸载:官方 Wiki 提供了完整的 Avatarify 及相关程序(v4l2loopback、OBS 插件等)移除指引。
- 故障排查:若程序崩溃,先在官方 Wiki 的 Troubleshooting 页面查找错误;找不到再检索项目 issues;仍无解可基于 issue 模板新建问题反馈。
结语
Avatarify Python 的价值在于把 First Order Motion Model 的研究成果封装成了普通人可用的实时视频会议工具:--relative+--adapt_scale的默认组合保证了自然的表情迁移,v4l2loopback / CamTwist / OBS-VirtualCam 三套虚拟摄像头方案覆盖了 Linux / Mac / Windows 全平台,而 ZMQ 远程架构则让无 GPU 用户也能通过云服务器获得流畅体验。本文所涉及的配置、脚本与源码均可直接在仓库中查阅验证,动手跑通一遍run.sh,再配合 X/F 键掌握参考帧技巧,你就能在下一场会议中以数字分身出场了。
【免费下载链接】avatarify-pythonAvatars for Zoom, Skype and other video-conferencing apps.项目地址: https://gitcode.com/gh_mirrors/ava/avatarify-python
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考