Skip to main content

AI voice & lipsync

The voice pipeline produces character speech audio plus the matching facial / blendshape animation in one orchestrated pass. Three components ship in 1.0:

  • ElevenLabs — leading TTS provider (BYOK).
  • NVIDIA Audio2Face — high-quality blendshape-driving from audio (local SDK or cloud).
  • uLipSync — fast viseme-based lipsync, fully local, OSS (MIT, absorbed).

Tool family: voice_* — 40 tools.

When to use which​

NeedUse
Hero dialogue, photoreal facialAudio2Face
NPC chatter, mobile targetuLipSync
One voice, many linesElevenLabs + Audio2Face
Offline, no API budgetSentis-local TTS + uLipSync

You can mix — most projects use ElevenLabs for the voice and uLipSync at runtime for cheap viseme matching, with Audio2Face baked offline for cinematics.

A round-trip in chat​

Generate dialogue for the Wizard NPC saying "I have foreseen your arrival, traveler".
Voice should be old, gravelly. Drive the Wizard's blendshapes with the audio.
Save as Assets/Audio/Wizard_Line_001.wav and Assets/Animations/Wizard_Line_001.anim.

The voice-author specialist:

  1. voice_elevenlabs_generate --voice old_gravelly_male --text "..." → produces Wizard_Line_001.wav
  2. voice_audio2face_drive --audio Wizard_Line_001.wav --target Wizard.HeadRig → produces blendshape animation curves
  3. animation_clip_save --path Assets/Animations/Wizard_Line_001.anim

Total time: 15-60 seconds depending on dialogue length.

ElevenLabs​

Wire your ElevenLabs API key under Settings → Providers → ElevenLabs. Buril supports:

  • All v1/v2 voices (preset + cloned).
  • SSML mark-up for emphasis, pauses, prosody.
  • Streaming generation (for long dialogue, audio plays as it's generated).

Tools:

ToolPurpose
voice_elevenlabs_generateText → audio
voice_elevenlabs_list_voicesEnumerate available voices
voice_elevenlabs_clone_voiceClone a new voice from sample audio (requires Creator tier or higher)
voice_elevenlabs_dubTranslate + voice-match an existing audio clip

Costs are pay-per-character. The bridge does not throttle — you set quota limits on the ElevenLabs side.

NVIDIA Audio2Face​

Audio2Face ships in two forms:

  • Local SDK — requires an Omniverse install and an RTX GPU. Best quality, no per-call cost after install.
  • Cloud (Audio2Face-3D) — NVIDIA's hosted API, BYOK, pay-per-second of audio.

Buril picks the cloud path by default if a key is configured, falling back to local SDK if you've configured BURIL_AUDIO2FACE_LOCAL_PATH. To force one mode:

voice_audio2face_drive
audio: <path>
target: <rig>
mode: cloud # or "local"

The output is blendshape curves matching Audio2Face's standard 52-shape ARKit-style topology. If your character's rig uses different shape names, Buril retargets via the voice_a2f_retarget_blendshapes tool.

uLipSync (local, free)​

uLipSync is an MIT-licensed Unity package that does viseme-based lipsync at runtime. The source is absorbed under Editor/Tools/Voice/uLipSync/ and ships in 1.0 without a separate install.

  • Runs at runtime (not edit-time), so it's the only option for procedural dialogue.
  • Maps audio amplitude + formant features to one of 5 visemes (AEIOU + closed-mouth).
  • Mobile-friendly: less than 1ms CPU per character per frame.

Configure on a character:

voice_ulipsync_install --character Wizard.HeadRig
voice_ulipsync_bind_audio_source --audio AudioSource_Dialogue

After install, uLipSync drives blendshapes automatically whenever the bound AudioSource plays.

Sentis-local TTS​

For fully offline workflows (no ElevenLabs key, no internet), Buril ships a Sentis-based local TTS. Quality is lower than ElevenLabs — fine for prototyping, generally not ship-quality.

voice_sentis_local_generate
text: "..."
voice: default

Model weights (~400 MB) download on first call to Library/BurilCache/voice/sentis/.

Lipsync at scale​

For projects with hundreds of NPC lines, the production pattern is:

  1. Generate all audio with ElevenLabs (offline / pre-production).
  2. Bake Audio2Face animation clips for all hero lines.
  3. Use uLipSync at runtime for ambient / barked NPC lines that share an AudioSource.

The bridge has a batch tool voice_pipeline_batch that walks a CSV of lines and produces audio + animation per row, with checkpointing so a failed mid-run can resume.

Common issues​

SymptomFix
Voice sounds roboticElevenLabs voice picked too "stable". Set stability: 0.3, style: 0.6 for more variation.
Audio2Face output flatAudio is too quiet or noisy. Normalize first: audio_normalize_lufs --target -16 LUFS.
uLipSync mouth twitchesAudio source has too much background noise. Add voice_ulipsync_set_threshold to a higher floor.
Sentis model download slowFirst-run only. Cached at Library/BurilCache/voice/sentis/.