llama.cpp Transcribe (Experimental)
Ten seconds of English audio, on one exact model pair
- audio
- transcript
- raw
- language
- result
- metadata_json
What it does, and why it's labelled experimental
Speech in, text out. You wire a Comfy AUDIO value in and get a transcript back, which you can then pipe into a text model, a caption writer, or a prompt builder for a video workflow. Dialogue, voiceover, a dictated prompt - the useful case is short, clean, English speech sitting inside a graph that otherwise has no ears.
The "Experimental" in the display name is not modesty, and it's the most important thing on this page. This node supports one model and one projector, exactly:
qwen3-asr-0.6b/Qwen3-ASR-0.6B-Q8_0.gguf- 804,749,248 bytesqwen3-asr-0.6b/mmproj-Qwen3-ASR-0.6B-Q8_0.gguf- 214,392,480 bytes
They're checked by SHA-256, not by filename. Another quant, another size, another ASR model family - all outside the contract, and the node says so instead of quietly producing plausible-looking text. It also only works against a positively owned direct server: a server this pack started, in direct mode, not router mode, not one you attached to.
That narrowness is honest engineering, not laziness. Whisper isn't wired into llama.cpp; what llama.cpp can do is run a multimodal projector over audio frames, and Qwen3-ASR is the pair the author actually validated end-to-end (Windows Comfy wiring, transcription, cancellation, reuse, owned release, against llama.cpp b9957 and one synthetic English sentence). That's a demonstration that the path works, not an accuracy benchmark.
The audio constraints are the real story
audio must be one mono 16,000 Hz PCM clip, at most 10 seconds - between 1 and 160,000 samples, finite values in [-1, 1], shape [1, 1, samples] with integer sample_rate=16000.
And here's the thing that will bite you within five minutes: the node does not silently downmix, resample, normalise or trim. Stereo is rejected. Multiple items are rejected. 44.1 kHz or 48 kHz is rejected. Out-of-range samples and empty clips are rejected. Exact digital silence is rejected too, with no claimed VAD threshold behind it.
Most audio you'll load from ordinary files is 44.1/48 kHz stereo. So the practical workflow is: convert first, in whatever audio tool you like, to 16 kHz mono WAV, then Load Audio it. If you were hoping to drop a podcast clip in and get a transcript, this isn't that node and won't become it.
Inputs and outputs
Beyond audio, there's supported_pair - a dropdown with a single entry, the Qwen3-ASR pair above. It exists to make you confirm what you selected in Start Server, not to offer a menu. Select that exact model and matching projector in the Start node first; the Start node's projector field supplies the audio projector here, which does not make a vision projector audio-capable.
request_timeout (default 60s) covers the whole request, including the hash verification of the two files. release_after_generation waits for terminal owned-runtime release before the node returns - useful when a diffusion step follows. server_url is there mainly to establish graph order by wiring Start Server's output into it; empty means the current owned runtime.
Five outputs:
transcript is the useful one - the text, with only the exact leading language English<asr_text> prefix stripped. raw is the model's untouched response, prefix and all. language is English when that exact prefix was recognised, empty otherwise. result is the canonical typed generation result, if you want the metadata node treatment.
metadata_json is underrated: sample rate, sample count, duration, WAV and approved-artifact hashes, prefix status, parsing warnings. No waveform data, no local paths - so it's safe to keep or log.
If the prefix is unrecognised, the node does not guess. It reports unrecognized_or_absent, warns, and leaves the raw text in transcript. Read language before you trust transcript is clean prose.
Installing it
comfy node install comfyui-llamacpp
Manager search "comfyui-llamacpp", or a source clone into ComfyUI/custom_nodes plus pip install -r requirements.txt with ComfyUI's own Python, then restart. You need a llama-server build - audio support depends on it, so use a current one. Put both Qwen3-ASR files in ComfyUI/models/LLM/gguf/qwen3-asr-0.6b/ and select them explicitly in Start llama.cpp Server: the model, and the projector. Nothing is downloaded for you and nothing is auto-started.
Where people get burned
Sample rate. It's almost always the sample rate. Check metadata_json - it tells you the rate and sample count it actually received.
A single direct server can't quietly switch model families. If you want to transcribe and then generate with a text model, that's a release/start sequence between the two, not one server doing both. Wire the release and check the status before the second step.
Partial, cancelled or token-limited output. Output is capped at 128 tokens with temperature zero, and those responses must not be presented as completed transcripts. Check result before feeding the text onward.
Expecting multilingual or long-form accuracy. Not established here. One verified English pair, short clips, clean audio. Noisy, accented, overlapping or multi-speaker audio is untested territory, and the validation explicitly covers one synthetic sentence.
Honest take: this is the pack's most interesting node and its least ready one. As a way to get dialogue text into a video pipeline in a single graph, it works - with prep. As a general transcription tool, use Whisper, which will happily eat your 48 kHz stereo file and give you timestamps.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | One mono 16000 Hz PCM clip, at most 10 seconds. | |
| supported_pair | COMBO | Select this exact model/projector pair in Start Server first. | |
| release_after_generation | BOOLEAN | false | Wait for terminal owned runtime release. |
| request_timeout | INT | 601–3600 | Total request budget in seconds. |
| server_urlopt | STRING | Start Server URL; empty uses the owned current runtime. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| transcript | STRING | Transcript with only the verified leading English ASR prefix removed. |
| raw | STRING | The complete unmodified model response. |
| language | STRING | English for the verified prefix; empty when the prefix is unrecognized or absent. |
| result | LLAMACPP_GENERATION_RESULT | Canonical completion, model, operation, timing, usage and release evidence. |
| metadata_json | STRING | Audio provenance and prefix parsing status, without waveform data or local paths. |