MOSS-TTS v1.5 Continue Speech
The Node That Keeps One Voice Going
- mosstts_model
- previous_audio
- audio
- tokens_generated
- full_audio
- full_tokens
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.AUDIOinput, same as everywhere.previous_text- the exact text that producedprevious_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 ofprevious_audio. The intended flow is to wiretokens_generatedfrom the upstream Generate Speech / Voice Clone node straight in.0makes 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_framesfrom 1 to 2–3. - Voice drifts after a continuation - check
previous_textis word-for-word exact, and setlanguageexplicitly rather thanauto. - 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 -
attention→sdpaon 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.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| mosstts_model | MOSSTTS_V15_MODEL | — | |
| previous_audio | AUDIO | Prior clip to continue from. | |
| previous_text | STRING | Exact text that produced previous_audio (word-for-word matters). | |
| text | STRING | Follow-up text to speak next. | |
| previous_tokens | INT | 00–45000 | Frame count of previous_audio; wire tokens_generated from the upstream node. 0 = measure from audio duration. |
| head_trim_frames | INT | 10–10 | Frames trimmed from the start of the NEW segment (codec receptive-field bleed ≈ 80 ms/frame). |
| language | COMBO | auto | Language hint. v1.5 performs best when it is set explicitly. |
| instruction | STRING | Free-form style instruction, e.g. 'male, warm, elderly narrator'. | |
| audio_temperature | FLOAT | 1.700–3 | Acoustic sampling temperature (MOSS default 1.7). |
| audio_top_p | FLOAT | 0.800–1 | Acoustic nucleus sampling. |
| audio_top_k | INT | 250–1024 | Acoustic top-k. |
| audio_repetition_penalty | FLOAT | 1.001–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 (4)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| tokens_generated | INT | — |
| full_audio | AUDIO | — |
| full_tokens | INT | — |