Orpheus TTS (LM Studio)
Natural-sounding speech in ComfyUI, without the two-minute waits
- audio
Text-to-speech inside ComfyUI is usually a sad little corner. Most TTS nodes are either cloud-keyed, painfully slow, or both. This one is different: it runs the Orpheus 3B model through LM Studio and decodes the audio itself, and the author's whole pitch is that it's fast - about 0.5x realtime on an RTX 3090, meaning a 15-second clip takes roughly 30 seconds. For local TTS that's actually decent. The catch is the setup: it doesn't ship the model, and it depends on LM Studio being up and serving on its own. Get past that and you've got genuinely expressive, natural voices with emotion tags, no API key, no cloud.
How it works
Orpheus is a small Llama-style model fine-tuned to emit audio tokens instead of words. This node doesn't reimplement any of that - it hands the whole inference job to LM Studio, which runs the GGUF quant and serves it on localhost. The node formats your text as <|audio|>{voice}: {text}<|eot_id|>, streams the model's <custom_token_N> output over LM Studio's API, then maps each token ID back through the Orpheus codebook layout.
Here's the clever bit: decoding tokens to sound uses SNAC, a neural audio codec, and the node runs that in a separate worker thread. Audio tokens stream in from LM Studio while the SNAC decoder crunches the previous batch at the same time, so the UI doesn't freeze and the progress bar reflects the slower of the two paths. Output is 24 kHz mono PCM, handed to ComfyUI as a standard AUDIO tensor.
Two things get downloaded on first run: SNAC's weights (hubertsiuzdak/snac_24khz, small) pull from Hugging Face automatically, and the Orpheus model itself you fetch inside LM Studio. If the model never emits audio tokens, the node quietly returns 100ms of silence - so a "successful" run with no sound means something upstream is wrong.
The inputs that matter
Only a few deserve your attention:
- text - what you want spoken. Orpheus understands emotion tags like
<chuckle>and<sigh>right in the text; the default shows the trick. - voice - one of the eight built-in English voices:
tara,leah,jess,leo,dan,mia,zac,zoe. No cloning here, you pick a preset. - model_key - paste the path-like identifier shown at the top of LM Studio's server window (e.g.
orpheus-3b-0.1-ft). Leave it blank and it uses whatever model LM Studio currently has loaded. - temperature (0.6), top_p (0.9), repeat_penalty (1.1) - standard LLM knobs. Drop temperature if you want steadier delivery, raise it for more dramatic reads.
- seed -
-1means random; set a value to make output reproducible. - timeout_seconds (300) - long scripts can blow past this; bump it if you get timeouts.
The rest you can leave alone: auto_unload/unload_delay manage the model in LM Studio's memory, stop_at_eot controls whether generation halts at the end token, debug prints detailed LLM-vs-SNAC timing to your console, and custom_stop lets you add an extra stop string. The single audio output wires straight into any AUDIO consumer - VHS' SaveAudio, a VLC node, or video nodes that accept a soundtrack.
Installing it
Easiest via ComfyUI Manager: search "ComfyUI-OrpheusTTS-LMStudio" and hit install. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/phazei/ComfyUI-OrpheusTTS-LMStudio
cd ComfyUI-OrpheusTTS-LMStudio
pip install -r requirements.txt
The real requirements are lmstudio>=1.5.0, snac>=1.2.1, torch>=2.1, numpy>=1.23, and transformers - note the README still says lmstudio>=0.2.20, but the shipped file needs 1.5+. You'll already have torch; the rest are light except for the one-time SNAC download. Restart ComfyUI.
The LM Studio side
This is the part that trips everyone up. In LM Studio: search and download isaiahbjork/orpheus-3b-0.1-ft-Q4_K_M-GGUF (a 3B quant, runs comfortably on 8GB VRAM), load it, then click the Local Server tab and hit Start Server. That server is the backend - if it's not running, the node fails with a connection error. Port is usually 1234.
Troubleshooting
- Connection errors → LM Studio's server isn't started, or a firewall is blocking port 1234.
- Node not appearing → restart ComfyUI after install.
- Runs but outputs silence → the model isn't emitting audio tokens; check
model_keyand confirm the loaded model is the Orpheus GGUF. - Slow → flip
debugon. The timers tell you whether the LLM phase or the SNAC decode phase is the bottleneck.
It's a one-node pack from a smaller author, so don't expect a huge community around it - but for a single trick (good local TTS that doesn't take minutes), it does the job cleanly.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | Hello there. <chuckle> This should sound natural. | — |
| voice | COMBO | 8 options: tara, leah, jess, leo, dan, mia, +2 | |
| model_key | STRING | — | |
| max_tokens | INT | 4096256–131072 | — |
| temperature | FLOAT | 0.600–2 | — |
| top_p | FLOAT | 0.900–1 | — |
| repeat_penalty | FLOAT | 1.101–2 | — |
| timeout_seconds | INT | 3005–3600 | — |
| auto_unload | COMBO | False | 2 options: True, False |
| unload_delay | INT | 00–3600 | — |
| stop_at_eot | BOOLEAN | true | — |
| seed | INT | -1-1–18446744073709550000 | — |
| debug | BOOLEAN | false | — |
| custom_stopopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |