ComfyUI Node

Piper TTS

Offline voiceover in ComfyUI, no API key required

By yuvraj108c·Created 2 years ago·Updated 2 years ago· 31
Piper TTS
    • audio_path
    text
    voice
    qualityhigh

    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 to high.

    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 to medium or 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 tqdm progress 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.

    CategoryPiperTTS

    Inputs (3)

    NameTypeDefaultDescription
    textSTRING
    voiceCOMBO82 options: ca_ES-upc_ona, ca_ES-upc_pau, cs_CZ-jirka, da_DK-talesyntese, de_DE-eva_k, de_DE-karlsson, +76
    qualityCOMBOhigh3 options: high, medium, low

    Outputs (1)

    NameTypeDescription
    audio_pathSTRING