RunningHub VoxCPM Dataset Build
VoxCPM Dataset Build
- entry_1
- entry_2
- entry_3
- entry_4
- entry_5
- entry_6
- entry_7
- entry_8
- manifest_path
- num_samples
RunningHub VoxCPM Dataset Build is the middle node of the training pipeline: it takes the entry outputs from one or more Dataset Entry nodes, writes each audio clip out as a resampled WAV, and collects the whole thing into a train.jsonl manifest that Train LoRA reads. If Dataset Entry is the captioning step, this is the "save the dataset" step - and it's the step that decides whether your training run sees clean, correctly-typed audio.
It's deliberately small. Up to eight entry sockets (entry_1 through entry_8), of which entry_1 is required and at least two samples are expected in practice. Two string inputs - dataset_name (the output folder prefix, default voxcpm_dataset) and extra_manifest (a path to an existing jsonl you want to append, so you can merge in hand-curated data). One numeric input that matters more than it looks: sample_rate, default 16000.
The sample rate thing
That default isn't arbitrary. VoxCPM2's AudioVAE trains at 16 kHz - the upstream note is explicit that training sample rate must equal audio_vae_config.sample_rate (16k for V2, even though the decoder outputs 48k). The Train LoRA node runs a pre-flight check that compares your manifest's baked-in WAV rate against the model's expected rate, and a mismatch means on-the-fly resampling that silently slows your data loading. In other words: leave sample_rate at 16000 unless you know exactly why you're changing it. If you're using VoxCPM1.5 or 0.5B and training complains, that's the first value to re-check.
The output is a folder under ComfyUI/output/voxcpm_train/<dataset_name>_<timestamp>/ containing train.jsonl plus the WAVs. The node reports manifest_path (the path to that jsonl - wire it into Train LoRA's train_manifest) and num_samples (a count, useful for a quick sanity check or for logging).
How it fits
The README's typical flow is Dataset Entry → Dataset Build → Train LoRA, and the included LoRA training example builds a tiny dataset from two clips just to prove the loop. For anything real you'll want more samples than two - and this is where the node's shape starts to show its limits. Eight entries is fine for a small curated set, but if your source is "a folder of 200 chunked clips," chaining eight Entry nodes is a nightmare. That's the exact job Dataset Build (Batch) exists for: same manifest output, but it eats a whole list of AUDIO clips in one pass. Pick this node for hand-curated handfuls and the Batch variant for bulk.
Setup and gotchas
Standard pack install, plus the base model before you actually train:
cd ComfyUI/custom_nodes
git clone https://github.com/RH-RunningHub/ComfyUI_RH_VoxCPM.git
cd ComfyUI_RH_VoxCPM && pip install -r requirements.txt
The entry type is pack-internal (VOXCPM_DATA_ENTRY), so if you load someone else's workflow you must have this exact pack installed or the sockets won't match anything. And one warning from the code: this node does not validate your audio's provenance. If an Entry node auto-transcribed garbage text, Build happily writes it into the manifest. Garbage in, garbage out - review the text output of your Entry nodes before you commit a dataset.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| entry_1 | VOXCPM_DATA_ENTRY | — | |
| entry_2opt | VOXCPM_DATA_ENTRY | — | |
| entry_3opt | VOXCPM_DATA_ENTRY | — | |
| entry_4opt | VOXCPM_DATA_ENTRY | — | |
| entry_5opt | VOXCPM_DATA_ENTRY | — | |
| entry_6opt | VOXCPM_DATA_ENTRY | — | |
| entry_7opt | VOXCPM_DATA_ENTRY | — | |
| entry_8opt | VOXCPM_DATA_ENTRY | — | |
| extra_manifestopt | STRING | — | |
| sample_rateopt | INT | 160008000–48000 | — |
| dataset_nameopt | STRING | voxcpm_dataset | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| manifest_path | STRING | — |
| num_samples | INT | — |