MOSS-TTS v1.5 Generate Speech
A Voice From Nothing But a Text Box
- mosstts_model
- audio
- tokens_generated
The headline feature of this node is one you should double-check, because it sounds like a lie: you type text, pick a language, optionally describe the voice in a sentence, and it talks - with no reference audio at all. Most TTS that sounds good needs a clip of the voice you want. MOSS-TTS v1.5 doesn't, and that makes Generate Speech the fastest way to get narration in a ComfyUI workflow without hunting down a voice sample.
That's the real draw here. If you're making a talking-head video or narrating a storyboard and you don't care about matching a specific person, this node is your pipeline's voice - feed its audio into an avatar model and you're done.
How it works
Under the hood it's a text-to-audio-token generation loop: the LLM backbone (Qwen3-4B in the default Local-Transformer variant) emits tokens for the MOSS audio codec, which decodes to 48 kHz stereo at 12.5 frames per second. That's why all the sampling knobs exist - you're steering a language model's generation, not tweaking a vocoder.
The input list is long but only a handful matter:
text- what to say. Supports[pause 3.2s]markers for timed silence (useful for pacing), and on the 8B Delay variant, Pinyin and IPA input.language- 31 languages plusauto. The tooltip says it plainly: v1.5 performs best when you set it explicitly. Set it. Don't rely on auto unless you're genuinely unsure.instruction- the killer feature. Free-form style text likemale, warm, elderly narratorsteers the voice without a reference clip. This is how you get character voices out of a text box.target_tokens- hard duration control: 125 frames ≈ 10 s, 375 ≈ 30 s.0lets the model decide via its end-of-speech token. This is where the Estimate Tokens node plugs in.audio_temperature- default 1.7, which is high by LLM standards but normal for acoustics. Lower it if the voice gets unstable, raise it for more expressive delivery.audio_repetition_penalty- 1.0 is off; 1.05–1.15 "suppress droning / tempo freeze," per the author. If a long line turns into a monotone loop, this is the fix.max_new_tokens- the hard generation budget, default 4096 frames ≈ 5.5 min cap. The safety valve so one runaway prompt doesn't synth for an hour.
There's also a separate text-stream group (temperature/top_p/top_k) that controls alignment and pacing rather than sound quality. Leave those at defaults unless you're chasing a specific rhythm.
Outputs
audio- the waveform, ready to wire to a preview/save node or into a video pipeline.tokens_generated- the exact frame count (seconds = frames / 12.5). Don't ignore this: it's the hand-off value for Continue Speech, letting the next node know exactly how long the prefix was.
Install & the same pack gotchas
ComfyUI Manager → Custom Nodes Manager → search moss-tts → Install → restart. Or clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/CloudRipple/MOSS-TTS-ComfyUI.git
python install.py
Dependencies are just huggingface-hub, safetensors, numpy, tqdm - torch, torchaudio, and transformers come from your ComfyUI, and the model code is vendored in the pack, so there's no trust_remote_code and no transformers version fight. That's rare in the TTS corner of the ecosystem, where dependency conflicts are the usual way a node pack breaks three others. First load downloads ~9.1 GB + codec; that's a one-time patience tax.
Common issues
- Nothing comes out - first check the Load Model node actually finished downloading, then check the loader's printed search paths if it can't find weights.
- Droning or tempo freeze on long text - raise
audio_repetition_penaltyinto the 1.05–1.15 range, and consider an explicit[pause]marker or two. - Flash-attn errors - set the Load Model node's
attentiontosdpa. Quality is identical; flash attention is optional. - VRAM pressure - the Local variant wants ~12 GB bf16. The pack hooks into ComfyUI's memory management, so you can free it after render.
One honest caveat: 31-language TTS is still not ElevenLabs-grade reliability for production multi-language work (the KB's audio essay is blunt about that seam). But for local, private, reference-free narration in a ComfyUI graph, this is genuinely competitive - and it's all Apache-2.0 on the model side.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| mosstts_model | MOSSTTS_V15_MODEL | — | |
| text | STRING | Hello! This is MOSS-TTS v1.5 running inside ComfyUI. | Text to synthesize. Supports [pause 3.2s] markers, Pinyin and IPA (delay variant). |
| language | COMBO | auto | Language hint. v1.5 performs best when it is set explicitly. |
| instruction | STRING | Free-form style instruction, e.g. 'male, warm, elderly narrator'. | |
| audio_temperature | FLOAT | 1.700–3 | Acoustic sampling temperature (MOSS default 1.7). |
| audio_top_p | FLOAT | 0.800–1 | Acoustic nucleus sampling. |
| audio_top_k | INT | 250–1024 | Acoustic top-k. |
| audio_repetition_penalty | FLOAT | 1.001–2 | 1.0 = off. Mild values (1.05-1.15) suppress droning / tempo freeze. |
| text_temperature | FLOAT | 1.000–2 | Text-stream (alignment/pacing) temperature. |
| text_top_p | FLOAT | 1.000–1 | Text-stream nucleus sampling. |
| text_top_k | INT | 500–500 | Text-stream top-k. |
| target_tokens | INT | 00–45000 | Duration hint in audio frames (12.5 frames/s): 125 ≈ 10 s, 375 ≈ 30 s. 0 = model decides via EOS. Wire the Estimate Tokens node to compute it. |
| max_new_tokens | INT | 409616–45000 | Hard generation budget in frames (12.5 fps): 4096 ≈ 5.5 min cap. |
| do_sample | BOOLEAN | true | Stochastic sampling; off = greedy decode (delay variant maps this to temperature=0). |
| seed | INT | 420–2147483647 | Same seed + same inputs → identical output. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| tokens_generated | INT | — |