Kubernetes & Unreal 动画管线工作流程#

Kubernetes workflow setup overview (1x Animation Graph microservice, 1x Omniverse Renderer microservice, 1x Audio2Face-3D microservice).

在此设置中,您将在 Kubernetes 集群中运行微服务,使用 Unreal Renderer 渲染 avatar 并在浏览器中查看。

工作流程配置包含以下组件

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

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

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

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

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

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

先决条件#

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

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

  • 您有一个可用的 Kubernetes 集群

  • 您已安装 Kubectl

  • 您已安装 Helm

  • 您有权访问 NVAIE,这是下载相关微服务所必需的

注意

  • 请注意,minikubemicrok8s 版本 1.291.30 已报告驱动程序问题。如果您遇到错误 Cuda failure: CUDA driver version is insufficient for CUDA runtime version,请考虑切换到 microk8s 1.24,经验证该版本可以工作。

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

最后,此工作流程依赖于 Unreal Renderer Microservice,目前仅作为 Early Access 提供。如果您尚未获得此资源的访问权限,请联系您的 NVIDIA 客户经理。

硬件要求#

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

创建 Avatar 场景#

要创建自定义 MetaHuman avatar,请按照Avatar 自定义指南创建和构建 UE 项目。

如何调整质量/可扩展性设置小节中,您还可以找到有关如何将其上传到 NGC 以及如何更新 UCS 应用程序以指向您的新资源的信息。

下载 UCS 应用程序文件#

下载以下文件并将它们放在一个空的 ucs_apps 目录中

animation_pipeline_with_unreal_renderer_params.yaml 文件中,使用您自己的 IP 地址更新 unreal-renderer.signallingServer.peerConnectionOptions.iceServers.urls 字段(hostname -I 将显示您的 IP 地址)。

配置资源下载器#

Unreal Renderer 微服务使用 Unreal 项目以及可选的打包 MetaHuman 和场景文件。默认情况下,UCS 应用程序配置微服务以从 NGC 下载 avatar 场景。但是,还有其他下载资源的方法,您还可以创建自己的资源下载器 init 容器,如资源下载器部分所述。

构建 UCS 应用程序#

rm -rf _build/animation_pipeline*
ucf_app_builder_cli app build ucs_apps/animation_pipeline_with_unreal_renderer.yaml ucs_apps/animation_pipeline_with_unreal_renderer_params.yaml -o _build/animation_pipeline

启动 TURN 服务器#

需要 TURN 服务器以允许 Unreal Renderer 微服务通过 WebRTC 将数据流式传输到浏览器。TURN 服务器必须在 Kubernetes 外部运行,因为它需要可以从微服务和浏览器访问。

要启动 TURN 服务器,请下载 TURN 服务器 docker-compose 文件注意:这与 Docker & Unreal 工作流程中的 docker compose 文件不同)到您的工作目录。然后,打开一个新的终端并运行以下命令

PUBLIC_IP=<CHANGE_WITH_YOUR_IP_ADDRESS> docker compose --file turn-server-docker-compose.yaml up turnserver --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 映像的权限被拒绝”章节。

部署 UCS 应用程序#

name=animation-pipeline
namespace=$name

kubectl create namespace $namespace
kubectl create secret docker-registry ngc-docker-reg-secret --docker-server=nvcr.io --docker-username='$oauthtoken' --docker-password=$NGC_CLI_API_KEY -n $namespace
kubectl create secret generic ngc-api-key-secret --from-literal=NGC_CLI_API_KEY=$NGC_CLI_API_KEY -n $namespace

从先决条件部分设置 Github 凭据

GITHUB_USERNAME=<CHANGE_WITH_YOUR_GITHUB_USERNAME>
GITHUB_ACCESS_TOKEN=<CHANGE_WITH_YOUR_GITHUB_ACCESS_TOKEN> # see Prerequisites section

kubectl create secret docker-registry ghcr-docker-reg-secret --docker-server=ghcr.io --docker-username=$GITHUB_USERNAME --docker-password=$GITHUB_ACCESS_TOKEN -n $namespace

并开始部署

helm upgrade --install --cleanup-on-fail --namespace $namespace $name _build/animation_pipeline/ -f _build/animation_pipeline/values.yaml -f ucs_apps/animation_pipeline_with_unreal_renderer_values.yaml

检查 pod 状态

watch kubectl get pods -n $namespace

启动所有 pod 将需要长达 30 分钟。您需要等到它们都指示为就绪状态。

准备流式传输#

创建流

stream_id=$(uuidgen)
kubectl exec -n $namespace -c ms ia-animation-graph-microservice-deployment-0 -- curl -X POST -s http://127.0.0.1:8020/streams/$stream_id
kubectl exec -n $namespace -c signalling ia-unreal-renderer-microservice-deployment-0 -- curl -s -X POST http://127.0.0.1:8021/streams/$stream_id -d ""

如果成功,此命令的输出应包含“OK”和“Stream ID successfully created!”。

然后,在日志中验证是否存在 Output animation data | Stream ID: <stream_id>

kubectl logs -n $namespace -c ms ia-animation-graph-microservice-deployment-0

此时,您应该能够在浏览器中通过 http://<CHANGE_WITH_YOUR_IP>:30080 查看 avatar。

测试 Audio2Face-3D#

在单独的选项卡中,激活端口转发

kubectl port-forward -n $namespace a2f-with-emotion-a2f-deployment-XXX 50010:50010
kubectl port-forward -n $namespace ia-animation-graph-microservice-deployment-0 8020:8020

请注意,Audio2Face-3D pod 具有随机后缀,必须在上述命令中进行调整。

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

通常,您将通过 gRPC API 将音频发送到 Audio2Face-3D。为了方便起见,python 脚本允许您通过命令行执行此操作。按照设置脚本的步骤操作。

该脚本附带一个与 Audio2Face-3D 兼容的 示例音频文件。运行以下命令以将示例音频文件发送到 Audio2Face-3D

注意

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

python3 validate.py -u 127.0.0.1:50010 -i $stream_id Mark_joy.wav

清理:删除流#

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

kubectl exec -n $namespace -c ms ia-animation-graph-microservice-deployment-0 -- curl -X DELETE -s http://127.0.0.1:8020/streams/$stream_id
kubectl exec -n $namespace -c signalling ia-unreal-renderer-microservice-deployment-0 -- curl -X DELETE -s http://127.0.0.1:8021/streams/$stream_id