Docker & Unreal 动画管线工作流#

Local docker workflow setup overview (1x Animation Graph microservice, 1x Unreal Renderer microservice, 1x Audio2Face-3D microservice).

在此设置中,您将在 Docker 容器中运行微服务,使用 Unreal Renderer 渲染头像,并在浏览器中查看它。

工作流配置包括以下组件

  • Audio2Face-3D 微服务:将语音音频转换为面部动画,包括口型同步

  • 动画图 微服务:管理和混合动画状态

  • Unreal Renderer 微服务:使用虚幻引擎 (UE) 可视化动画数据的渲染器

  • Unreal Engine Pixel Streaming 客户端:允许从浏览器查看动画

  • Coturn TURN 服务器:启用浏览器和 Unreal Renderer 微服务之间的 WebRTC 通信

  • 头像场景:3D 场景和头像模型数据的集合,保存在本地文件夹中

先决条件#

在开始之前,请确保已安装并检查了 开发设置 中的所有先决条件。

此外,本节假设满足以下先决条件

  • 您已安装 Docker

  • 您有权访问 NVAIE,这是下载动画图和 Unreal Renderer 微服务所必需的

您还需要将 Github 帐户链接到 EPIC games。为此,请执行以下操作

最后,此工作流程依赖于 Unreal Renderer 微服务,该服务目前仅作为抢先体验版提供。如果您尚未获得对此资源的访问权限,请联系您的 NVIDIA 客户经理。

硬件要求#

每个组件都有自己的硬件要求。工作流程的要求是其组件的总和。

本指南已在 Ubuntu 22.04 工作站上使用 NVIDIA GeForce RTX 3090 Ti GPU 进行测试,并将头像流式传输到 Windows 11 计算机上的 Chrome 129 浏览器。

创建目录#

本指南需要下载一些文件。我们建议创建一个空目录来存储它们。本文档中的命令假设您正在从此目录运行它们。

mkdir ~/docker-unreal
cd ~/docker-unreal

创建头像场景#

要创建自定义的 MetaHuman 头像,请按照 头像自定义 指南创建和构建 UE 项目。

构建新的 UE 项目后,将其上传到 ~/docker-unreal 中的 unreal-scene 目录中

mv <your_unreal_project>/linux ~/docker-unreal/unreal-scene

我们将在 运行 Unreal Renderer 微服务 部分运行渲染器时使用此项目。

拉取 Docker 容器#

docker pull nvcr.io/nvidia/ace/ia-animation-graph-microservice:1.0.2
docker pull nvcr.io/nvidia/ace/ia-unreal-renderer-microservice:0.1.1
docker pull nvcr.io/nvidia/ace/audio2face:1.0.11

启动 TURN 服务器#

需要 TURN 服务器以允许 Unreal Renderer 微服务通过 WebRTC 将数据流式传输到浏览器。

要启动 TURN 服务器,请将 TURN 和信令服务器 docker-compose 文件 下载到您的 ~/docker-unreal 目录。然后,打开一个新的终端并运行以下命令

cd ~/docker-unreal
UNREAL_ENGINE_RELEASE_SHORT=5.3 PUBLIC_IP=<CHANGE_WITH_YOUR_IP_ADDRESS> docker compose --file turn-and-signalling-server-docker-compose.yaml up --force-recreate

启动 TURN 服务器应该不超过几秒钟。当输出打印 TCP listener opened on : <SOME_IP>:<SOME_PORT>Http listening on *: 30080 时,TURN 服务器已准备就绪。

注意

如果您使用防火墙,则可能需要打开端口

sudo ufw allow 31720:31820/udp
sudo ufw allow 30080/tcp
sudo ufw allow 30080/udp
sudo ufw allow 8888/tcp
sudo ufw allow 8888/udp
sudo ufw allow 3478/tcp
sudo ufw allow 3478/udp

如果在运行这些镜像时收到 Permission Denied 错误,请查看 故障排除部分 的“EpicGames Docker 镜像的权限被拒绝”章节。

此时,您应该能够在 http://127.0.0.1:30080 看到像素流式传输 UI,并显示消息“单击以启动”。在此阶段单击此按钮将不起作用。请按照后续步骤流式传输头像。

A screenshot of the pixelstreaming web UI's initial screen, which contains a "Click to start" message.

像素流式传输初始屏幕。#

从 NGC 下载头像场景#

NGC 下载场景,并将其保存到您的主工作目录中的 default-avatar-scene_v1.0.0 目录中。

或者,您可以使用 ngc 命令下载场景。

ngc registry resource download-version "nvidia/ace/default-avatar-scene:1.0.0"

运行动画图微服务#

运行以下命令以启动动画图微服务。此服务管理头像的位置并使其动画化。

docker run -it --rm --gpus all --network=host --name anim-graph-ms -v $(pwd)/default-avatar-scene_v1.0.0:/home/ace/asset nvcr.io/nvidia/ace/ia-animation-graph-microservice:1.0.2

从您看到日志行 app ready 的那一刻起,该服务就已启动并运行。

注意

如果您遇到关于 glfw 初始化失败的警告,请参阅 故障排除部分

运行 Unreal Renderer 微服务#

docker run --env IAUEMS_ANIM_SOURCE_HOST=<CHANGE_WITH_YOUR_IP_ADDRESS> --env IAUEMS_ANIM_SOURCE_PORT=51000 --env IAUEMS_RESOURCE_DOWNLOAD_DESTINATION="/home/unreal-renderer" \
  -v $(pwd)/unreal-scene:/home/unreal-renderer/unrealEngineProject \
  --rm --gpus all --network=host --name renderer-ms --runtime=nvidia  nvcr.io/nvidia/ace/ia-unreal-renderer-microservice:0.1.1

注意

现在您应该在 http://127.0.0.1:30080 看到一个轻微移动的头像渲染,如下所示。如果 UI 卡在“WebRTC Connection Negotiated”

  1. 确保您使用的 PUBLIC_IP 可以从您的 Linux 工作站和运行浏览器的计算机访问。如果您在专用网络 (VPN) 中,则可能并非如此。如果是这种情况,请使用专用 IP 地址重新启动渲染器和 TURN 服务器。

  2. 查看 故障排除部分 的“Glfw 警告”章节。

A screenshot of the Pixel Streaming UI rendering an avatar

运行 Audio2Face-3D 微服务#

运行以下命令以运行 Audio2Face-3D

docker run --rm --network=host -it --gpus all nvcr.io/nvidia/ace/audio2face:1.0.11

生成 TRT 模型

./service/generate_trt_model.py built-in claire_v1.3
./service/generate_a2e_trt_model.py

service/a2f_config.yaml 中,确保将 grpc_output 下的 IP(默认为 0.0.0.0)设置为您的系统 IP。

nano service/a2f_config.yaml

启动服务

./service/launch_service.py service/a2f_config.yaml

当服务准备就绪时,会出现以下日志行

[2024-04-23 12:44:33.066] [  global  ] [info] Running...

注意

有关 Audio2Face-3D 部署的更多详细信息,请参见 A2F-3D NIM 手动容器部署和配置

创建流 ID#

返回主终端,运行以下命令以生成新的流 ID,并在动画图和 Unreal Renderer 微服务中创建它

stream_id=$(uuidgen)
curl -X POST -s http://127.0.0.1:8020/streams/$stream_id
curl -s -X POST http://127.0.0.1:8021/streams/$stream_id -d ""

测试 Audio2Face-3D#

现在让我们使用一个示例音频文件,将其馈送到 Audio2Face-3D 以驱动面部说话动画。

通常,您将通过 gRPC API 将音频发送到 Audio2Face-3D。为了方便起见,一个 Python 脚本允许您通过命令行执行此操作。克隆 ACE 代码库,并按照 设置脚本的步骤 进行操作。

该脚本附带一个与 Audio2Face-3D 兼容的 示例音频文件。从 ACE 代码库的 microservices/audio_2_face_microservice/scripts/audio2face_in_animation_pipeline_validation_app 目录中,运行以下命令将示例音频文件发送到 Audio2Face-3D

python3 validate.py -u 127.0.0.1:50000 -i $stream_id ../../example_audio/Mark_joy.wav

注意

Audio2Face-3D 要求音频为 16KHz、单声道格式。

在此阶段,您应该看到头像的嘴唇在动,并听到它说出音频文件中的句子。

清理:删除流#

您可以使用以下命令清理流

curl -X DELETE -s http://127.0.0.1:8020/streams/$stream_id
curl -X DELETE -s http://127.0.0.1:8021/streams/$stream_id