GigaAM Speech to Text
The Russian ASR node that feeds your whole dubbing pipeline
- audio
- text
- text_batch
Most speech-to-text in ComfyUI starts and ends with Whisper. If your audio is Russian, this node is the reason to look past that default. GigaAM_Transcription runs GigaAM - Sber's speech-recognition family - and it's Russian-native in a way Whisper only approximates, with RNNT variants that are genuinely fast. It's also the front door of the whole OreX dubbing pipeline: transcribe → translate with an LLM → regenerate voice → align, and everything downstream is tuned to eat this node's output format.
GigaAM is barely a blip in the English-speaking community - search the usual subreddits and you'll find almost nothing, because this pack lives in the Russian dubbing scene. Don't read that as "untested." It's a mature, Sber-backed ASR line with years of Russian benchmark wins, and for Russian-language work it's a legitimate alternative to Whisper large. If your audio isn't Russian, this isn't the node for you.
How it works
The node does the boring parts of ASR that Whisper nodes often leave to you. For anything over about 20 seconds it splits the audio by silence first - a dynamic energy threshold that adapts to the clip's own loudness, with a hard ~20s chunk cap - writes each chunk to a temp wav, and transcribes with gigaam.load_model(). When you need word timing, it asks GigaAM for word-level stamps and stitches chunk offsets back together, then reassembles words into timestamped sentence lines. There's also a real (if heavy) optional pyannote speaker-diarization pass that labels who said what.
The inputs that matter
The parameter list is intimidating; you'll set maybe five of them.
- audio - any AUDIO socket, straight from a Load Audio node.
- model_name - eight choices (
v3_e2e_rnnt,v3_e2e_ctc, … down tov1_*). Keep the defaultv3_e2e_rnnt: the README calls it the best speed/quality balance, and RNNT is the fast one. - longform - on by default; leave it on. It's what enables the silence-splitting for anything past 20 seconds.
- hf_token - needed for the first model download. If the model is already cached or you have an
HF_TOKENenv var, leave it blank. - word_timestamps - turn this on when you're building a dubbing pipeline; it's what produces the
[start - end]prefixes. - sentences_per_interval / words_per_interval - group N sentences or words per output line.
0/0(default) splits by sentence naturally. Sentences wins if both are set. - chunk_tokens - splits the full text into LLM-sized chunks (default 3072, ~3 chars per token). This is what makes the output ready for machine translation.
- highlight_words - emits karaoke-style SRT with the current word underlined (
<u>…</u>), the shorts-and-reels trick. - speaker_diarization / min_speakers / max_speakers / speaker_format - pyannote speaker labels. Only worth it on multi-speaker content; it's a big download and a GPU hog.
Outputs
Two, and they split the work: text is the whole transcript as one string (or the SRT when karaoke mode is on), and text_batch is a list of chunks sized for your LLM's context window. That batch list is the thing you wire into a translation model - in the OreX pipeline it goes straight into the cutting node next.
Install
Same pack install as the other OreX nodes: ComfyUI Manager → search "ComfyUI-GigaAM", or clone it manually, then restart.
cd ComfyUI/custom_nodes
git clone https://github.com/orex2121/ComfyUI-GigaAM
Then the real work: dependencies. The README's one-liner is pip install gigaam pyannote.audio audiotsm soundfile, and there's an INSTALL_DEPS.bat in the pack for Windows portable installs that installs gigaam (from the Sber git repo, --no-deps) plus pyannote. Be aware that batch file does not install audiotsm or soundfile - the aligner and transcription node need those, so run the full README line or add them yourself. Models land in ComfyUI/models/audio_encoders by default (the code forces the HF cache there), not in your home cache.
Where people get burned
The classic stumble is the HF token. GigaAM models and especially the pyannote diarization model (pyannote/speaker-diarization-community-1) need a read token, and pyannote additionally requires you to accept its terms on the Hugging Face page first - skip that and you get an auth error that looks like a broken node. Enabling diarization without pyannote installed raises a clear error telling you to pip install pyannote.audio, so don't panic when it appears. And on first run the model download makes the node look frozen - give it a few minutes before you assume it's hung. If your audio is short and the output looks fine, you did it right.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| model_name | COMBO | v3_e2e_rnnt | 8 options: v3_e2e_rnnt, v3_e2e_ctc, v3_rnnt, v3_ctc, v2_rnnt, v2_ctc, +2 |
| longform | BOOLEAN | true | — |
| hf_token | STRING | — | |
| word_timestamps | BOOLEAN | false | — |
| sentences_per_interval | INT | 00–100 | — |
| words_per_interval | INT | 00–1000 | — |
| chunk_tokens | INT | 30720–100000 | — |
| highlight_words | BOOLEAN | false | — |
| speaker_diarization | BOOLEAN | false | — |
| min_speakers | INT | 11–20 | — |
| max_speakers | INT | 21–20 | — |
| speaker_format | COMBO | 2 options: SPEAKER A: SPEAKER B: SPEAKER C:, [Speaker_1]: [Speaker_2]: [Speaker_3]: |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |
| text_batch | STRING | — |