APZmedia: Custom Voice Generate
Eight built-in speakers and zero cloning — the fastest path to audio
- model
- audio
Sometimes you don't want to design a voice or clone anyone's - you just want a competent speaker to read your line. APZmedia: Custom Voice Generate is that node. It uses the CustomVoice variant of Qwen3-TTS, which ships with a set of baked-in preset speakers (Ryan, Vivian, Ethan, Luna, Alex, Aria, Dylan, Nova) that you pick from a dropdown. No reference clip, no transcript, no embedding - pick a speaker, type text, run.
This is the pack's "fast and good enough" path, and it's also the cheapest one: the model loader lets you grab the 0.6B CustomVoice variant, which is noticeably lighter on VRAM than the 1.7B voice-design models and perfectly fine for dialog. If you're doing lots of short lines for a video or a game prototype, a 0.6B CustomVoice model plus this node is a genuinely pleasant setup - you can leave it resident and iterate without watching your VRAM counter sweat.
The inputs
- speaker_preset - the dropdown. Defaults to Ryan. The eighth entry is
Other (type below), which hands off to the next input. - speaker_name - optional. Fill this in (only used when the preset is set to "Other") if the speaker you want isn't in the list. It's a straight pass-through to Qwen's own preset table, so if you know the model has a name that isn't in the pack's dropdown, type it here.
- instruct - optional emotion or style direction, like "Very happy" or "Speak in a calm and serious tone." The tooltip is the author's own framing: this is where you push a preset speaker off its default delivery. Empty string means neutral.
- text, language, seed - the line, the language (English default, ten more, or Auto), and reproducibility.
The model socket must be a CustomVoice model - the node checks the model ID and throws a clear error if you feed it a VoiceDesign or Base model, so if you see "Model must be a CustomVoice model," that's the fix.
Output is a single audio socket in standard ComfyUI AUDIO format (24000 Hz), so it wires straight into PreviewAudio, the pack's Audio Saver, or any native audio node.
Where it fits
Think of the three generation paths as a ladder. Voice Design Generate lets you describe a voice from nothing but text - most flexible, most compute. Voice Clone Generate needs an existing voice to imitate. Custom Voice Generate sits in the middle: no description needed, no identity to manage, just a speaker catalog. It's the one you'd reach for when the voice just needs to be fine.
Gotchas
The preset list is hard-coded to "Known preset speakers as of Qwen3-TTS 0.1.x" in the source, so don't assume the dropdown is exhaustive - that's exactly what speaker_name is for. And if you pick a preset that doesn't exist in the model's own table, you'll get an error at generation time rather than a graceful fallback, so when in doubt, stick to the names the dropdown offers.
Install is the standard pack clone: git clone https://github.com/APZmedia/ComfyUI-APZmedia-qwen-TTS into custom_nodes, restart, and the model downloads on first use. The usual caveat applies - don't pip-install a second torch into your ComfyUI venv to satisfy anything; the pack wants the torch you already have.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| model | QWEN_TTS_MODEL | — | |
| text | STRING | Hello, this is a test line. | — |
| speaker_preset | COMBO | Ryan | Select a preset speaker. Choose 'Other' and fill speaker_name below for unlisted names. |
| language | COMBO | English | 11 options: English, Chinese, Japanese, Korean, German, French, +5 |
| instruct | STRING | Optional emotion/style direction, e.g. 'Very happy' or 'Speak in a calm and serious tone'. | |
| seed | INT | 00–2147483647 | — |
| speaker_nameopt | STRING | Override speaker_preset with a custom name (used when preset is 'Other (type below)'). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |