Transcribe

Convert spoken audio to text with optional speaker diarization and audio event tagging.

Overview

The Transcribe node converts audio into a text transcript. The engine is ElevenLabs Speech-to-Text — the node’s default and the only one the editor’s picker offers today. Two Replicate-hosted engines, Whisper and Incredibly Fast Whisper, remain implemented and are still reachable through a node’s provider written directly into workflow JSON (an agent, an import, a template) and through Add Captions’ transcribe_provider; see Word timestamps: which engine can do it. The node supports automatic language detection or explicit language selection, speaker diarization (identifying who said what), and audio event tagging (labeling non-speech sounds like music, laughter, or applause).

The node has two output handles: a text handle carrying the plain transcript, and a json handle carrying a normalized Transcript object with word- and segment-level timings. The json handle is the structured form the caption and editing nodes consume; the text handle is unchanged from earlier versions, so existing wires keep working.

On a self-hosted install the chosen engine runs on your own key (ELEVENLABS_API_KEY for ElevenLabs STT, REPLICATE_API_TOKEN for the Whisper engines). With no key for the chosen engine and a connected nodaro.ai account, the transcription runs through the connection instead; with neither, the node fails with a message naming the key to add.

Configuration

Field Type Default Description
Provider TranscribeProvider "elevenlabs-stt" Transcription engine — elevenlabs-stt, incredibly-fast-whisper, or whisper. Only the first two return word timestamps; whisper never does — see below
Language string "auto" Language code for the audio, or “auto” for automatic detection. Supports 20+ languages
Speaker Diarization boolean false When enabled, identifies and labels different speakers in the transcript
Tag Audio Events boolean false When enabled, annotates non-speech audio events (music, laughter, applause, etc.) in the transcript

Inputs & Outputs

The json output: Transcript

The json handle emits a Transcript — the shared, versioned shape the caption and editing nodes read:

Transcript {
  version: 1
  sourceId?: string        // set when the transcript is bound to an editing source
  language?: string
  words: Array<{
    text: string
    startMs: number        // milliseconds
    endMs: number          // milliseconds
    speaker?: string       // present on diarized runs
    confidence?: number
  }>
  segments?: Array<{
    startMs: number
    endMs: number
    text: string
    speaker?: string
  }>
}

All timings are integer milliseconds. words is populated whenever word-level timing is available — always for the default ElevenLabs engine (it is word-level), and for incredibly-fast-whisper when the json handle is connected (the node then requests word timestamps automatically). segments carries the coarser sentence/chunk breakdown when the engine provides one.

Word timestamps: which engine can do it

Engine Word timestamps Notes
elevenlabs-stt (default) Yes, always Word-level by design — the flag changes nothing
incredibly-fast-whisper Yes, on request Switches the model to word-granularity timestamps
whisper No openai/whisper has no word-timestamps input at all

whisper cannot produce word timings under any setting. Asking it for them used to return an empty word list from a job that reported success; an explicit request is now refused instead, and an inferred one is simply not made.

Over POST /v1/transcribe, provider currently accepts exactly one value: elevenlabs-stt.

Where incredibly-fast-whisper and whisper are selectable: inside a workflow run, never over POST /v1/transcribe.

What happens on a run:

Composing into burned-in captions

The node feeds Add Captions two ways:

  1. Wire the json handle into Add Captions. The node requests word timings automatically, and Add Captions renders them as word-aligned kinetic captions.
  2. Pass the words through the API. A finished transcribe job’s output_data.words is already the caption shape (text, startMs, endMs) — hand it straight to POST /v1/add-captions as captions[]:

    POST /v1/transcribe   { audioUrl, provider: "elevenlabs-stt", wordTimestamps: true }
      → poll GET /v1/jobs/:id → output_data.words
    POST /v1/add-captions { videoUrl, style: "word-highlight", captions: <those words> }
    

    Supplying captions[] also means Add Captions runs no transcription of its own, so nothing is transcribed (or billed) twice.

Text output details

The text handle and {Label} references resolve the plain transcript, exactly as before:

Field Type Description
generatedText string The full transcript as plain text
generatedResults array Array of result objects, each containing text, language, jobId, timestamp, and the per-result transcript

When Speaker Diarization is enabled, the transcript includes speaker labels (e.g., “Speaker 1:”, “Speaker 2:”) before each segment, and each word in the Transcript carries its speaker.

When Tag Audio Events is enabled, non-speech sounds are annotated inline (e.g., “[music]”, “[laughter]”).

Best Practices

Common Use Cases

Tips