Docker & Unreal 动画管线工作流#

在此设置中,您将在 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。为此,请执行以下操作
创建一个 Github 帐户(如果您还没有)
创建一个 Epic Games 帐户(如果您还没有)
使用 GitHub Container Registry 进行身份验证 并记下您的访问令牌
最后,此工作流程依赖于 Unreal Renderer 微服务,该服务目前仅作为抢先体验版提供。如果您尚未获得对此资源的访问权限,请联系您的 NVIDIA 客户经理。
硬件要求#
每个组件都有自己的硬件要求。工作流程的要求是其组件的总和。
Audio2Face-3D 微服务
动画图 微服务
Unreal Renderer 微服务
本指南已在 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,并显示消息“单击以启动”。在此阶段单击此按钮将不起作用。请按照后续步骤流式传输头像。

像素流式传输初始屏幕。#
从 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”
确保您使用的
PUBLIC_IP
可以从您的 Linux 工作站和运行浏览器的计算机访问。如果您在专用网络 (VPN) 中,则可能并非如此。如果是这种情况,请使用专用 IP 地址重新启动渲染器和 TURN 服务器。查看 故障排除部分 的“Glfw 警告”章节。

运行 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