Qwen3-TTS 1.7B CustomVoice
Give Your Video a Voice It Didn't Have
- speech
- audioSettings
- audio
Here's a workflow gap you've probably felt: you generate a video, and then... silence. Qwen3-TTS 1.7B CustomVoice is the node that fixes that. It's Alibaba's text-to-speech model, and the "CustomVoice" in the name is the whole point - this isn't the robotic default TTS voice, it's the one where you supply the voice and it speaks your script in it. In ComfyUI terms: text and a voice go in, an AUDIO clip comes out, and you can wire that into a video node's audio track and finally get your voiceover.
The "1.7B" and "CustomVoice" tell you the architecture: a ~1.7B parameter model that can clone or adapt to a supplied voice. This is the kind of model that would otherwise be a whole separate toolchain - voice preprocessing, a TTS server, an audio pipeline - compressed into one node.
What you set
The required input is speech - a RUNWARE_SPEECH socket, which comes from the pack's speech builder node under Runware/Params. That's where you put the text to be spoken (and, for CustomVoice, the voice reference). Then:
- audioSettings - a
RUNWARE_AUDIOSETTINGSsocket from the pack's audio-settings builder: sample rate, format, that kind of thing. Only touch it if you have a downstream format constraint. - positivePrompt - an optional style or emotion hint. The tooltip's example says it all: "Speak with great enthusiasm." This is where you push the delivery, not the words.
- settings.maxNewTokens - the audio output token cap (default 2048). The tooltip carries a real warning: higher values allow longer audio but risk hangs. If you're synthesizing a long script, don't just crank this to the moon - keep it in the range the model comfortably handles and split long scripts into segments instead.
- numberResults - up to 4 variations.
Output is one audio - an AUDIO type that wires into the video/audio nodes that accept it (or a preview/save node). outputFormat gives you MP3/WAV/FLAC/OGG.
Where it fits
The obvious build is a full pipeline: Qwen3-TTS generates the narration, a video node (any of this pack's Veo/Wan/Grok nodes) generates the visuals, and you mux them. It also stands alone nicely for podcast clips, character voice lines, or audiobook-style reads. Because it's a cloud call, you don't need a TTS runtime locally - the model lives on Runware's side.
Install and gotchas
Standard pack install:
cd ComfyUI/custom_nodes
git clone https://github.com/Runware/ComfyUI-Runware
pip install -r ComfyUI-Runware/requirements.txt
Restart, or install "Runware" from ComfyUI Manager; API key in Settings → Runware API key or RUNWARE_API_KEY. The pack's requirements include soundfile specifically so audio comes back as a native AUDIO type - no FFmpeg needed.
The shared gotchas: every run bills the account (title bar shows cost), and the maxNewTokens hang warning is the one beginners hit - a script too long for the cap will stall or truncate rather than gracefully extend, so chunk it. Also remember this is Alibaba's hosted TTS; there are no open weights here, which is exactly why the node exists.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| speech | RUNWARE_SPEECH | — | |
| audioSettingsopt | RUNWARE_AUDIOSETTINGS | — | |
| positivePromptopt | STRING | Optional style or emotion hint for the voice. Example: 'Speak with great enthusiasm'. | |
| numberResultsopt | INT | 11–4 | Number of results to generate. Each result uses a different seed, producing variations of the same parameters. |
| settings.maxNewTokensopt | INT | 2048 | Audio output token cap. Higher values allow longer audio but risk hangs. |
| ttlopt | BOOLEAN | false | Enable to set ttl. Off uses the model's default. |
| ttl_valueopt | INT | 60 | Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`. |
| outputFormatopt | COMBO | MP3 | File format for the generated audio. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |