Zura Qwen Voice Design
Invent a voice by describing it, no recording needed
- audio
Voice cloning needs a recording. Voice design needs a sentence. That's the gap this node fills: describe the speaker - age, accent, timbre, delivery - type your script, and get speech back in a voice that doesn't exist anywhere else. Ten languages, local weights, no hosted API.
The two ways people use it
Direct. Description in, finished speech out. Good for narration, temp tracks, and anything where "a warm British voice" is a fine enough brief.
As a reference factory. This is the more interesting use. Qwen designs a short passage, then LongCat-AudioDiT takes that generated recording plus its transcript and performs a completely different script in the same voice. Qwen's own limits are the reason: it does one generation per run with a 2048-token safety cap and no long-script chunking. LongCat chunks and joins. So you design the voice short, then speak the deliverable long.
Both routes ship as workflows in the pack (Zura_Voice_Design_Qwen_Direct.json, Zura_Voice_Design_Qwen_to_LongCat.json), and the doc's line about them is refreshing: "Choose by the result, not a forced model ranking." Neither is labelled an upgrade.
How it works
Same architecture as the LongCat node - a dedicated worker process in its own Python 3.11 environment, ComfyUI's models unloaded first, GPU released before the child starts. Which means Qwen and LongCat can both sit in one graph without their weights fighting for VRAM; the docs point out Qwen exits before LongCat runs.
For caching there's a nice touch: IS_CHANGED hashes the runtime config and the worker script, so within a Qwen→LongCat graph you can change LongCat's final script and Qwen's cached reference gets reused instead of regenerated. Change Qwen's seed if you want a new reference.
The node returns the float master samples, not the listening copy - deliberately, so a downstream clone gets the unprocessed signal. Both are on disk in the run folder anyway: voice.wav is the 24-bit PCM delivery copy, master_float32.wav is the untouched float, and script.txt, voice_description.txt, job.json, report.json and worker.log ride along. New folder per run, under output/zura_voice/.
Inputs and outputs
voice_description- multiline. "Describe the voice, accent, tone and delivery. These instructions are not spoken." Keep it to a sentence or two of concrete detail.script- multiline. "Only the words you want spoken. Start with a few sentences and verify all final words."language- English, Chinese, French, German, Italian, Japanese, Korean, Portuguese, Russian, Spanish.seed- default 147.project- an output label.audio-AUDIO, out to a preview or into LongCat's reference input.
Install
Install the pack, then run the design setup helper once:
cd ComfyUI/custom_nodes/ComfyUI_zura_nodes
python setup_voice_design.py --install
python setup_voice_design.py --check
It builds an isolated environment (default ~/ZuraVoiceDesign/.venv), stages the pinned weights in your shared Hugging Face cache, and writes qwen_voice_design.local.json. It pins qwen-tts 0.1.1, Torch 2.8.0 / CUDA 12.8, BF16, PyTorch SDPA - so no FlashAttention compile. CUDA with BF16 support is required.
The config file is machine-specific and excluded from the repo. Don't copy it between workstations; --root and ZURA_QWEN_VOICE_DESIGN_CONFIG exist for putting things elsewhere.
Common issues
"Qwen VoiceDesign failed: … See worker.log" - and then it prints the run directory. Go read worker.log. It's the actual error, unlike most node failures.
The description didn't take. You wrote prose about mood. Try concrete: "An adult British woman with a warm medium-low voice, a light rasp, clear diction and a calm conversational delivery." Accents and subjective qualities are requests, not guarantees - the docs say so outright.
The voice changed when you only edited the script. Expected, and documented: "Changing the script may also change speaker identity even with the same description and seed." If you need consistency, design once, keep the run folder, and clone from that WAV with LongCat from then on.
The end of a long script is mangled or missing. Direct Qwen makes one generation with a 2048-token cap and does not verify final words. Read the script out loud against the audio before you deliver it, and use the Qwen→LongCat route for anything long.
No new output folder. Fixed inputs can return a cached result. Change the seed for another take.
Rights. The Qwen3-TTS code and VoiceDesign checkpoint are Apache-2.0, LongCat's are MIT. Neither gives you the speaker's or the script's rights - that's your problem to solve, especially on client work.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| voice_description | STRING | Describe the voice, accent, tone and delivery. These instructions are not spoken. | |
| script | STRING | Only the words you want spoken. Start with a few sentences and verify all final words. | |
| language | COMBO | 10 options: English, Chinese, French, German, Italian, Japanese, +4 | |
| seed | INT | 1470–4294967295 | — |
| project | STRING | Designed_Voice | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |