Nodes/MOSS-TTS 1.5/MOSS-TTS Voice Continue
ComfyUI Node

MOSS-TTS Voice Continue

Keep the same MOSS voice talking — without re-cloning

By eehrich·Created 2 months ago·Updated 12 days ago· 1
MOSS-TTS Voice Continue
  • moss_model
  • previous_audio
  • audio
  • tokens_generated
  • full_audio
  • full_tokens
previous_text
text
languageEnglish
audio_temperature1.70
audio_top_p0.80
audio_top_k25
target_tokens0
max_new_tokens4096
seed42
previous_tokens0
head_trim_frames1
target_overshoot_frames50
audio_repetition_penalty1.00
text_temperature1.00
text_top_p1.00
text_top_k50

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 after previous_text.
  • previous_tokens - the exact frame count of the prefix. Wire the upstream node's tokens_generated output 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.

CategoryMOSS TTS 1.5

Inputs (18)

NameTypeDefaultDescription
moss_modelMOSS_MODELModel bundle produced by MOSS-TTS Load Model.
previous_audioAUDIOPrior 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_textSTRINGThe 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.
textSTRINGNew 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.
languageCOMBOEnglishLanguage hint for the follow-up text.
audio_temperatureFLOAT1.700.1–3Sampling temperature (MOSS default 1.7).
audio_top_pFLOAT0.800–1Nucleus (top-p) sampling cutoff.
audio_top_kINT251–200Top-k sampling cutoff.
target_tokensINT00–65536Target 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_tokensINT4096256–65536Safety cap on newly-generated audio frames. Same units as in Voice Clone: 12.5 fps -> 4096 caps continuation at ~5 min.
seedINT420–4294967295Random seed. Same seed + same inputs -> identical output.
previous_tokensINT00–65536Exact 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_framesINT10–10Extra 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_framesINT500–65536Runaway 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_penaltyoptFLOAT1.001–2Penalty 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_temperatureoptFLOAT1.000.1–3Temperature 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_poptFLOAT1.000–1Nucleus (top-p) cutoff for the TEXT stream. MOSS default 1.0 (off).
text_top_koptINT501–200Top-k cutoff for the TEXT stream. MOSS default 50.

Outputs (4)

NameTypeDescription
audioAUDIONew segment only, head-trimmed. Use this for per-segment QC / preview -- you hear just the delta MOSS produced this call.
tokens_generatedINTFrames of the NEW segment only (frames, not samples). At 12.5 fps this equals duration_seconds * 12.5.
full_audioAUDIOCumulative 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_tokensINTCumulative frame count: prefix + new. Wire into the next Continue's previous_tokens for a precise handoff without re-measurement.