All nodes/AI/Media (Speech / Image / Video)
Speech → Text
Transcribes an audio file to text (STT). The model and its parameters are taken from the media catalog; the key comes from env or from a workspace OpenRouter connection.
Type in the graph: speech_to_text
Exec
An error branch can be enabled (expose_error_output) to handle failures on their own path.
Ports can be split into separate execution and data handles.
Try it
Minimal working workflow
- Execute + Data
Pick your own connection or knowledge base first — the graph carries REPLACE_ME.
When to use it
The node transcribes an audio file into text. Reach for it when the text itself is what you need: to store the transcript, to search it, to branch the graph on it. If all you want is an answer to a voice message, transcription is optional — a model with audio support reads the attachment itself inside an AI Agent or an LLM Response. A model without audio support, on the other hand, simply never sees the attachment, and that is where this node becomes unavoidable.
The opposite job belongs to Text → Speech. Unlike that node and Generate Image, transcription is not offered to an agent as a tool: the voice message already arrives as an attachment of the turn.
How it works
The Audio port is a file port: an incoming message’s attachment fits, so does a file from the
workspace file store or the output of
Telegram Get File. When several files arrive, the node takes the
first readable one. The format sent to the provider is derived from the file type, and when the type
is unknown, from the byte signature itself — so a wav or an ogg is not shipped as mp3.
The model exposes two parameters: a hint and a language. Both accept Jinja templates, which makes the hint a good place for names and jargon that will show up in the recording. An empty language means auto-detection.
The transcription catalog is short and hand-maintained: the provider offers no filter for audio input, so the list cannot be assembled automatically like the other catalogs.
The Text output is a plain string, read in templates as {{ nodes.<id>.output }}.
Common mistakes
- An edge from Entry into
Audioraises a port-type warning (message → file). That one is noise: a message’s attachments are unwrapped into files and the run works. - Expecting timestamps, speaker labels or any markup. The node returns one text and nothing else.
- Reading an empty result as a failure. If the model heard nothing, the node completes successfully with an empty string — test the text with a condition, not the node’s status.
- Writing
nodes.<id>.output.text. What travels on the edge and into templates is the transcript string itself. - Feeding several recordings at once. The extra files are ignored silently; a batch needs a loop.
Inputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Audioaudio | Execute + Dataexecute_data | file |
Outputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Texttext | Execute + Dataexecute_data | string |
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
Modelmodel | string | openrouter/openai/whisper-large-v3 | Speech-to-text model from the media catalog (e.g. 'openrouter/openai/whisper-large-v3'). Its own parameters (hint prompt, language) appear below once the model is selected. Options: |
| Advanced | |||
Connection Idconnection_id | string | "" | Optional workspace connection carrying your own provider key (BYO). Empty = the platform key from the environment. connection: openrouter |
Shared fields
Every node has these three — the platform adds them, not the node author.
expose_error_output— When enabled, show an execution output to connect nodes that run if this step fails.split_ports_in— Show separate execution and data input handles instead of one combined port.split_ports_out— Show separate execution and data output handles instead of one combined port.