✏️ ASR Transcribe
Turn audio back into text (and timings) inside ComfyUI
- engine
- audio
- text
- asr_timing_data
- info
This is the suite running in reverse. Every other node here takes text and makes speech; ASR Transcribe takes speech and makes text. Feed it an audio clip and it gives you a transcript plus timing data - the raw material for subtitles, for cleaning up an existing recording, or for grabbing the exact words of a reference voice clip so you can hand them to a cloning engine.
It's a consumer node like TTS SRT: it needs an ASR-capable engine wired in. In this suite that means a Qwen3-TTS engine (which does double duty as Qwen3-ASR) or a Granite ASR engine. This node holds the transcription settings; the engine holds the model.
How it works
You connect the audio and the engine, pick a language (or Auto), and it runs the model over the clip. Long audio is handled by chunk_size with an overlap between chunks so words at the boundaries aren't lost. The node's real value in this pack is that it doesn't just dump text - it emits structured timing data, which the 📺 Text to SRT Builder can turn into properly-timed subtitles. That split (transcribe here, build subtitles downstream) is deliberate: you can clean or edit the transcript in between and still keep the original timings.
The inputs and outputs that matter
engine- required. A Qwen3 or Granite ASR engine node. No engine, no transcription.audio- the clip to transcribe.language-Autousually works, but pin it if auto-detect guesses wrong on a short or accented clip.task-transcribe(same language) ortranslate(into the engine's target language).timestamps-noneorword. Choosewordwhen you want word-level timing for tight subtitles.diarization- speaker labels (who said what). Note this depends on the engine: the Granite4.1 plusmodel does native diarization; not every engine will.
chunk_size / overlap tune long-audio handling, and enable_asr_cache skips re-transcribing unchanged audio.
Three outputs: text (the plain transcript), asr_timing_data (the structured timings - wire this into Text to SRT Builder), and info (diagnostics). Leave asr_timing_data disconnected and the SRT builder will estimate timings from text alone.
Installing it
Ships with the pack. ComfyUI Manager → "TTS Audio Suite" → install → restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/diodiogod/TTS-Audio-Suite.git
cd TTS-Audio-Suite
python install.py
The ASR model weights (Qwen3-ASR or Granite, several GB) auto-download on first use through whichever engine you connect.
Common issues & troubleshooting
Nothing transcribes. The engine input needs to be an ASR-capable engine - a Qwen3-TTS or Granite ASR node. A pure TTS engine won't do it.
Diarization is empty or ignored. Speaker attribution isn't universal. If you need who-said-what, use a Granite engine that supports it (the 4.1 plus variant), and be aware that asking for diarization and word timestamps together makes the suite fall back to the reused Qwen forced aligner to deliver both.
Words dropped at chunk boundaries on long audio. That's what overlap is for. Bump it up so consecutive chunks share more context and stop clipping words at the seams.
Wrong language detected. Auto can misfire on short clips. Set language explicitly. And if you actually wanted a translation rather than a same-language transcript, switch task to translate.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| engine | TTS_ENGINE | ASR-capable engine configuration (for example Qwen3-TTS Engine or Granite ASR Engine). This node auto-routes to the correct ASR adapter based on the engine type. | |
| audio | * | Audio to transcribe. Accepts AUDIO, Character Voices output, or VideoHelper audio. | |
| languageopt | COMBO | Auto | Language hint for ASR. • Auto: Let the engine handle language itself when possible • Explicit language: Better when you know the spoken language and want more predictable results Engine caveat: • Qwen ASR has native Auto language detection • Granite currently supports English, French, German, Spanish, Portuguese, and Japanese • Granite 4.1 plus drops Japanese, but adds native speaker diarization and native word timestamps • Granite + forced aligner on Auto uses a truthful heuristic for timestamps: Japanese script -> Japanese mode, otherwise the generic space-delimited aligner path |
| taskopt | COMBO | transcribe | Task mode: • transcribe: Same-language transcription • translate: Experimental speech translation to the engine's configured ASR translation target Important: • Translation support varies a lot by engine and backend • In this repo, current ASR translation paths are prompt-driven rather than fully native task APIs • Expect uneven quality depending on language pair and model • Translation target is configured on the engine node, not here |
| timestampsopt | COMBO | none | Timing detail for the ASR timing output: • none: Text only, no reusable timed words/segments • word: Word-level timings for timestamp-capable ASR paths Use word timings if you plan to feed this into the Text to SRT Builder. Granite note: word timestamps are native on the plus model variant when diarization is off. Other Granite timestamp paths use the separate Qwen forced aligner. |
| chunk_sizeopt | INT | 300–600 | Chunk size in seconds. 0 = no chunking (use for short audio only). |
| overlapopt | INT | 20–30 | Overlap between chunks (seconds). Helps preserve words across chunk boundaries. |
| enable_asr_cacheopt | BOOLEAN | true | Cache ASR results in memory so SRT tweaks are instant. Disable if you want fresh ASR every run. |
| diarizationopt | BOOLEAN | false | Speaker Diarization (Speaker Attribution): • True: Attribute speech to speakers if supported (for example [Speaker 1] hello) • False: Plain transcription without speaker turns Granite note: Native speaker attribution is supported on the 'plus' model variant. If combined with word-level timestamps, the system automatically uses the Qwen forced aligner to time-align the speakers' words. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |
| asr_timing_data | STRING | — |
| info | STRING | — |