Qwen3 TTS · Text to Speech
Narration with tone instructions that actually do something
- audio
- task id
ComfyUI's audio layer is thin and bolted on - the KB's audio doc puts it plainly: the community had nothing to say about sound until video got good enough to want a soundtrack. If you want a voice for a clip you've just generated, the local options are real and decent (Chatterbox, Kokoro, F5-TTS), but you're installing a node pack with its own dependency stack for each one. This node is the other route: Alibaba's Qwen3 TTS, running on SpicyAPI's servers, returning a ComfyUI AUDIO value you can pipe straight into a save node or a lip-sync stage.
What makes it interesting against the local TTS crowd isn't the voice quality - it's the instructions field. You can tell it how to read the line in plain language, and that's the thing most local ComfyUI TTS stacks hand you sliders or nothing for. Qwen3 TTS is a name people actually use rather than some reseller's rebrand, and it's sourced from the Qwen line rather than a tiny research project that vanishes in six months.
The inputs
text- the words, exactly as written. Billed per 1,000 characters with a 100-character minimum, so there's no free soundcheck.voice_id- nine presets, defaultSerena. Each one has a fixed character; there's no cloning here, so if you need a specific person's voice, this isn't the node.instructions- "read it like a bored museum guide", "slow and warm", "excited, but understated". Not spoken, and not billed, which means you can iterate on delivery for free as long as you're re-running the same text.language- defaults toauto, which detects it from the text. Set it explicitly when you're mixing languages or want the model to commit to one reading.
The outputs
audio, an AUDIO socket, and task id. One thing that surprises people: if the service returns several clips, the node packs them into a batch, so Save Audio writes one file per clip rather than one file with everything glued together. Feed audio into Save Audio, or into video-audio nodes for talkies and lip-sync work.
You get a 24 kHz mono MP3 back.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart ComfyUI - nothing else to install, no model weights, no GPU. Add a key from spicyapi.ai/console/keys under Settings > SpicyAPI, restart once so the catalogue loads from your account, and you're done. Headless servers can use SPICY_API_KEY instead of the settings panel.
Keeping the bill small
This one has a different cost shape from the image nodes: per character, not per output. Which gives you an easy, cheap workflow that the video nodes don't have -
- Paste two sentences, pick a voice, write the instructions, and iterate on delivery. The text is small, so the runs are cheap.
- Only once the voice and tone are locked, swap in the full script.
If you do it the other way round - full 3,000-character script, then start adjusting tone - you pay for the whole thing on every attempt. And yes, the instructions field is free, so there's no reason to be stingy with direction there.
Set Max cost per run under Settings > SpicyAPI anyway. A long script pasted by accident is exactly the kind of thing that setting exists to catch. Note the node quotes every run before submitting, so you'll see a number before anything is charged, and the failure modes are the pack-wide ones: no key gives you No SpicyAPI key is set, an unverified email gives 40310. Cancelling a run stops the wait, not the job - it finishes server-side and is billed if it succeeds.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | The words to be spoken, exactly as written. Billed per 1,000 characters, minimum 100. | |
| voice_id | COMBO | Serena | Preset voice. Each has a fixed character. |
| instructions | STRING | How to read the text: tone, emotion or pace. Not spoken and not billed. | |
| language | COMBO | auto | Language of the reading. auto detects it from the text. |
| seed | INT | 00–2147483647 | This model takes no seed, so the number is never sent. Changing it makes ComfyUI run the node again: set 'control after generate' to randomize for a new result on every run; every run is billed. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | Several results come back as a batch; Save Audio writes one file each. |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |