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

在此设置中,您将在 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 模型数据的集合,保存在本地文件夹中
先决条件#
在开始之前,请确保已安装并检查了开发环境设置中的所有先决条件。
此外,本节假设满足以下先决条件
注意
请注意,
minikube
和microk8s
版本1.29
和1.30
已报告驱动程序问题。如果您遇到错误Cuda failure: CUDA driver version is insufficient for CUDA runtime version
,请考虑切换到microk8s 1.24
,经验证该版本可以工作。
您还需要将 Github 帐户链接到 EPIC games。为此,请执行以下操作
创建一个 Github 帐户(如果您还没有)
创建一个 Epic Games 帐户(如果您还没有)
使用 GitHub 容器注册表进行身份验证,并记下您的访问令牌
最后,此工作流程依赖于 Unreal Renderer Microservice,目前仅作为 Early Access 提供。如果您尚未获得此资源的访问权限,请联系您的 NVIDIA 客户经理。
硬件要求#
每个组件都有自己的硬件要求。工作流程的要求是其组件的总和。
Audio2Face-3D 微服务
Animation Graph 微服务
Unreal Renderer 微服务
创建 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