All nodes/AI/Media (Speech / Image / Video)
Text → Speech
Synthesizes speech (an audio file) from text (TTS). Voice/format are parameters of the selected model from the media catalog.
Type in the graph: text_to_speech
ToolExec
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 reads text aloud and returns an audio file. The opposite job belongs to
Speech → Text. Like
Generate Image it plays two roles: an edge out of the Audio port
makes it an ordinary graph step, while an edge out of tool_out into an
AI Agent’s Extensions port makes it a tool the model calls itself when it
decides to answer with a voice.
How it works
Voice, format and speed are parameters of the selected model, not fields of the node: they come from the media catalog and appear in the form once a model is picked. Most vendors require a voice, so the catalog pre-selects the first one available.
The format is either pcm or mp3, and some models accept mp3 only — for those the right value
is already set. Raw PCM arrives with no container, so the platform identifies the real format from
the bytes themselves and wraps the audio into WAV when needed: the file that reaches the chat plays.
There is no text field on the node. On the graph path the text arrives only through the Text port;
in the tool role it comes from the model’s arguments. The Audio output is exactly one file, stored
in the workspace file store.
The tool’s progress can be shown in the chat: the Stream progress to Catch Tool Call switch emits “loading / done” lines into a connected Catch Tool Call node.
Common mistakes
- Looking for a “Text” field in the form. There is none: an empty input fails the node rather than being skipped quietly.
- An
Audio→Filesedge into Exit. The Files port accepts pure data only. Turn on Split output ports and draw the edge fromaudio_data. - Switching models and expecting the voice to follow. Voice names differ per vendor, the previous model’s value is not sent — so you get the default voice, or the provider’s refusal.
- Changing the format to fix playback. The container is decided by the provider’s answer;
pcmandmp3are what you ask for, not what the listener ends up with. - Synthesising the model’s whole answer. The charge is per call, but synthesis time and file size grow with the text — trim long answers before this node.
Inputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Texttext | Execute + Dataexecute_data | string | shown when operation_mode ≠ "as_tool" |
Outputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Audioaudio | Execute + Dataexecute_data | file | shown when operation_mode ≠ "as_tool" |
As Tooltool_out | Extensionlink_extension | — | shown when operation_mode ≠ "executable" |
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
Node modeoperation_mode | string | executable | Executable — a step in the graph, with Run/Success ports. As Tool — an extension an AI Agent calls itself; only the tool_out port is shown and the agent decides when to run it. Options: |
Modelmodel | string | openrouter/google/gemini-3.1-flash-tts-preview | Text-to-speech model from the media catalog (e.g. 'openrouter/openai/gpt-4o-mini-tts-2025-12-15'). Its own parameters (voice, audio format, speed) appear below once the model is selected. Options: |
| Advanced | |||
Show the result to the modelshow_result_to_model | boolean | false | Inline the generated file into the conversation after the tool result, so the model can look at what it produced and refine it on a following round. Off by default: an inlined file costs input tokens on every generation. shown when operation_mode = as_tool |
Stream progress to Catch Tool Callstream_progress_in_catch | boolean | true | Emit loading/success lines for this tool into a connected catch_tool_call node. shown when operation_mode = as_tool |
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.