Nodes/MOSS-TTS-ComfyUI/MOSS-TTS v1.5 Generate Speech
ComfyUI Node

MOSS-TTS v1.5 Generate Speech

A Voice From Nothing But a Text Box

By CloudRipple·Created about 24 hours ago·Updated about 23 hours ago· 0
MOSS-TTS v1.5 Generate Speech
  • mosstts_model
  • audio
  • tokens_generated
textHello! This is MOSS-TTS v1.5 running inside ComfyUI.
languageauto
instruction
audio_temperature1.70
audio_top_p0.80
audio_top_k25
audio_repetition_penalty1.00
text_temperature1.00
text_top_p1.00
text_top_k50
target_tokens0
max_new_tokens4096
do_sampletrue
seed42

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 plus auto. 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 like male, warm, elderly narrator steers 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. 0 lets 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_penalty into the 1.05–1.15 range, and consider an explicit [pause] marker or two.
  • Flash-attn errors - set the Load Model node's attention to sdpa. 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.

CategoryMOSS-TTS v1.5

Inputs (15)

NameTypeDefaultDescription
mosstts_modelMOSSTTS_V15_MODEL
textSTRINGHello! This is MOSS-TTS v1.5 running inside ComfyUI.Text to synthesize. Supports [pause 3.2s] markers, Pinyin and IPA (delay variant).
languageCOMBOautoLanguage hint. v1.5 performs best when it is set explicitly.
instructionSTRINGFree-form style instruction, e.g. 'male, warm, elderly narrator'.
audio_temperatureFLOAT1.700–3Acoustic sampling temperature (MOSS default 1.7).
audio_top_pFLOAT0.800–1Acoustic nucleus sampling.
audio_top_kINT250–1024Acoustic top-k.
audio_repetition_penaltyFLOAT1.001–21.0 = off. Mild values (1.05-1.15) suppress droning / tempo freeze.
text_temperatureFLOAT1.000–2Text-stream (alignment/pacing) temperature.
text_top_pFLOAT1.000–1Text-stream nucleus sampling.
text_top_kINT500–500Text-stream top-k.
target_tokensINT00–45000Duration 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_tokensINT409616–45000Hard generation budget in frames (12.5 fps): 4096 ≈ 5.5 min cap.
do_sampleBOOLEANtrueStochastic sampling; off = greedy decode (delay variant maps this to temperature=0).
seedINT420–2147483647Same seed + same inputs → identical output.

Outputs (2)

NameTypeDescription
audioAUDIO
tokens_generatedINT