Voice-over

Beginner Last updated Jul 10, 2026

On this page

Every dialogue line, bark and idle bark can carry voice-over. The build’s resolve-audio stage synthesizes (or imports) one audio asset per line, per language, and the facial stage then bakes lip-sync from that audio (see Facial animation).

Providers

Three interchangeable providers, selected in the Voice/Build tabs:

ProviderWhat it isCost
ProvidedYou drop WAV files named after line ids under VO_Source/<culture>/
OmniVoiceA local HTTP TTS server; one-click Setup & Launch from the Voice tabfree, local
ElevenLabsCloud TTS with your API keyyour account

Nothing is bundled and nothing phones home: OmniVoice runs on your machine, ElevenLabs uses your key, and with Provided WAVs the plugin works fully offline.

Assigning voices

Voices are assigned per speaker and per language on the Voice tab: the same character can have an English voice and a differently-cast Russian voice. Audition a single line, regenerate one line, or batch-synthesize everything missing.

The Voice tab: provider selection and per-speaker voice assignments

Synthesis is idempotent: already-voiced lines are skipped on rebuild, changed lines are re-synthesized, and audio for deleted lines is pruned. Generated sound assets are named after the stable line ids (<Step>_<line>_<Speaker>), which is why ids must never be renumbered.

OmniVoice setup

OmniVoice is an open-source local TTS server: github.com/debpalash/OmniVoice-Studio. Clone or download that repository anywhere on your machine — the Studio takes it from there.

Point Repo path at the downloaded repository and press Setup & Launch (needed only if you haven’t started the server yourself beforehand — with an already-running server just leave the URL pointing at it). The button installs the dependencies and starts the server, handling the console-environment pitfalls that break a hand-rolled launch; the first run also downloads the ML models and can take several minutes with no output. Wait for the status line to turn green. If the server won’t start, check _qw_omnivoice.log next to the server files.

The OmniVoice section of the Voice tab: Repo path pointing at the cloned repository and the Setup & Launch button

With the server up, press Fetch voices to pull every speaker the server currently offers into the per-speaker voice dropdowns.

The Fetch voices button retrieves all available speakers from the running server

Need more variety? Open the Add preset dropdown, which lists the server’s curated voice presets, and pick the one you want — after the click it automatically appears as an option in your speakers’ voice dropdowns.

The Add preset dropdown: picking a preset makes it available as a voice option for your speakers

Where the configuration lives

The per-culture provider/model and per-speaker voice map are project settings: the Voice tab edits Project Settings → Plugins → Questwright Studio (BuildCultures, VoiceByCulture), stored in DefaultGame.ini so the whole team shares them. See the Settings reference.

API keys are never stored in project files. Keys live in a per-user ini (git-ignored) with an environment-variable fallback (QW_ELEVENLABS_KEY), which is safe for teams and CI.

Your own recordings

To use recorded VO, pick the Provided provider and drop WAVs named after line ids under VO_Source/<culture>/. Mixing is fine: synthesize placeholders with OmniVoice during production and swap in studio recordings later; the ids don’t change, so nothing else does.