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

MOSS-TTS v1.5 Continue Speech

The Node That Keeps One Voice Going

By CloudRipple·Created about 24 hours ago·Updated about 23 hours ago· 0
MOSS-TTS v1.5 Continue Speech
  • mosstts_model
  • previous_audio
  • audio
  • tokens_generated
  • full_audio
  • full_tokens
previous_text
text
previous_tokens0
head_trim_frames1
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

Audiobooks, long-form narration, podcasts, characters with more than one paragraph to say - that's the job this node exists for. Continue Speech takes a clip you already generated and extends it in the same voice, like the "continue" button on an LLM but for speech. Generate Speech and Voice Clone are the "say this sentence" nodes; this is the "and then keep talking" node.

The important part is that it doesn't just append blindly. It takes your previous clip and the exact text that produced it, uses both as context, and generates the follow-up so the voice, pacing, and style carry across the seam. Get the chain right and a 20-second sample becomes a 10-minute narration without the voice drifting.

How it works

Under the hood it's prefix-conditioned generation: the previous audio is encoded with the MOSS audio tokenizer, and that prefix becomes the conditioning context for the next chunk. The one mechanical wrinkle is codec bleed - the conv codec's receptive field smears roughly 80 ms (~1 frame) from the prefix into the start of the new segment. That's what head_trim_frames is for: it trims those frames off the front of the new segment so the join is clean. Default 1, which is right for most cases.

Inputs that matter

  • previous_audio - the clip you're continuing from. AUDIO input, same as everywhere.
  • previous_text - the exact text that produced previous_audio. The tooltip is emphatic: word-for-word matters. Get this wrong and the model misaligns text to audio and the continuation degrades.
  • text - the follow-up to speak next.
  • previous_tokens - the frame count of previous_audio. The intended flow is to wire tokens_generated from the upstream Generate Speech / Voice Clone node straight in. 0 makes it measure from the audio duration instead, which works but is less precise.
  • head_trim_frames - default 1; bump it if you hear a blip at the start of the new segment.
  • language, instruction, target_tokens, and the sampling knobs - identical to the rest of the pack, same rules (set language explicitly, 125 ≈ 10 s for target_tokens, repetition penalty 1.05–1.15 if it starts to drone).

Outputs - this is where it gets clever

Four outputs, and you can use either pair:

  • audio + tokens_generated - just the new segment and its frame count.
  • full_audio + full_tokens - the stitched full clip and the total frame count.

The chain pattern: take full_audio and full_tokens from one Continue Speech, feed them into the next Continue Speech's previous_audio and previous_tokens, and you've built an unbroken, same-voice generator that runs as long as you keep adding nodes. That's the workflow the outputs are designed for - the pack hands exact frame counts forward so you never guess the prefix length.

Install

Same pack, same steps:

cd ComfyUI/custom_nodes
git clone https://github.com/CloudRipple/MOSS-TTS-ComfyUI.git
python install.py

or ComfyUI Manager → search moss-tts → Install, then restart. Lightweight deps, vendored model code, no trust_remote_code, no transformers conflict - the pack's usual selling points. First load pulls the weights (~9.1 GB + codec for the Local variant).

Common issues

  • Audio blips at the seam - bump head_trim_frames from 1 to 2–3.
  • Voice drifts after a continuation - check previous_text is word-for-word exact, and set language explicitly rather than auto.
  • Memory grows with each chained segment - the README is upfront that prefix/KV-cache memory grows linearly with prefix duration. Long chains get hungry; the model registers with ComfyUI's memory management so you can free it between renders.
  • Flash-attn errors - attentionsdpa on the Load Model node. No quality loss.

One practical tip: if you're chaining a lot of segments, don't get greedy with target_tokens on each link. Shorter continuations that stitch cleanly beat one giant generation that wanders - and with full_audio/full_tokens doing the stitching, you never pay for the join yourself.

CategoryMOSS-TTS v1.5

Inputs (19)

NameTypeDefaultDescription
mosstts_modelMOSSTTS_V15_MODEL
previous_audioAUDIOPrior clip to continue from.
previous_textSTRINGExact text that produced previous_audio (word-for-word matters).
textSTRINGFollow-up text to speak next.
previous_tokensINT00–45000Frame count of previous_audio; wire tokens_generated from the upstream node. 0 = measure from audio duration.
head_trim_framesINT10–10Frames trimmed from the start of the NEW segment (codec receptive-field bleed ≈ 80 ms/frame).
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 (4)

NameTypeDescription
audioAUDIO
tokens_generatedINT
full_audioAUDIO
full_tokensINT