MOSS-TTS Voice Continue
Keep the same MOSS voice talking — without re-cloning
- moss_model
- previous_audio
- audio
- tokens_generated
- full_audio
- full_tokens
MOSSVoiceContinue is the "don't make me re-clone it" node. You've generated a clip in some voice - via Speak, Voice Clone, or an earlier Continue - and you want the same voice to keep talking through the next paragraph. This node extends a prior MOSS clip with new text, inheriting the voice straight from the audio. No new reference clip, no re-clone, no seam. It's how you narrate a multi-paragraph passage without generating the whole thing at once.
The mechanism that bites people
MOSS is a prefix-continuation model. It doesn't just take audio and "say more" - it needs to know where it is in the script. So the node concatenates previous_text + " " + text into the full script, conditions on the prior audio, and generates audio for the new part. Which means previous_text must be the exact text that produced previous_audio - word-for-word, punctuation included. Get it wrong and you get Kauderwelsch, because the model can't align its position in the script. It's the single most common mistake, and the tooltip spells it out for a reason.
Inputs that matter
moss_model- from the loader.previous_audio- the prior MOSS output.previous_text- the exact text behind that audio. Non-negotiable.text- the new lines, appended afterprevious_text.previous_tokens- the exact frame count of the prefix. Wire the upstream node'stokens_generatedoutput here for a precise handoff; leave at 0 and the node measures from the audio duration (off by at most one frame).target_tokens- target length of the NEW segment only. The node adds the prefix internally because MOSS reads its hint as TOTAL (prefix + new) in continuation mode.head_trim_frames- default 1 (~80 ms) trimmed from the start of the new audio. MOSS's conv codec lets the last prefix frame bleed into the start of the continuation; this removes it. Set to 0 if you hear a chopped syllable, higher if the bleed persists.
Outputs: audio (new segment only, for per-segment QC - you hear just the delta), tokens_generated (frames of the new segment), full_audio (prefix + new, concatenated and resampled to the model's native rate), and full_tokens (cumulative frame count). The chain pattern:
seg N: Voice Continue -> audio, full_audio, full_tokens
seg N+1: previous_audio <- seg N.full_audio
previous_tokens <- seg N.full_tokens
The VRAM trap
Chaining segment N+1 with the whole cumulative history is the classic failure mode: VRAM drifts up about 1 GB per 20 s of history and eventually OOMs mid-scene. The fix the author documents: pass only the last segment's audio as previous_audio (and its full_tokens as previous_tokens) rather than the whole concatenation. Prefix-continuation semantics still hold - MOSS aligns the prefix at the end of previous_text inside the full script - just with a shorter history. Watch nvidia-smi during a long scene to spot the drift early.
Install & troubleshooting
Same pack as the rest - Manager, search "MOSS-TTS 1.5", or:
cd ComfyUI/custom_nodes
git clone https://github.com/eehrich/ComfyUI-MOSS-TTS-1.5.git MOSS-TTS-ComfyUI
Restart and load the model once first. A few notes from the README and source: an empty follow-up text is technically allowed but MOSS closes out almost immediately, so supply real lines. And like every generate node in the pack, a mild audio_repetition_penalty (1.05–1.15) is the cure if a segment starts droning or looping syllables. When target_tokens is set, target_overshoot_frames caps how far past it the model can run - a fuse against hangs on pathological input.
The neat trick: because the voice lives in the audio, not a separate reference, you can chain an arbitrary number of segments and each one inherits the voice for free. That's the entire point - one voice, one long take, no seams.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| moss_model | MOSS_MODEL | Model bundle produced by MOSS-TTS Load Model. | |
| previous_audio | AUDIO | Prior MOSS output to continue from. Typically the AUDIO output of a preceding MOSS-TTS Voice Clone / Voice Continue node. Must be paired with the exact 'previous_text' that produced it. | |
| previous_text | STRING | The exact text that produced 'previous_audio'. MOSS needs it to align its 'where am I in the script?' state. Should match word-for-word (punctuation matters). Passing the wrong prior text -> Kauderwelsch. | |
| text | STRING | New text to speak after the previous audio ends. Internally concatenated as: previous_text + ' ' + text -> full script. Empty is legal but MOSS will then close out almost immediately -- supply real follow-up text for meaningful output. | |
| language | COMBO | English | Language hint for the follow-up text. |
| audio_temperature | FLOAT | 1.700.1–3 | Sampling temperature (MOSS default 1.7). |
| audio_top_p | FLOAT | 0.800–1 | Nucleus (top-p) sampling cutoff. |
| audio_top_k | INT | 251–200 | Top-k sampling cutoff. |
| target_tokens | INT | 00–65536 | Target length of the NEW continuation segment, in audio frames (12.5 fps). 0 = disabled (model decides via EOS). The node adds the measured prefix length internally, because MOSS reads its 'tokens' hint as TOTAL (prefix + new) in continuation mode. Chain a MOSS-TTS Estimate Tokens node on the FOLLOW-UP text to compute this. |
| max_new_tokens | INT | 4096256–65536 | Safety cap on newly-generated audio frames. Same units as in Voice Clone: 12.5 fps -> 4096 caps continuation at ~5 min. |
| seed | INT | 420–4294967295 | Random seed. Same seed + same inputs -> identical output. |
| previous_tokens | INT | 00–65536 | Exact frame count of 'previous_audio'. Wire the 'tokens_generated' output of the preceding Speak / Voice Clone / Voice Continue node into this input for a precise handoff. Leave at 0 to measure from the audio duration (fine for externally-loaded WAVs, off by <=1 frame due to rounding). |
| head_trim_frames | INT | 10–10 | Extra frames to trim from the START of the new audio (1 frame = 80 ms at 12.5 fps). MOSS's decoder trims the prefix by SAMPLE proportion, and its conv-based 48 kHz codec has a receptive field that spans frame boundaries -- so the last prefix frame can bleed audibly into the start of the returned continuation. Default 1 (~80 ms) removes it in most cases. Set 0 to disable, higher if the bleed is longer. |
| target_overshoot_frames | INT | 500–65536 | Runaway safety cap on the NEW continuation segment: when target_tokens > 0, MOSS may only exceed target_tokens by this many frames. Effective max_new_tokens = min(max_new_tokens, target_tokens + target_overshoot_frames). Default 50 = 4 s slack at 12.5 fps. Prevents long hangs on pathological inputs. Ignored when target_tokens = 0. |
| audio_repetition_penaltyopt | FLOAT | 1.001–2 | Penalty on recently generated audio tokens (1.0 = off). Mild values (1.05-1.15) suppress the classic autoregressive TTS failure modes -- droning, tempo freeze, smeared or looping syllables -- while leaving normal prosody untouched (it only bites on pathological repeats). Values above ~1.3 can distort legitimately repeated sounds ('nein, nein, nein'). |
| text_temperatureopt | FLOAT | 1.000.1–3 | Temperature for the TEXT stream (alignment/pacing), NOT the acoustics. MOSS default 1.0. Lower = steadier pacing/alignment; does not flatten the voice (that's audio_temperature). |
| text_top_popt | FLOAT | 1.000–1 | Nucleus (top-p) cutoff for the TEXT stream. MOSS default 1.0 (off). |
| text_top_kopt | INT | 501–200 | Top-k cutoff for the TEXT stream. MOSS default 50. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | New segment only, head-trimmed. Use this for per-segment QC / preview -- you hear just the delta MOSS produced this call. |
| tokens_generated | INT | Frames of the NEW segment only (frames, not samples). At 12.5 fps this equals duration_seconds * 12.5. |
| full_audio | AUDIO | Cumulative audio: previous_audio + new segment concatenated at 48 kHz stereo. Wire this into the NEXT Continue's previous_audio when the same speaker keeps talking across segments. |
| full_tokens | INT | Cumulative frame count: prefix + new. Wire into the next Continue's previous_tokens for a precise handoff without re-measurement. |