Nodes/ComfyUI-KittenTTS/KittenTTS Sampler
ComfyUI Node

KittenTTS Sampler

Type a sentence, get speech at 24kHz, no GPU required

By neverbiasu·Created about a year ago·Updated about a year ago· 9
KittenTTS Sampler
  • tts_model
  • AUDIO
text
voiceexpr-voice-5-m
speed1.00

This is the node that makes your text audible. The KittenTTS Sampler takes a sentence, a voice, and a speed, and hands back a standard ComfyUI AUDIO socket you can save or mix into a video. It's the second half of the ComfyUI-KittenTTS pair: the KittenTTS Loader fetches the model, this node does the talking.

Where does it sit in the TTS landscape? Audio generation is the thinnest layer of ComfyUI - it's a bolt-on ecosystem of small node packs, not core functionality - and inside that, this pack is the deliberately tiny corner. It runs a ~24MB ONNX model (KittenML/kitten-tts-nano-0.1, Apache-2.0) that works on CPU, needs no API key, and speaks entirely offline. If Kokoro is "best voice per unit of compute," Kitten TTS Nano is "a voice per almost no compute." Quality-tier engines like Chatterbox or F5-TTS sound better but want a GPU and gigabytes of weights. For throwing a quick narration into a test workflow on a laptop, this is the zero-friction option.

How it works

Under the hood it's a clean little front-end + ONNX pipeline. Your text gets phonemized to IPA-ish tokens via eSpeak NG (US English), cleaned into a symbol-ID sequence with start/end tokens, then pushed through the ONNX session with a style vector pulled from voices.npz by voice name, plus a speed scalar. The raw audio is trimmed on both ends, reshaped to [1, 1, T], and returned at 24000 Hz wrapped in the standard ComfyUI audio dict - {"waveform": Tensor[B,C,T], "sample_rate": int}. That dict shape is exactly what core SaveAudio and the various AUDIO-consuming video nodes expect, so it drops into existing workflows without an adapter.

The inputs that matter

You only really touch a few of these:

  • tts_model - the MODEL socket from KittenTTSLoader. Wire it in and forget it.
  • text - the line to speak. Multiline, so full paragraphs work. An empty or whitespace-only string raises an error, so don't leave the default blank.
  • voice - a dropdown of eight preset voices: expr-voice-2 through expr-voice-5, each in male/female (m/f). Default is expr-voice-5-m. There's no cloning here; the "expr" voices are small baked-in styles.
  • speed - a float from 0.5 to 2.0 in 0.05 steps, default 1.0. 0.5 is half-speed drawl, 2.0 is auctioneer. The pack's own example workflow runs expr-voice-3-f at 1.25, which is a decent starting point for narration.

The output

  • AUDIO - the standard ComfyUI audio dict at 24000 Hz. Wire it into SaveAudio (core) to write a WAV, or into any node that takes an AUDIO input if you're adding a voice track to a video you generated.

Install

Same steps as its sibling - search ComfyUI-KittenTTS in ComfyUI Manager, or:

cd ComfyUI/custom_nodes
git clone https://github.com/neverbiasu/ComfyUI-KittenTTS
cd ComfyUI-KittenTTS
pip install -r requirements.txt

The one system requirement that bites people: eSpeak NG must be installed and its bin folder on PATH (e.g. sudo apt install espeak-ng on Debian/Ubuntu, the release installer on Windows), then restart ComfyUI. This pack's Python deps - onnxruntime, misaki, espeakng_loader, spacy, num2words, soundfile, huggingface_hub - install into ComfyUI's Python, so run it in the environment you actually use.

Common issues

  • Phonemizer/eSpeak errors. The classic. eSpeak NG missing or not on PATH. Install it, restart ComfyUI. Because the loader builds the phonemizer at load time, you may see this before you even touch this node.
  • It sounds rough. Set expectations. When Kitten TTS Nano was announced on r/StableDiffusion, the feedback was honest: some samples came out "distorted, noisy and as if speaking through a paper sheet." This is a lightweight novelty voice, not a Chatterbox or ElevenLabs replacement. Great for quick test audio, bad for anything with a real audience.
  • English only. The phonemizer is hardcoded to US English. Numbers get expanded (that's what num2words is for), but don't feed it your French or Japanese script.
  • Downstream AUDIO errors. If a consumer node complains, check it expects the standard dict - this node outputs [1,1,T] at 24000 Hz, which is what well-behaved ComfyUI audio nodes want.
Categoryaudio/tts

Inputs (4)

NameTypeDefaultDescription
tts_modelMODEL
textSTRING
voiceCOMBOexpr-voice-5-m8 options: expr-voice-2-m, expr-voice-2-f, expr-voice-3-m, expr-voice-3-f, expr-voice-4-m, expr-voice-4-f, +2
speedFLOAT1.000.5–2

Outputs (1)

NameTypeDescription
AUDIOAUDIO