Official implementation of ARDY: Autoregressive Diffusion with Hybrid Representation for Interactive Human Motion Generation (SIGGRAPH 2026).
884
stars
1
commits
Python
primary language
Jul 10, 2026
updated
ARDY is an autoregressive diffusion model designed for interactive motion generation, supporting online text prompting and flexible long-horizon kinematic constraints (root paths/waypoints, full-body keyframes, and sparse joint positions/rotations) with real-time responsiveness.
This repo provides code, checkpoints, and demos to work with the pre-trained ARDY models introduced in the SIGGRAPH paper.
This repo has mainly been tested on Ubuntu Linux 22.04 with RTX 4090, nvidia-driver-575, and Python 3.11.
In a fresh Python 3.10+ environment (conda or venv), first install a build of PyTorch (>= 2.4) that matches your machine's CUDA, then install ARDY in editable mode with all optional features:
conda create -n ardy python=3.11 -y
conda activate ardy
# Install PyTorch for your CUDA version first — see https://pytorch.org/get-started/locally/
# For example:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126
pip install -e ".[all]"
torch>=2.4, so installing PyTorch yourself first lets you pick the CUDA build that matches your GPU/driver. The ARDY install then keeps the compatible PyTorch you already have rather than pulling a default wheel.sudo apt install cmake build-essential on Ubuntu).pip install -e . — core model inference onlypip install -e ".[demo]" — adds the interactive demo (viser, gradio)pip install -e ".[trt]" — adds TensorRT acceleration[trt] extra requires an NVIDIA driver >= 525 (CUDA 12-capable — the CUDA runtime itself is bundled via pip) and access to pypi.nvidia.com during install. On setups that don't meet these requirements, install .[demo] instead and select a non-TensorRT acceleration mode in the demo.The text encoder relies on the gated meta-llama/Meta-Llama-3-8B-Instruct model, which requires:
After you receive access to the Llama repo, create an access token in Hugging Face token settings, then either log in on the command line:
hf auth login
or paste the token in ~/.cache/huggingface/token. If you do not have hf installed, install it first:
pip install --upgrade huggingface_hub
ARDY checkpoints are available trained on various skeletons with differing FPS and prediction horizon length.
Note: models will be downloaded automatically when used in the demo, so there is no need to download them manually
| Model | Skeleton | Training Data | FPS | Horizon | Release Date | Hugging Face | License |
|---|---|---|---|---|---|---|---|
| ARDY-Core-RP-20FPS-Horizon40 | Core | Bones Rigplay 1 | 20 | 40 | July 10, 2026 | Link | NVIDIA Open Model |
| ARDY-Core-RP-20FPS-Horizon8 | Core | Bones Rigplay 1 | 20 | 8 | July 10, 2026 | Link | NVIDIA Open Model |
| ARDY-G1-RP-25FPS-Horizon52 | Unitree G1 | Bones Rigplay 1 | 25 | 52 | July 10, 2026 | Link | NVIDIA Open Model |
| ARDY-G1-RP-25FPS-Horizon8 | Unitree G1 | Bones Rigplay 1 | 25 | 8 | July 10, 2026 | Link | NVIDIA Open Model |
Coming soon! We are working to train a version of ARDY on Rigplay 1 with the SOMA body model skeleton.
Downloading data is only required for running the kinematically constrained generation demos.
Bones SEED motion data: The kinematically constrained generation demo samples constraints from motion sequences in the Bones SEED dataset. The motion data are provided in CSV format for G1. Corresponding text descriptions are retrieved from the metadata CSV during sampling.
Please download the Bones SEED dataset and put them under the datasets/bones-seed/ directory in the root of the repo. The directory structure should be as follows:
datasets/bones-seed/
g1/csv/
metadata/
seed_metadata_v004.csv
We provide an interactive demo that enables real-time humanoid character control through a combination of streaming text prompts and interactive spatial constraints. Below are some features of the interactive demo:
python scripts/run_demo.py
If you plan to be frequently re-launching the demo, it can be helpful to launch the text encoder API service in the background. This way, the demo will not need to instantiate the text encoder every time it is launched. In a separate terminal, run:
python scripts/run_text_encoder_server.py
http://localhost:2333. You can use Left-drag to rotate, Right-drag to pan, and Scroll to zoom to control the camera with mouse.Space key or click Play button to start/stop playing the motion.p to enable waypoint mode (or click the Enable Waypoint Mode checkbox in the Waypoint folder under Generate tab), then click in the viewport to place waypoints for locomotion control.t key to enable target-velocity control. Use arrow keys to steer: left/right rotate the direction; up/down increase or decrease the speed.z key to sample kinematic constraints from a dataset sequence specified in Motion file path (in the Constraints folder under Generate tab). Use the constraint-type checkboxes to control which categories are sampled.More detailed information about the interactive demo is available in the GUI Reference section.
| Key | Action |
|---|---|
| Space | Toggle play/pause |
| j | Previous frame |
| k | Next frame |
| r | Reset automatic camera to follow current frame |
| t | Toggle target velocity control and arrow key overlay |
| p | Toggle waypoint control mode |
| z | Sample kinematic constraints from specified motion file |
| Arrow keys | Control target velocity direction/speed (when target velocity control is enabled) |
| h | Show / hide keyboard shortcut overlay |
datasets/bones-seed/. The kinematic constraints will be sampled from this motion file.datasets/bones-seed/ matching the loaded skeleton and populate the Motion file path field.z): If pressed, the kinematic constraints will be sampled from the specified motion file. Note that the kinematic constraints sampling only supports the G1 skeleton which is included in the Bones Seed dataset.p): toggle mouse-click-based waypoint control modecuda / bfloat16 (default, fastest, ~14 GB VRAM), cuda / float32 (VRAM demanding), cpu / bfloat16, cpu / float32 (slower prompt encoding but requires less VRAM).The interactive demo is a good reference for how ARDY can be used autoregressively for realtime applications. The key entry points are:
load_model() resolves a checkpoint, builds the model, and attaches the LLM2Vec text encoder (built separately via load_text_encoder() so it can be reused across models). Models are referenced by nickname — a skeleton name ("core", "g1", "soma", resolving to that skeleton's default horizon) or skeleton+horizon ("core8", "g152", "soma60") — or by full name ("ARDY-Core-RP-20FPS-Horizon40"); see ardy/model/registry.py. The demo wires this up in ModelLoadingMixin.load_model.Ardy.autoregressive_step() — text embeddings and optional kinematic constraints (motion_mask/observed_motion) in, motion frames out. See it called each step in GenerationMixin._generate_step, which shows how to encode the text prompt, assemble history + constraint masks, and decode the output back to joint positions with motion_rep.inverse(...).For non-interactive / batch generation, scripts/generate.py generates motion from a text prompt and writes it to disk (.npz; plus a MuJoCo-qpos .csv for G1). Generated files are written to the outputs/ folder by default.
# Simplest: 5s of motion with the default model, written to outputs/output.npz
python scripts/generate.py "A person walks in a circle."
# Choose a model + length, and fix the seed for reproducible output (writes outputs/jump.npz)
python scripts/generate.py "A person jumps." --model core --duration 8.0 --seed 0 --output jump
# Multiple samples (writes a folder outputs/waves/ with waves_00.npz, waves_01.npz, ...)
python scripts/generate.py "A person waves." --model g1 --num_samples 4 --output waves
Each .npz contains the generated motion — posed_joints (world-space joint positions, [T, J, 3]), local/global joint rotations, root positions, and foot contacts — plus the fps and the prompt text.
To play back a generated motion in the browser (same viser viewport as the interactive demo), use scripts/visualize.py:
python scripts/visualize.py outputs/output.npz # single file
python scripts/visualize.py outputs/waves # folder written with --num_samples > 1
then open http://localhost:2334. The skeleton (core / g1 / soma) is detected from the file; the viewer offers play/pause, a frame slider, mesh/skeleton toggles, and a sample dropdown for multi-sample folders.
Most useful flags:
| Flag | Meaning |
|---|---|
--model | Model nickname core/g1 (optionally with horizon, e.g. core8) or full folder name. Default: core. |
--duration | Length in seconds (default 5.0). |
--num_samples | Number of samples; when >1, writes a numbered folder. |
--seed | Fix the random seed for reproducible output. |
--output | Output stem (single sample → one file; multiple → a folder). Bare names go under outputs/; pass a path (e.g. results/jump) to write elsewhere. |
--history_frames | History visible to each autoregressive step. Default: the longest history fitting the model's trained 10s window — keep it unless you want faster prompt adaptation. |
--constraints | Path to a saved kinematic-constraint list. |
--no-postprocess | Don't apply motion post-processing to reduce foot skating and hit constraints. |
Tip: if you generate repeatedly, start the standalone text-encoder service in the background first (
python scripts/run_text_encoder_server.py) so each run connects to it instead of loading the LLM2Vec model in-process every time.
ARDY is closely related to several works from NVIDIA on humanoid motion and control:
If you use this code in your research, please cite:
@article{zhao2026ardy,
title = {ARDY: Autoregressive Diffusion with Hybrid Representation for Interactive Human Motion Generation},
author = {Zhao, Kaifeng and Petrovich, Mathis and Zhang, Haotian and Wang, Tingwu and Tang, Siyu and Rempe, Davis},
journal = {ACM Transactions on Graphics (TOG)},
year = {2026},
volume = {45},
number = {4},
articleno = {86},
doi = {10.1145/3811284}
}
This codebase is licensed under Apache-2.0. Note that model checkpoints and data are licensed separately as indicated on the HuggingFace download pages.
This project will download and install additional third-party open source software projects. Review the license terms of these open source projects before use.
This project builds upon excellent open-source projects:
For questions or issues, please open an issue on this repository or reach out directly to the authors.
1 commits
Python
74.1%
C++
25.4%
Official implementation of ARDY: Autoregressive Diffusion with Hybrid Representation for Interactive Human Motion Generation (SIGGRAPH 2026).
884
stars
1
commits
Python
primary language
Jul 10, 2026
updated
ARDY is an autoregressive diffusion model designed for interactive motion generation, supporting online text prompting and flexible long-horizon kinematic constraints (root paths/waypoints, full-body keyframes, and sparse joint positions/rotations) with real-time responsiveness.
This repo provides code, checkpoints, and demos to work with the pre-trained ARDY models introduced in the SIGGRAPH paper.
This repo has mainly been tested on Ubuntu Linux 22.04 with RTX 4090, nvidia-driver-575, and Python 3.11.
In a fresh Python 3.10+ environment (conda or venv), first install a build of PyTorch (>= 2.4) that matches your machine's CUDA, then install ARDY in editable mode with all optional features:
conda create -n ardy python=3.11 -y
conda activate ardy
# Install PyTorch for your CUDA version first — see https://pytorch.org/get-started/locally/
# For example:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126
pip install -e ".[all]"
torch>=2.4, so installing PyTorch yourself first lets you pick the CUDA build that matches your GPU/driver. The ARDY install then keeps the compatible PyTorch you already have rather than pulling a default wheel.sudo apt install cmake build-essential on Ubuntu).pip install -e . — core model inference onlypip install -e ".[demo]" — adds the interactive demo (viser, gradio)pip install -e ".[trt]" — adds TensorRT acceleration[trt] extra requires an NVIDIA driver >= 525 (CUDA 12-capable — the CUDA runtime itself is bundled via pip) and access to pypi.nvidia.com during install. On setups that don't meet these requirements, install .[demo] instead and select a non-TensorRT acceleration mode in the demo.The text encoder relies on the gated meta-llama/Meta-Llama-3-8B-Instruct model, which requires:
After you receive access to the Llama repo, create an access token in Hugging Face token settings, then either log in on the command line:
hf auth login
or paste the token in ~/.cache/huggingface/token. If you do not have hf installed, install it first:
pip install --upgrade huggingface_hub
ARDY checkpoints are available trained on various skeletons with differing FPS and prediction horizon length.
Note: models will be downloaded automatically when used in the demo, so there is no need to download them manually
| Model | Skeleton | Training Data | FPS | Horizon | Release Date | Hugging Face | License |
|---|---|---|---|---|---|---|---|
| ARDY-Core-RP-20FPS-Horizon40 | Core | Bones Rigplay 1 | 20 | 40 | July 10, 2026 | Link | NVIDIA Open Model |
| ARDY-Core-RP-20FPS-Horizon8 | Core | Bones Rigplay 1 | 20 | 8 | July 10, 2026 | Link | NVIDIA Open Model |
| ARDY-G1-RP-25FPS-Horizon52 | Unitree G1 | Bones Rigplay 1 | 25 | 52 | July 10, 2026 | Link | NVIDIA Open Model |
| ARDY-G1-RP-25FPS-Horizon8 | Unitree G1 | Bones Rigplay 1 | 25 | 8 | July 10, 2026 | Link | NVIDIA Open Model |
Coming soon! We are working to train a version of ARDY on Rigplay 1 with the SOMA body model skeleton.
Downloading data is only required for running the kinematically constrained generation demos.
Bones SEED motion data: The kinematically constrained generation demo samples constraints from motion sequences in the Bones SEED dataset. The motion data are provided in CSV format for G1. Corresponding text descriptions are retrieved from the metadata CSV during sampling.
Please download the Bones SEED dataset and put them under the datasets/bones-seed/ directory in the root of the repo. The directory structure should be as follows:
datasets/bones-seed/
g1/csv/
metadata/
seed_metadata_v004.csv
We provide an interactive demo that enables real-time humanoid character control through a combination of streaming text prompts and interactive spatial constraints. Below are some features of the interactive demo:
python scripts/run_demo.py
If you plan to be frequently re-launching the demo, it can be helpful to launch the text encoder API service in the background. This way, the demo will not need to instantiate the text encoder every time it is launched. In a separate terminal, run:
python scripts/run_text_encoder_server.py
http://localhost:2333. You can use Left-drag to rotate, Right-drag to pan, and Scroll to zoom to control the camera with mouse.Space key or click Play button to start/stop playing the motion.p to enable waypoint mode (or click the Enable Waypoint Mode checkbox in the Waypoint folder under Generate tab), then click in the viewport to place waypoints for locomotion control.t key to enable target-velocity control. Use arrow keys to steer: left/right rotate the direction; up/down increase or decrease the speed.z key to sample kinematic constraints from a dataset sequence specified in Motion file path (in the Constraints folder under Generate tab). Use the constraint-type checkboxes to control which categories are sampled.More detailed information about the interactive demo is available in the GUI Reference section.
| Key | Action |
|---|---|
| Space | Toggle play/pause |
| j | Previous frame |
| k | Next frame |
| r | Reset automatic camera to follow current frame |
| t | Toggle target velocity control and arrow key overlay |
| p | Toggle waypoint control mode |
| z | Sample kinematic constraints from specified motion file |
| Arrow keys | Control target velocity direction/speed (when target velocity control is enabled) |
| h | Show / hide keyboard shortcut overlay |
datasets/bones-seed/. The kinematic constraints will be sampled from this motion file.datasets/bones-seed/ matching the loaded skeleton and populate the Motion file path field.z): If pressed, the kinematic constraints will be sampled from the specified motion file. Note that the kinematic constraints sampling only supports the G1 skeleton which is included in the Bones Seed dataset.p): toggle mouse-click-based waypoint control modecuda / bfloat16 (default, fastest, ~14 GB VRAM), cuda / float32 (VRAM demanding), cpu / bfloat16, cpu / float32 (slower prompt encoding but requires less VRAM).The interactive demo is a good reference for how ARDY can be used autoregressively for realtime applications. The key entry points are:
load_model() resolves a checkpoint, builds the model, and attaches the LLM2Vec text encoder (built separately via load_text_encoder() so it can be reused across models). Models are referenced by nickname — a skeleton name ("core", "g1", "soma", resolving to that skeleton's default horizon) or skeleton+horizon ("core8", "g152", "soma60") — or by full name ("ARDY-Core-RP-20FPS-Horizon40"); see ardy/model/registry.py. The demo wires this up in ModelLoadingMixin.load_model.Ardy.autoregressive_step() — text embeddings and optional kinematic constraints (motion_mask/observed_motion) in, motion frames out. See it called each step in GenerationMixin._generate_step, which shows how to encode the text prompt, assemble history + constraint masks, and decode the output back to joint positions with motion_rep.inverse(...).For non-interactive / batch generation, scripts/generate.py generates motion from a text prompt and writes it to disk (.npz; plus a MuJoCo-qpos .csv for G1). Generated files are written to the outputs/ folder by default.
# Simplest: 5s of motion with the default model, written to outputs/output.npz
python scripts/generate.py "A person walks in a circle."
# Choose a model + length, and fix the seed for reproducible output (writes outputs/jump.npz)
python scripts/generate.py "A person jumps." --model core --duration 8.0 --seed 0 --output jump
# Multiple samples (writes a folder outputs/waves/ with waves_00.npz, waves_01.npz, ...)
python scripts/generate.py "A person waves." --model g1 --num_samples 4 --output waves
Each .npz contains the generated motion — posed_joints (world-space joint positions, [T, J, 3]), local/global joint rotations, root positions, and foot contacts — plus the fps and the prompt text.
To play back a generated motion in the browser (same viser viewport as the interactive demo), use scripts/visualize.py:
python scripts/visualize.py outputs/output.npz # single file
python scripts/visualize.py outputs/waves # folder written with --num_samples > 1
then open http://localhost:2334. The skeleton (core / g1 / soma) is detected from the file; the viewer offers play/pause, a frame slider, mesh/skeleton toggles, and a sample dropdown for multi-sample folders.
Most useful flags:
| Flag | Meaning |
|---|---|
--model | Model nickname core/g1 (optionally with horizon, e.g. core8) or full folder name. Default: core. |
--duration | Length in seconds (default 5.0). |
--num_samples | Number of samples; when >1, writes a numbered folder. |
--seed | Fix the random seed for reproducible output. |
--output | Output stem (single sample → one file; multiple → a folder). Bare names go under outputs/; pass a path (e.g. results/jump) to write elsewhere. |
--history_frames | History visible to each autoregressive step. Default: the longest history fitting the model's trained 10s window — keep it unless you want faster prompt adaptation. |
--constraints | Path to a saved kinematic-constraint list. |
--no-postprocess | Don't apply motion post-processing to reduce foot skating and hit constraints. |
Tip: if you generate repeatedly, start the standalone text-encoder service in the background first (
python scripts/run_text_encoder_server.py) so each run connects to it instead of loading the LLM2Vec model in-process every time.
ARDY is closely related to several works from NVIDIA on humanoid motion and control:
If you use this code in your research, please cite:
@article{zhao2026ardy,
title = {ARDY: Autoregressive Diffusion with Hybrid Representation for Interactive Human Motion Generation},
author = {Zhao, Kaifeng and Petrovich, Mathis and Zhang, Haotian and Wang, Tingwu and Tang, Siyu and Rempe, Davis},
journal = {ACM Transactions on Graphics (TOG)},
year = {2026},
volume = {45},
number = {4},
articleno = {86},
doi = {10.1145/3811284}
}
This codebase is licensed under Apache-2.0. Note that model checkpoints and data are licensed separately as indicated on the HuggingFace download pages.
This project will download and install additional third-party open source software projects. Review the license terms of these open source projects before use.
This project builds upon excellent open-source projects:
For questions or issues, please open an issue on this repository or reach out directly to the authors.
1 commits
Python
74.1%
C++
25.4%