ElevenLabs - Speech to Text
Speech to Text with diarization, so your transcript knows who said what
- audio
- text
- language_code
- words_json
ElevenLabs isn't just a voice company - its Scribe model transcribes too, and this node wraps it. Feed it an AUDIO input and it returns the text, the detected language, and per-word timing. If you're building a pipeline that turns a recorded voice track into captions, a script for re-voicing, or a searchable transcript, this is the node that closes the loop inside ComfyUI.
You give it three required inputs: api_key, audio (any AUDIO from another node - a loaded file, a TTS result, a voice clone sample), and model (currently just scribe_v2). Then the controls that matter:
diarize- label who's speaking. Turn it on and the transcript splits into speakers, which is the difference between "a wall of text" and "a usable podcast script."num_speakers- tell it how many voices to expect (0 = auto-detect). Setting this helps when diarization keeps merging two people.diarization_threshold- higher is stricter about separating speakers. If the diarizer is fragmenting one person into many, raise it.timestamps_granularity-word,character, ornone. Choosewordwhen you're going to rebuild captions from the timing.keyterms- comma-separated terms to bias recognition toward. The fix for Scribe consistently mangling your product name or a character's name.tag_audio_events- annotate sounds like(laughter)and(music)in the transcript. Nice for video editing notes.no_verbatim- strip filler words and stutters ("um", "uh") for a cleaner read.
Outputs: text (the transcript), language_code (e.g. en; empty input means auto-detect), and words_json (per-word timing and confidence, when you asked for it).
How to run it
Any node that produces AUDIO feeds it - a TTS node for round-tripping a script you want to verify, an audio loader for real recordings. For a voice-clone workflow, running STT on your reference samples is a good sanity check that the audio is clean enough to clone from. For captions, take words_json and the audio and drive a subtitle renderer with real timing instead of guessing.
Installing it
Part of the ComfyUI API Toolkit pack. Manager: search "API Toolkit". Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/IxMxAMAR/ComfyUI-API-Toolkit
cd ComfyUI-API-Toolkit
pip install -r requirements.txt
Restart. Requires requests and soundfile - soundfile is what converts the AUDIO input to WAV for upload, so don't skip it.
Gotchas
- The pack re-executes API nodes every queue (IS_CHANGED), so each run is a fresh transcription - good for correctness, easy to forget when batching.
- Diarization isn't magic. Busy or overlapping speech still confuses it; setting
num_speakersand tuningdiarization_thresholdis the actual fix, not re-running. - For unlimited local transcription, whisper-based nodes are the free alternative; this one wins on the built-in diarization and event tagging being one node away.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | — | |
| audio | AUDIO | — | |
| model | COMBO | scribe_v2 | 1 options: scribe_v2 |
| language_codeopt | STRING | ISO language code (e.g. 'en', 'es'). Empty = auto-detect. | |
| tag_audio_eventsopt | BOOLEAN | false | Annotate sounds like (laughter), (music) in transcript. |
| diarizeopt | BOOLEAN | false | Identify and label different speakers. |
| num_speakersopt | INT | 00–32 | Expected number of speakers. 0 = auto-detect. |
| timestamps_granularityopt | COMBO | word | 3 options: word, character, none |
| seedopt | INT | 00–2147483647 | Seed for reproducibility. 0 = random. Determinism not guaranteed. |
| diarization_thresholdopt | FLOAT | 0.500–1 | Threshold for speaker diarization. Higher = stricter speaker separation. |
| temperatureopt | FLOAT | 0.000–1 | Sampling temperature. 0 = deterministic. |
| keytermsopt | STRING | Comma-separated key terms to bias recognition toward. | |
| no_verbatimopt | BOOLEAN | false | When True, removes filler words and stutters from transcript. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |
| language_code | STRING | — |
| words_json | STRING | — |