Whisper Transcribe (OpenAI API)
This node just calls OpenAI's Whisper API
- transcription_result
- audio_path
- frames_count
The node that skips the whole local stack
Whisper Transcribe (OpenAI API) is the "I'd rather not" node. You drop a clip into ComfyUI's input folder, paste an OpenAI API key into the node, run it, and a transcript comes out - no model download, no VRAM, no GPU required. If you transcribe a few files a month rather than a thousand, that trade is usually the right one: the actual Whisper model lives on OpenAI's servers and you pay by the minute of audio (a two-minute clip runs about a cent).
It's one of three nodes in the Salt AI Whisper Transcriber pack, and the only one that touches the network. Its siblings load and run Whisper locally (see Whisper Model Loader); this one calls OpenAI's hosted whisper-1 endpoint instead. The README talks about "Whisper V2," but the model dropdown only offers whisper-1 - that's just OpenAI's current Whisper API model, don't read anything into the version number.
How it works
Smarter than it looks. Before anything reaches the API, the node shells out to ffmpeg to strip the audio track into a 16 kHz mono MP3, and uses ffprobe to read the video's frame rate. So you can point it at a whole MP4 and it uploads only the audio - small uploads, and most files stay under OpenAI's 25 MB per-request cap. Then it calls openai.audio.transcriptions.create, or translations.create when you pick translate_to_english.
The inputs that matter
Required: file_path and openai_key. The path is relative to ComfyUI/input - drop your file there and type its filename, not an absolute path.
The optional ones you'll actually set:
mode-transcribeortranslate_to_english. Translation always outputs English and ignores the language and timestamp settings.language- an ISO language code; leave blank to auto-detect.response_format-text,json,verbose_json, orprompt_schedule. That last one is the pack's signature: it converts segments into"frame": "text"lines timed to the probed fps, the format Salt-style prompt-scheduling workflows expect.max_framesandseek_seconds- only do anything inprompt_schedulemode, so ignore them otherwise.prompt- a hint string that biases Whisper toward proper nouns and spellings, plustemperature(0.7 default) if you want it more or less adventurous.
The outputs
transcription_result (the text or JSON you asked for), audio_path (where the extracted MP3 landed, handy if you want to reuse it), and frames_count (the video's total frames, from the probed fps).
Install
Same pack as the other two Salt Whisper nodes. ComfyUI Manager → search "SaltAI Whisper" → Install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/haohaocreates/PR-SaltAI_Whisper_Transcriber-e087b361
Then install the deps with the same Python ComfyUI runs from (on the portable Windows build that's ComfyUI\python_embedded\python.exe -m pip install -r requirements.txt), restart ComfyUI, and refresh the browser tab. The clone also needs ffmpeg and ffprobe on your PATH - the node calls them directly and they're not in requirements.txt.
Gotchas
Your API key sits in the graph as a plain string, and it's saved into the workflow JSON. The moment you share a workflow with that widget filled, you've handed out a live credential - blank the key or strip it before exporting anything. That's the same credential-leak shape that makes API-wrapper nodes a target, and it's worth internalizing with this one.
One this-mirror-specific trap: the shipped code does from . import logger, but the repo is missing logger.py, so a fresh clone can fail to load with a ModuleNotFoundError before you ever see the node. If that happens, create logger.py in the pack folder:
# logger.py
import logging
logger = logging.getLogger(__name__)
Then restart. And remember whisper-1 caps uploads at 25 MB. 16 kHz mono MP3 is compact, but a multi-hour file can still blow past it - for long audio, use the local transcribe node instead.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| file_path | STRING | — | |
| openai_key | STRING | — | |
| modelopt | COMBO | 1 options: whisper-1 | |
| modeopt | COMBO | 2 options: transcribe, translate_to_english | |
| languageopt | STRING | — | |
| response_formatopt | COMBO | 4 options: text, json, verbose_json, prompt_schedule | |
| temperatureopt | FLOAT | 0.700–1 | — |
| timestamp_granularitiesopt | COMBO | 2 options: segment, word | |
| max_framesopt | INT | 0 | — |
| seek_secondsopt | FLOAT | 0.00 | — |
| promptopt | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| transcription_result | STRING | — |
| audio_path | STRING | — |
| frames_count | INT | — |