Recognize Subtitle
Speech-to-text straight from ComfyUI, with timestamps and no cloud account
- audio
- video
- SUBTITLE_TEXT
If you're making talking-head, dub, or interview-style videos in ComfyUI, at some point you need the words out of the audio - with timestamps, so you can burn them as subtitles. Recognize Subtitle is the pack's local, offline answer: drop in an AUDIO or VIDEO, pick a model, and get normalized SRT text out. No API key, no cloud dependency, just a model file sitting on your disk.
How it works
The node serializes your audio (or extracts the audio track from a video) and runs a real ASR model over it. Two models are on offer via the model_type dropdown, and they're different enough that the choice matters:
whisper-large-v3(default) - OpenAI's Whisper Large V3, loaded from thewhisper_large_v3_fp16.safetensorsaudio encoder inmodels/audio_encoders/. Solid, familiar, and the safest default.qwen3-asr- Qwen's ASR model (released January 2026, ~52 languages) plus its separate forced aligner. The aligner is what buys you tighter word-level timing. Both live undermodels/Qwen3-ASR/.
Either way the recognized segments get run through a smart sentence splitter capped by max_sentence_length (default 20 characters per subtitle entry), so you get readable captions instead of a wall of words. output_format gives you standard srt or a timestamp format with one (start, end) text entry per line.
The inputs: audio takes priority when both are connected; otherwise video gets its audio extracted. And unload_model (default on) moves the ASR model back to CPU and clears accelerator caches when done - leave it on unless you're running many clips back to back and want to skip the reload.
The single output, SUBTITLE_TEXT, feeds straight into subtitle burning (MultiTrack Add Subtitle To Video, or the pack's easy addSubtitleToVideo) or just sits in a text node for review.
Installing it properly
The pack itself is trivial:
cd ComfyUI/custom_nodes
git clone https://github.com/yolain/ComfyUI-Easy-Media.git
restart ComfyUI (or ComfyUI Manager → "Easy-Media"). But the models are the actual install, and they're big:
- Whisper Large V3 →
models/audio_encoders/whisper_large_v3_fp16.safetensors - Qwen3-ASR 1.7B + Qwen3-ForcedAligner 0.6B →
models/Qwen3-ASR/
Some of these can be pulled through the pack's built-in Easy-Media model download interface in the UI, which is the convenient path. Python side needs openai-whisper for Whisper, or qwen-asr + torchaudio for Qwen. FFmpeg on your system, as always with this pack.
Where people get burned
The number one failure is forgetting the model file - the node raises a clean "model not installed" error, so the fix is just to download it. Number two: running the wrong ASR backend for the job. Whisper's timestamps are good enough for casual subs; if you need tight word alignment (for synced captions or dubbing), that's the Qwen3-ASR + aligner path, and it's worth the extra GB. And a big one nobody warns about: with unload_model off, a 1.7B ASR model sits in VRAM and can OOM your next generation. Start with it enabled.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| model_type | COMBO | whisper-large-v3 | Choose the same ASR model used by multitrack subtitle recognition. |
| output_format | COMBO | srt | Output standard SRT or one '(start, end) text' entry per line. |
| max_sentence_length | INT | 201–500 | Maximum number of characters in each subtitle entry. |
| unload_model | BOOLEAN | true | Move the ASR model to CPU and clear accelerator caches after recognition. |
| audioopt | AUDIO | Optional AUDIO input. Takes priority when both inputs are connected. | |
| videoopt | VIDEO | Optional VIDEO input. Its audio track is extracted when AUDIO is not connected. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SUBTITLE_TEXT | STRING | — |