Soprano TTS
The TTS node that narrates your renders before you finish blinking
- audio
ComfyUI is finally getting good at audio, and this is one of the friendliest on-ramps. Soprano TTS drops a real text-to-speech model into your graph - no API key, no cloud service, no second machine. You type a sentence, hit run, and a few hundred milliseconds later there's a waveform and a little audio player sitting right on the node. It's the rare custom node where the first run feels like it's showing off.
Under the hood it's a wrapper around Soprano, an 80M-parameter model by Eugene Kwok that got a genuinely warm reception on r/StableDiffusion when it dropped. Soprano is a tiny language model that spits out audio tokens, plus a vocoder-based decoder (Vocos-inspired) that turns those tokens into 32kHz audio far faster than the diffusion-based decoders most TTS models use. It also generates sentence-by-sentence and stitches the results, which keeps long text fast. The base model hits up to 2000x real-time with its fancy lmdeploy backend; this node runs the transformers backend at a still-absurd ~100-200x real-time, and the README is refreshingly honest about that trade.
The clever part is the install. Soprano officially wants PyTorch 2.8+, which would nuke your ComfyUI (2.5.1) the moment pip resolved dependencies - the classic custom-node dependency hell, except this pack shipped a way out. You install soprano-tts --no-deps so the problematic lmdeploy dependency never lands, and the included soprano_compat.py stubs out torch.compiler.disable so the model runs fine on older PyTorch. It's a small, thoughtful compatibility layer that more packs should copy.
The inputs that actually matter
The node has 11 inputs, but you'll touch about five. text is the star - a multiline box; 2-15 second sentences work best, and spell out numbers ("one plus one" instead of "1+1") because special characters confuse it. temperature (default 0.3, range 0-2) is your consistency dial: lower it toward 0.2 if output sounds mushy or weird. top_p (0.95) and repetition_penalty (1.2) are standard sampling knobs - leave them alone until something's wrong. seed is a lie in the best way: it's not used for generation at all, it just forces ComfyUI to re-run the node so you can regenerate. Change it to hear a new take.
The rest are file plumbing. filename_prefix defaults to audio/soprano_tts under your output folder; format switches wav/mp3/flac/ogg; bitrate only applies to compressed formats. keep_model_loaded keeps the ~80M model warm in VRAM for fast repeat runs - off by default, and fine to leave off unless you're batching a lot of lines. save and autoplay do what they say.
Output
One output, audio, of type AUDIO - the standard ComfyUI {waveform, sample_rate} dict at 32kHz. Wire it into any audio node for saving, mixing, or muxing with a video you just rendered. That's the real killer use case: narrate an image-to-video result, or add a voiceover to an animated workflow, all locally.
Install
Via ComfyUI Manager, search "ComfyUI-Soprano-TTS" and install - or:
cd ComfyUI/custom_nodes
git clone https://github.com/SanDiegoDude/ComfyUI-Soprano-TTS
Then the manual step, which is the whole ballgame:
pip install soprano-tts --no-deps
pip install unidecode
Don't skip the --no-deps. If you install soprano-tts normally, pip upgrades PyTorch and ComfyUI dies with ImportError: undefined symbol: ncclMemFree. First run downloads the ~500MB Soprano-80M model from HuggingFace. Want mp3/flac/ogg export? You need ffmpeg on the system and pip install pydub.
Troubleshooting
- "No module named 'soprano'" - you cloned the repo but never ran the pip steps. Run them.
- ComfyUI won't start after installing - you got the full PyTorch upgrade. Uninstall
lmdeploy torch tritonand reinstall PyTorch 2.5.1 (the README has the exact commands). - Rough audio - drop temperature to 0.2, spell out numbers, keep sentences in range.
- Node missing from the menu - restart ComfyUI fully; check the console for import errors.
It's not a voice-cloning or multilingual tool - no streaming either, thanks to the transformers backend - but for fast, natural local narration, it's the one I'd reach for.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | Hello! I am Soprano, an ultra-lightweight text to speech model. | — |
| temperature | FLOAT | 0.300–2 | — |
| top_p | FLOAT | 0.950–1 | — |
| repetition_penalty | FLOAT | 1.201–2 | — |
| seed | INT | -1-1–2147483647 | — |
| keep_model_loaded | BOOLEAN | false | — |
| filename_prefix | STRING | audio/soprano_tts | — |
| format | COMBO | wav | 4 options: wav, mp3, flac, ogg |
| bitrate | COMBO | 320k | 5 options: 128k, 192k, 256k, 320k, VBR |
| save | BOOLEAN | true | — |
| autoplay | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |