Piper TTS
Offline voiceover in ComfyUI, no API key required
- audio_path
You've built the ComfyUI video, and now you want a narrator. You do not want an ElevenLabs bill, an API key, or a cloud round-trip in the middle of a local pipeline. That's the exact gap this node fills: one node, type text, pick a voice, and it renders speech to a WAV on your disk, fully offline, using Piper - the same lightweight TTS engine Home Assistant has shipped for years.
It's not the fanciest TTS in the world. It's the boring, reliable, multilingual one, and for a voiceover track that's usually exactly what you want. If you're chaining this into a Wav2Lip or LivePortrait talking-head workflow, or just want a narration track to drop into a video, Piper gets you 80% of the way there with zero drama.
How it works
Under the hood it's Piper's ONNX pipeline: a small neural TTS model (typically 20–60 MB) renders your text into a WAV right on your CPU or GPU via onnxruntime. The pack ships a voices.json manifest of 82 voices across dozens of languages - de_DE-thorsten, en_US-lessac, ca_ES-upc_ona, and so on - and on the first use of any voice it auto-downloads the matching {voice}-{quality}.onnx plus its .onnx.json config from Hugging Face into ComfyUI/models/piper_tts/.
That on-demand download is the key behavior to understand: first use needs internet, every run after that is fully offline. The node is an output node (OUTPUT_NODE), so ComfyUI shows an audio preview right on the canvas - you'll hear the result without hunting for the file.
The inputs that matter
Only three, and only two you'll actually touch:
- text - a multiline string. The thing to say. Empty text raises an error, so don't wire in an empty string by accident.
- voice - a dropdown of 82 voices. Voices are named
language_code-speaker, and the list spans something like forty languages, so it doubles as a surprisingly decent polyglot narrator. - quality -
high/medium/low, defaulting tohigh.
Here's the trap, and it bites everyone once: only 5 of the 82 voices actually have a high tier. Most top out at medium (55 of them), and the rest are low or x_low. Leave the default high on a voice that doesn't have it and the node throws {voice}-high does not exist and tells you to check Piper's VOICES.md. Pick medium first for any voice you don't know; it's the sweet spot between size and clarity.
The single output is audio_path - a STRING with the full filesystem path to the WAV, saved to ComfyUI/output/piper_tts/. That's what you wire into whatever comes next. One quirk worth knowing: the filename is built from your text (first 60 characters, sanitized), so running the same text twice overwrites the same file. Same script twice in one workflow → one WAV on disk.
Installing it
Easiest path: ComfyUI Manager → search "ComfyUI PiperTTS" → install, restart, done.
Manual route, from the README:
cd ComfyUI/custom_nodes
git clone https://github.com/yuvraj108c/ComfyUI-PiperTTS
cd ComfyUI-PiperTTS
pip install -r requirements.txt
Then restart ComfyUI. Dependencies are piper-tts, onnxruntime-gpu, httpx, and tqdm. The onnxruntime-gpu pin is the one to eyeball if you're on a box without a working CUDA setup - Piper is light enough that it runs fine on CPU, so if that wheel gives you grief you can swap it for plain onnxruntime in requirements. No manual model download; that's handled on first use.
Common issues
- "
{voice}-{quality}does not exist" - the quality trap above. Switch tomediumor check VOICES.md for what the voice actually offers. - First run seems hung - it's downloading a 20–60 MB model; watch the console for the
tqdmprogress bar, not the canvas. - Same output name every time - expected, see the filename note above.
- No audio preview - the WAV still landed in
ComfyUI/output/piper_tts/, so check there.
If you outgrow Piper's voices and want higher-fidelity TTS in the same offline niche, look at Kokoro-onnx - prettier, but hungrier. For "give me a clean narration track in two seconds," this node is still the one I'd reach for.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | — | |
| voice | COMBO | 82 options: ca_ES-upc_ona, ca_ES-upc_pau, cs_CZ-jirka, da_DK-talesyntese, de_DE-eva_k, de_DE-karlsson, +76 | |
| quality | COMBO | high | 3 options: high, medium, low |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio_path | STRING | — |