MOSS-TTS v1.5 Voice Design
Describe a voice that doesn't exist — then make it talk
- mosstts_model
- audio
- tokens_generated
Every other voice-cloning setup makes you hunt for the perfect 5–15 second reference clip: clean audio, no music, no reverb, and a person who actually sounds like what you want. Voice Design skips all of that. You type warm, friendly, young female, unhurried and a sentence, and MOSS just... talks in a matching voice. No reference audio input exists on this node - that's the entire point.
It's one node in CloudRipple's MOSS-TTS-ComfyUI pack, which wraps OpenMOSS's MOSS-TTS v1.5 family. This one drives the MOSS-VoiceGenerator, a 1.7B voice-design model. Where the pack's other generation nodes steer an existing voice with a text instruction, here the instruction is the voice - nothing to clone from, so the description does all the work. Different job from zero-shot cloning: this is where the voice you want only exists in your head.
The output is designed to chain straight into the pack's Voice Clone node as its reference audio. That's the real workflow, and the README spells it out: design → clone → mass-produce. Sketch a narrator voice in a few seconds, lock it in with a clone, then run a whole script through it without fighting the dice again.
How it works
Like every node in this pack, it's a Qwen-backbone LLM that doesn't output text - it writes audio tokens that a codec turns into a waveform. VoiceGenerator is from the same delay-pattern family as the pack's 8B Delay variant (same code path, lighter 1.7B checkpoint, 16 codebooks instead of 32). Budget around 4 GB of VRAM for the model and another ~7 GB for its codec.
Under the hood this node does two things differently from the rest of the pack. First, it guards: it errors unless Load Model has the MOSS-VoiceGenerator variant selected, and again if instruction is empty. Second, the code hands your text, language, voice description, and any target_tokens hint to the model as a chat-style user message - meaning the description is part of the actual prompt the model conditions on, not metadata bolted on after. Output is 24 kHz mono, so don't expect the 48 kHz stereo of the Local-Transformer variant.
Inputs that matter
Fifteen knobs, but you really set four of them:
- instruction - the voice description. This is the star. Gender, age, emotion, pacing, accent, in Chinese or English. The author's own default,
A warm, friendly, young female voice., is a fine starting point. - text - the line to speak.
- language - 31 explicit choices plus
auto. The tooltip says it plainly: v1.5 performs best when you set it explicitly. Set it. - target_tokens - duration control in frames (12.5 frames/sec, so 125 ≈ 10 s). Zero means "let the model stop on its own." Wire the pack's Estimate Tokens node here if you need a specific length.
The audio sampling defaults (temperature 1.5, top-p 0.6, top-k 50, repetition penalty 1.1) are tuned to VoiceGenerator's official recommendations - deliberately different from the Delay variant's. Only touch them if you hear droning or tempo freeze.
Outputs: audio (wire it to PreviewAudio to listen, SaveAudio to keep, or Voice Clone to use as a reference) and tokens_generated, an INT frame count - seconds = frames / 12.5.
Install
Via ComfyUI Manager: search moss-tts → Install → restart. Or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/CloudRipple/MOSS-TTS-ComfyUI.git
python install.py # installs only missing deps
Restart ComfyUI. Notably light on dependencies: just huggingface-hub, safetensors, numpy, tqdm. Torch and transformers come from ComfyUI, and the model code is vendored in the pack - no trust_remote_code, no fighting whatever transformers version your other nodes dragged in. That alone makes this pack more pleasant than most TTS-on-ComfyUI experiences, which as the wider ecosystem will tell you are usually a dependency-conflict minefield.
First run pulls the VoiceGenerator weights from Hugging Face automatically (download_if_missing on Load Model controls it); if you've already run the Delay variant, the shared codec is probably cached.
Where people get burned
- "Voice Design requires MOSS-VoiceGenerator." You left Load Model on Local-Transformer or Delay. Switch the variant and re-run.
- Wrong length or wandering pacing. Set
languageexplicitly and givetarget_tokensa value instead of letting the model decide when to stop. - It sounds flat or starts looping. Bump the repetition penalty - literally the knob built for this.
- Expecting 48 kHz. This family outputs 24 kHz mono. Plan your downstream (a lip-sync step, a video track) around that.
If you need narration or a character voice in a video pipeline, this is MOSS's nicest on-ramp: no reference hunt, cheap to iterate on, clean bridge to cloning when you need a locked voice. It's niche - don't expect Chatterbox-level chatter - but for "I need a voice that doesn't exist yet," it's the one to reach for.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| mosstts_model | MOSSTTS_V15_MODEL | — | |
| instruction | STRING | A warm, friendly, young female voice. | 音色描述(必填):性别/年龄/情绪/语速/口音等,中英文均可。产出音频可直接当 Voice Clone 的参考。 |
| text | STRING | Hello! This voice was designed from a text description. | — |
| language | COMBO | auto | Language hint. v1.5 performs best when it is set explicitly. |
| audio_temperature | FLOAT | 1.500–3 | Acoustic sampling temperature (MOSS default 1.7). |
| audio_top_p | FLOAT | 0.600–1 | Acoustic nucleus sampling. |
| audio_top_k | INT | 500–1024 | Acoustic top-k. |
| audio_repetition_penalty | FLOAT | 1.101–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 | — |