๐งพ MOSS Dataset Rows
Pair each training clip with its transcript and conditioning
- clip_dataset
- manifest_path
- manifest_info
Staging got your audio clips onto disk. But a TTS model can't learn a voice from audio alone - it needs to know what's being said in each clip. This node builds that bridge. It writes a training manifest (a .jsonl file, one row per clip) that lines up each staged clip with its transcript and any extra conditioning MOSS supports. Rows in, manifest out.
This is the least glamorous and most important step in the MOSS training chain, because if your text doesn't match your audio, the whole training run learns garbage. Slow down here.
How it works
You hand it the MOSS_CLIP_DATASET from Clip Staging and a block of text - one line of transcript per clip, in order. It zips them together: clip 1 gets text line 1, clip 2 gets line 2, and so on. It writes the result as a JSONL manifest under the training folder, which Dataset Prep then reads. The extra optional fields let you attach MOSS's prompt conditioning (language, style instruction, quality, sound events) per line or as a default across all rows.
The inputs and outputs that matter
clip_dataset(MOSS_CLIP_DATASET) - the output of Clip Staging. Required.text_lines(STRING, multiline) - the transcripts, one line per clip, in the same order the clips were staged. This alignment is everything. A mismatch here is the single most common way MOSS training goes wrong.manifest_name(defaultmoss_train.jsonl) - the filename for the manifest.- The
*_linesfields (reference_clip_lines,language_lines,instruction_lines,quality_lines,sound_event_lines,ambient_sound_lines,duration_tokens_lines) - optional per-clip conditioning, again one line per clip. These map to MOSS's official prompt fields. Most beginners leave them blank. - The
default_*fields - instead of repeating the same value on every line, set it once as a default (e.g.default_language,default_instruction). Handy when your whole dataset is one language or one speaking style.
Outputs: manifest_path (STRING) - the path to the JSONL, which the prep step points at - and manifest_info (STRING), a summary you should read to confirm the row count matches your clip count.
How to install it
Ships with TTS Audio Suite. ComfyUI Manager: search TTS Audio Suite, install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/diodiogod/TTS-Audio-Suite.git
cd TTS-Audio-Suite
python install.py
then restart. On Linux, install portaudio19-dev and libsamplerate0-dev first. This node just writes a text manifest - no model download of its own.
Common issues & troubleshooting
Clip and text counts don't match. This is the classic failure. If you staged 40 clips, you need 40 lines in text_lines. Check manifest_info - if it reports fewer rows than clips (or vice versa), the alignment is off and training will learn wrong labels. Fix the line count before proceeding.
Transcripts are approximate. Loose transcripts hurt. TTS training wants text that actually matches the words in the clip; paraphrases and dropped words degrade the result. Transcribe carefully (the suite's ASR nodes can help, but proofread the output).
Order got scrambled. The pairing is positional - line N goes with clip N. If your clips staged in an order you didn't expect, the text will bind to the wrong audio. Keep your source clip ordering deliberate.
Do I need the conditioning fields? No. For a straightforward single-speaker voice, text_lines alone is enough. The language/instruction/quality fields are there for when you want finer control over what the adapter learns, not a requirement.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| clip_dataset | MOSS_CLIP_DATASET | Staged clip dataset from MOSS Clip Staging. | |
| manifest_name | STRING | moss_train.jsonl | Output manifest filename. .jsonl will be appended if missing. |
| text_lines | STRING | Hello there, this is a training sample. How are you today? | Exactly one line per staged clip, in clip order. Each line is the transcription/text for that clip's target audio. Simple training: just give each clip its own transcript here. Example: clip001 audio says 'Hello there' -> line 1 should be 'Hello there'. |
| reference_clip_linesopt | STRING | Optional one line per staged clip. Most single-speaker or fixed-voice LoRAs should leave this blank. Use this only if a training row should also include reference audio for voice/style conditioning. That means: text says what to say, target clip is the correct output, and reference clip says whose voice/style to follow. Leave blank for normal audio+transcript training. Each line may be blank, a single clip id like clip001, a 1-based clip number like 1, or a comma-separated list such as clip001,clip002. Example: line 2 = clip001 means clip002 trains as: text from line 2 + reference voice from clip001 -> target audio clip002. Single reference -> ref_audio. Multiple references -> reference_audio. | |
| language_linesopt | STRING | Optional one line per clip. Blank line uses default_language or no language field. | |
| instruction_linesopt | STRING | Optional one line per clip. Blank line uses default_instruction. Use this for explicit labels such as 'speaking angrily', 'whispering', or 'calm narration'. Do not use this for recording/presentation labels like 'telephone call quality'; those belong in quality_lines. For many style-focused datasets, this is easier and clearer than using reference_clip_lines. | |
| quality_linesopt | STRING | Optional one line per clip. Blank line uses default_quality. Use this for recording/presentation labels such as 'telephone call quality', 'studio recording', or similar audio-quality descriptors. | |
| sound_event_linesopt | STRING | Optional one line per clip. Blank line uses default_sound_event. | |
| ambient_sound_linesopt | STRING | Optional one line per clip. Blank line uses default_ambient_sound. | |
| duration_tokens_linesopt | STRING | Optional one line per clip. Blank line uses default_duration_tokens. | |
| default_languageopt | STRING | Optional shared language fallback for rows whose language_lines entry is blank. | |
| default_instructionopt | STRING | Optional shared instruction fallback for rows whose instruction_lines entry is blank. Useful if most rows should carry the same style label, for example 'speaking angrily'. | |
| default_qualityopt | STRING | Optional shared quality fallback. Useful if most rows share the same recording/presentation quality label, for example 'telephone call quality'. | |
| default_sound_eventopt | STRING | Optional shared sound_event fallback. | |
| default_ambient_soundopt | STRING | Optional shared ambient_sound fallback. | |
| default_duration_tokensopt | INT | 00โ8192 | Optional shared tokens fallback. 0 disables it. |
| output_subdiropt | STRING | tts_audio_suite_training/moss_tts/manifests | Subdirectory inside ComfyUI input/ where the generated manifest file will be written. |
| overwriteopt | BOOLEAN | true | Overwrite the existing manifest file if it already exists. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| manifest_path | STRING | โ |
| manifest_info | STRING | โ |