Resumen
NAVA es un generador conjunto de audio y video de 6.3 B de parámetros que sintetiza video y audio sincronizados a partir de un único prompt. Maneja voz de múltiples hablantes con control de timbre de referencia y continuaciones condicionadas por imagen, todo dentro de un único modelo.
En lugar de torres duales alineadas post-hoc o pilas trimodales completamente unificadas, NAVA utiliza una arquitectura Align-then-Fuse MMDiT. Un espacio de alineación dedicado establece primero la correspondencia audio-video, luego el contexto se fusiona mediante cross-attention.
Aspectos destacados:
- Generación rápida de 720p en 1 min — audio-video sincronizado a 720p en ~1 minuto usando paralelismo de secuencia Ulysses con 8 GPUs.
- Audio de doble canal — audio estéreo (escena + voz) denoised conjuntamente con video, sin alineación de vocoder post-hoc.
- Control preciso de múltiples timbres — WAVs de referencia vinculados a tramos de habla
~~...para identidad de voz por hablante. - Control de cámara descrito mediante lenguaje — composición de plano, movimiento y ritmo directamente desde el prompt.
- Multiresolución — relaciones de aspecto horizontal/vertical/cuadrada desde el mismo checkpoint.
Arquitectura
NAVA materializa la Alineación Nativa Audio-Visual como una pila Align-then-Fuse MMDiT construida sobre la columna vertebral Wan2.2.
Capas de alineación jerárquica — 10 bloques double-stream. Video y audio mantienen proyecciones QKV y FFN separadas, pero comparten self-attention conjunta sobre [video_tokens; audio_tokens] concatenados, además de cross-attention dedicada al texto.
Esto construye un espacio de alineación donde la correspondencia AV se aprende sin interferencia del contexto semántico.
Capas de fusión unificada — 20 bloques single-stream. Video y audio comparten QKV/FFN; una atención conjunta unificada trata todos los tokens como un solo flujo, con una única ruta de cross-attention al texto. Aquí es donde ocurre el denoising condicionado por contexto.
Hiperparámetros clave: dim=3072, ffn_dim=14336, 24 cabezas de atención, 30 capas. 3D RoPE maneja video (temporal + altura + anchura), mientras que 1D RoPE maneja audio, aplicados conjuntamente dentro de la ruta de joint-attention.
Timbre-in-Context y CFG intermodal
Para escenas con múltiples hablantes, el Acondicionamiento Timbre-in-Context inyecta embeddings de hablante de referencia WAV (ReDimNet, 192‑d) a través de la vía de contexto.
Estos embeddings se vinculan a tramos de habla ~~..., permitiendo control de timbre por hablante.
En inferencia, CFG intermodal 3D aplica escalas independientes de classifier-free guidance para video, audio y la dirección de alineación intermodal (video_align_guidance_scale, audio_align_guidance_scale).
Esto mantiene la sincronización AV ajustada sin sacrificar la calidad de generación.
Lo que diferencia a NAVA de los modelos AV de código abierto existentes:
| Eje de diseño | Líneas base típicas | NAVA |
|---|---|---|
| Disposición de flujo | Torre dual (alineación post-hoc) o completamente unificado trimodal | Align-then-Fuse — primero espacio de alineación, contexto fusionado después |
| Control de voz | Solo subtítulos, sin timbre por hablante | Timbre-in-Context mediante WAVs de referencia |
| Presupuesto de parámetros | 10 B – 32 B | 6.3 B |
Evaluación — VerseBench y calidad de voz
NAVA logra la mejor sincronización AV, calidad de video y WER de audio en VerseBench, con el menor presupuesto de parámetros entre los modelos AV conjuntos.
| Modelo | Parámetros | Sync-C ↑ | Sync-D ↓ | Calidad de video ↑ | WER ↓ |
|---|---|---|---|---|---|
| Ovi 1.1 | 10 B | 7.4839 | 7.9791 | 0.636 | 0.102 |
| MOVA | 32 B | 7.2888 | 7.808 | 0.603 | 0.126 |
| Davinci | 15 B | 7.1487 | 7.8158 | 0.600 | 0.151 |
| LTX 2.3 | 19 B | 7.2476 | 7.6902 | 0.576 | 0.106 |
| NAVA | 6.3 B | 7.7914 | 7.5655 | 0.659 | 0.099 |
En Seed-TTS-eval, NAVA ofrece calidad de voz cercana a sistemas dedicados solo de audio, con 5.81 WER y 62.4 de similitud de hablante — muy por delante de otros modelos AV conjuntos como DreamID-Omni.
Datos rápidos y componentes
| Arquitectura | Align-then-Fuse MMDiT (columna vertebral Wan2.2) |
| Parámetros | 6.3 B |
| Resolución | 1280×704 (recomendado) · 960×960 compatible |
| Fotogramas / FPS | 37 fotogramas @ 24 fps ≈ 6 s · 55–61 fotogramas ≈ 9–10 s |
| Audio | 25 tokens latentes/s, ≤ 10 s |
| Muestreo | Flow matching · UniPC scheduler · 50 pasos por defecto |
| Precisión | bf16 |
| Paralelismo | GPU única o paralelismo de secuencia Ulysses (hasta 8 GPUs) |
Componentes incluidos: WanAVModel backbone (6.3 B), Wan2.2 Video VAE (causal 3D ConvNet, compresión 16×16×4), LTX Audio VAE + Vocoder (128 canales latentes, decodificador de forma de onda integrado), umt5-xxl Text Encoder, y ReDimNet speaker embedder.
Cómo usar — Inicio rápido
Después de la configuración, ejecuta uno de los scripts proporcionados:
bash scripts/inference.sh # T2AV general bash scripts/inference_timbre.sh # I2AV + control de timbre
Los resultados se guardan en eval_results/.
Configuración inicial:
git clone https://github.com/ernie-research/NAVA && cd NAVA pip install torch torchvision torchaudio pip install diffusers transformers accelerate safetensors einops scipy PyYAML tqdm sentencepiece pip install flash-attn --no-build-isolation huggingface-cli download --local-dir .
Lotes personalizados y reescritura de prompts
Escribe un archivo JSONL con un prompt por línea:
{"prompt": "一位男子在海边奔跑,镜头跟随。背景是海浪声和风声。"} {"prompt": "两人对话~~Hello~~Hi there", "spk_wavs": ["spk1.wav", "spk2.wav"]} {"prompt": "镜头跟随主体...", "image_path": "/abs/path/first_frame.png"}
Lanzar con torchrun (8 GPUs con Ulysses SP):
SETUPTOOLS_USE_DISTUTILS=stdlib torchrun \ --nnodes=1 --nproc_per_node=8 \ inference_nava.py \ --config configs/baseline_t2av_demo_mmdit_no_split_ltx_control_unipc.yaml \ --ckpt NAVA.ckpt --out_dir ./outputs \ --data_file my_prompts.jsonl \ --width 1280 --height 704 --frames 37 --fps 24 \ --steps 50 --save_sample --gen_turn 1 --use_sp
NAVA está entrenado con descripciones densas en chino.
Los prompts cortos o en inglés se benefician de una reescritura antes de la inferencia.
Se proporcionan tres vías: un servidor por lotes vLLM (< 2 s/prompt), un script local con transformers y un botón "Rewrite" en Gradio — todos usando Qwen3-4B-Thinking-2507, con los tramos ~~... conservados textualmente.



