Docker & Omniverse 动画管线工作流#

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

在此设置中,您将直接从 docker 容器本地运行微服务,以创建单个头像动画流实例。

工作流配置包含以下组件

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

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

  • Omniverse 渲染器 微服务:渲染器,用于可视化基于加载的头像场景的动画数据

  • Gstreamer 客户端:捕获并显示图像和音频流数据作为用户前端

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

先决条件#

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

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

  • 您已安装 Docker

  • 您有权访问 NVAIE,这是下载动画图和 Omniverse 渲染器微服务所必需的

  • 您有权访问公共 NGC 目录,这是下载头像配置器所必需的

硬件要求#

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

拉取 Docker 容器#

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

从 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 初始化失败的警告,请参阅故障排除部分

运行 Omniverse 渲染器微服务#

docker run --env IAORMS_RTP_NEGOTIATION_HOST_MOCKING_ENABLED=true --rm --gpus all --network=host --name renderer-ms -v <path-to-avatar-scene-folder>:/home/ace/asset nvcr.io/nvidia/ace/ia-omniverse-renderer-microservice:1.0.5

其中 <path-to-avatar-scene-folder> 应替换为本地头像场景文件夹。

注意

启动此服务可能需要长达 30 分钟。当您在终端中看到以下行时,它已准备就绪

[SceneLoader] Assets loaded

运行 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 手动容器部署和配置

设置和启动 Gstreamer#

我们将使用 Gstreamer 来捕获图像和音频输出流,以可视化头像场景。

安装 Gstreamer 插件

sudo apt-get install gstreamer1.0-plugins-bad gstreamer1.0-libav

在其自己的终端中运行视频接收器

gst-launch-1.0 -v udpsrc port=9020 caps="application/x-rtp" ! rtpjitterbuffer drop-on-latency=true latency=20 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! queue ! autovideosink sync=false

并在其自己的终端中运行音频接收器 (linux)

gst-launch-1.0 -v udpsrc port=9021 caps="application/x-rtp,clock-rate=16000" ! rtpjitterbuffer ! rtpL16depay ! audioconvert ! autoaudiosink sync=false

或者,如果您在 Windows 上运行音频接收器

gst-launch-1.0 -v udpsrc port=9021 caps="application/x-rtp,clock-rate=16000" ! rtpjitterbuffer ! rtpL16depay ! audioconvert ! directsoundsink sync=false

注意

在下一步添加流之前,不会显示图像或声音!

通过公共流 ID 连接微服务#

返回主终端,运行以下命令

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

注意

您现在应该看到头像渲染略微移动。

测试动画图接口#

让我们设置一个新的姿势

curl -X PUT -s http://127.0.0.1:8020/streams/$stream_id/animation_graphs/avatar/variables/posture_state/Talking

或更改头像的位置

curl -X PUT -s http://127.0.0.1:8020/streams/$stream_id/animation_graphs/avatar/variables/position_state/Left

或启动一个手势

curl -X PUT -s http://127.0.0.1:8020/streams/$stream_id/animation_graphs/avatar/variables/gesture_state/Pulling_Mime

或触发面部表情

curl -X PUT -s http://127.0.0.1:8020/streams/$stream_id/animation_graphs/avatar/variables/facial_gesture_state/Smile

或者,您可以使用 OpenAPI 接口查看和试用更多内容:http://127.0.0.1:8020/docs

您可以在此处找到所有有效的变量值:默认动画图

测试 Audio2Face-3D#

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

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

该脚本带有一个与 Audio2Face-3D 兼容的 示例音频文件。从 ACE repo 的 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 单声道格式。

更改头像场景#

要修改或切换默认头像场景,您可以使用头像配置器

下载并解压缩它,然后运行 ./run_avatar_configurator.sh 启动它。

../../_images/avatar_configurator.jpg

一旦成功启动(首次启动需要更长时间来编译着色器),您可以创建自定义的新场景并保存它。

然后复制文件夹 avatar_configurator/exported 中的所有文件,并替换步骤“从 NGC 下载头像场景”中的本地文件夹 avatar-scene-folder 中的文件。

重新启动动画图和 Omniverse 渲染器服务后,您将看到新场景。

清理:移除流#

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

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