Nodes/saltai_whisper_transcribe/Whisper Transcribe
ComfyUI Node

Whisper Transcribe

Local Whisper transcription that also hands you a frame-by-frame prompt schedule

By haohaocreates·Created 2 years ago·Updated 2 years ago· 1
Whisper Transcribe
  • whisper_model
  • transcription_text
  • transcription_timestamp_dict
  • transcription_frame_dict
  • prompt_schedule
  • images
  • transcription_count
  • frame_rate
  • frame_count
file_path
frame_rate8.00
chunk_type
max_new_tokens128

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.

CategorySALT/Whisper

Inputs (5)

NameTypeDefaultDescription
whisper_modelWHISPER_MODEL
file_pathSTRING
frame_rateoptFLOAT8.001–244
chunk_typeoptCOMBO2 options: sentence, word
max_new_tokensoptINT1281–4096

Outputs (8)

NameTypeDescription
transcription_textSTRING
transcription_timestamp_dictDICT
transcription_frame_dictDICT
prompt_scheduleSTRING
imagesIMAGE
transcription_countINT
frame_rateINT
frame_countINT