Confucius4 Transcribe
Load Audio in, text out, one file at a time
- model
- audio
- text
- language
- result_json
- srt
This is the node that actually does the speech-to-text. Drop a Load Audio on the canvas, wire its AUDIO output here, and you get a transcript as a plain string. No sampler, no image, no latent - an odd shape of graph if you live in diffusion-land, but the same trick as bolting a captioner or a prompt enhancer into a workflow: a non-diffusion model doing one scoped job inside a graph you already know how to queue (llm-in-comfyui.md).
The inputs you'll actually touch
audio - ComfyUI's AUDIO type. One clip per run: the node expects [1, channels, samples] and rejects batches, with up to 8 channels accepted and mixed or picked apart by channel (mean/left/right). That's your fix for an interview recorded with one speaker per side - set left or right instead of letting the mean blend a second voice in.
mode - offline for whole files, stream for incremental decoding. Offline is the one you want for a finished recording; it decodes each stretch once. Stream is the caption-style path, more events, more compute.
language - twelve choices, Auto first. The README's one concrete tip: for mostly-Chinese audio with English sprinkled in, set Chinese in stream mode. Forcing a language generally settles short or code-switched clips where Auto flip-flops.
context - a free-text prompt for the model, up to 8192 characters. This is where you write "a podcast about vintage synthesizers" or drop in dialect notes. It's a real quality lever, not a comment field.
hotwords - names, product strings, jargon. Mechanically it's appended to context as Hotwords: ... and sent in the same prompt, which is why it's the thing that actually fixes proper nouns the model keeps mangling.
Two optional ones matter. auto_gain (default on) lifts quiet input with a limited gain before decoding - handy for phone recordings, and worth turning off if you've already normalized the file. stream_chunk_ms (160/320/480/640) only affects stream mode; changing it in offline mode does nothing.
What happens after you hit Run
Files up to 30 seconds go through in one pass. Longer ones get split: digital silence first if there is any, otherwise FireRedVAD ONNX segmentation into stretches capped at 20 seconds, each decoded once. The result reports mode_executed=segmented_offline so you can tell which path you got. If any stretch ran into the token cap the result is flagged truncated; if the VAD had to force a cut, it's flagged requires_review, which the pack uses as an honest "check this by hand" marker.
Streaming mode is the interesting one mechanically: it publishes only the stable prefix of the decode and rolls back the last unfixed token before extending it, so the text you see grows instead of rewriting itself mid-sentence. All the bookkeeping - segments, timings, detected language, status, mode_executed - lands in result_json.
Outputs
text is the transcript. language is what the model decided (or what you forced). result_json is the whole result object, and it's the one you wire into Confucius4 Save Transcript - the save node parses it and gates on the status field, so passing bare text there won't fly. Send text to anything else that eats a string.
Install
Same pack, same Windows/NVIDIA CUDA runtime as the loader - that's the real prerequisite, and it's not optional (audio-generation.md makes the point that audio tools in ComfyUI live at the edge in bespoke packs with their own dependency stacks; this one has the heaviest stack of the lot). Once the worker is built, drag workflows/confucius4_q8_file.json from the repo onto the canvas and swap in your own audio.
Where people get burned
The 512 MiB transport cap. Raw float32 PCM, so duration is a function of sample rate and channel count: about 2.3 hours at 16 kHz mono, but only around 23 minutes if you hand it 48 kHz stereo. Convert long recordings to 16 kHz mono first and you get most of that budget back.
Auto language on mixed speech. If half your sentences are Chinese and half are English, Auto is a coin flip per segment and can flip the language label mid-file. Pick one.
Expecting instant results on long files. Segmentation means many decodes, and each decode is a full pass through the model. A 90-minute file is not a 90-second wait.
Malformed audio. The node validates hard - an empty waveform, a NaNs-and-infs file, or an audio tensor that isn't [1, C, T] each raise their own error rather than producing silence. If you built the audio with another node, that's usually where the shape went wrong.
Assuming the transcript has timestamps. The segments in result_json carry sample offsets; text doesn't. If you need timing, save the JSON, not the text.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| model | R2T2_MODEL | — | |
| audio | AUDIO | — | |
| mode | COMBO | 2 options: offline, stream | |
| language | COMBO | 12 options: Auto, Chinese, English, Cantonese, Japanese, Korean, +6 | |
| context | STRING | — | |
| hotwords | STRING | Paste multiple hotwords or connect Confucius4 Hotwords. Recognition hints, not forced replacements. | |
| channel | COMBO | 3 options: mean, left, right | |
| auto_gainopt | BOOLEAN | true | — |
| stream_chunk_msopt | INT | 160160–640 | — |
| subtitle_timingsopt | BOOLEAN | false | Collect complete segment text and approximate VAD timings for SRT/VTT. Enable before exporting subtitles. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |
| language | STRING | — |
| result_json | STRING | — |
| srt | STRING | — |