Whisper Transcribe
Local Whisper transcription that also hands you a frame-by-frame prompt schedule
- whisper_model
- transcription_text
- transcription_timestamp_dict
- transcription_frame_dict
- prompt_schedule
- images
- transcription_count
- frame_rate
- frame_count
The node that justifies the pack
Whisper Transcribe is the payoff of the Salt AI Whisper Transcriber pack. Feed it a model from the Whisper Model Loader and a file that lives in ComfyUI/input, and you get a plain-text transcript - plus a set of frame-indexed outputs that most transcription nodes don't bother with. That second half is what people build workflows around.
The pack is a community mirror of Salt AI's original repo, which the company deleted in 2024; the code survives via ComfyUI Manager and this PR-mirror repo (the PR- prefix and hex suffix are just registry naming). Three nodes: this one, the loader, and an OpenAI-API variant for when you'd rather pay than download.
How it works
Grounded in what the code actually does: the node validates the file extension against a long list of video and audio formats, then shells out to ffmpeg to extract the soundtrack as a 16 kHz mono MP3 into ComfyUI's temp folder. pydub loads the samples, and a transformers automatic-speech-recognition pipeline runs Whisper over them with timestamps on. For each detected chunk it records the text at its start time, computes a frame number from your chosen frame_rate, and for video files pulls an actual frame out of the clip with moviepy. All offline once the model is downloaded - that's the point of pairing it with the loader.
Inputs and outputs that matter
The wiring: whisper_model comes straight from the loader (forgetting that wire is the one real trap - the transcribe node just won't run with an unconnected whisper_model input). file_path is relative to ComfyUI/input - drop the clip there and type its filename. frame_rate defaults to 8 and sets the cadence of the frame outputs: frame number = second × frame rate. Leave it unless you're syncing to a specific video's fps. chunk_type (sentence or word) sets timestamp granularity - sentence is the sane default. max_new_tokens (default 128) caps the decode; raise it if long sentences come out chopped.
Outputs worth knowing:
transcription_text- the whole transcript; wire into any text display node.transcription_timestamp_dict/transcription_frame_dict- seconds→text and frame→text.prompt_schedule- the same data as"frame": "text"lines, the format Salt-style prompt-scheduling workflows expect. The bundled example workflow (which wants rgthree's Display Any and pysssss's ShowText to view) dumps it into a text node.images- one IMAGE per chunk: a real extracted frame for video, a black 512×512 placeholder for audio-only files. The black frames are by design, not a bug; don't expect useful content from them.
There's also transcription_count, frame_rate, and frame_count if you want the numbers.
Install
ComfyUI Manager → search "SaltAI Whisper", or:
cd ComfyUI/custom_nodes
git clone https://github.com/haohaocreates/PR-SaltAI_Whisper_Transcriber-e087b361
Install requirements.txt into the Python ComfyUI uses - portable Windows: ComfyUI\python_embedded\python.exe -m pip install -r requirements.txt - then restart and refresh the tab.
Troubleshooting
ffmpeg must be on your PATH; the extraction is a raw subprocess call and it isn't in requirements.txt, so "transcribe does nothing" is almost always this. First transcription on a fresh model is slow (download plus warm-up), and large-v3 on cpu is genuinely painful - grab distil-large-v3 from the loader if you're CPU-bound.
And the mirror quirk that bites before any of that: the code does from . import logger, but the repo is missing logger.py, so a fresh install can fail to load with a ModuleNotFoundError. Create logger.py in the pack folder with import logging / logger = logging.getLogger(__name__), restart, and the nodes appear.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| whisper_model | WHISPER_MODEL | — | |
| file_path | STRING | — | |
| frame_rateopt | FLOAT | 8.001–244 | — |
| chunk_typeopt | COMBO | 2 options: sentence, word | |
| max_new_tokensopt | INT | 1281–4096 | — |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| transcription_text | STRING | — |
| transcription_timestamp_dict | DICT | — |
| transcription_frame_dict | DICT | — |
| prompt_schedule | STRING | — |
| images | IMAGE | — |
| transcription_count | INT | — |
| frame_rate | INT | — |
| frame_count | INT | — |