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.

Text → SpeechT
TextAudio
As Tool

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

Entry
Text → SpeechT
Exit
  • Execute + Data
Press “Copy nodes”, open the editor and hit Ctrl+V on the canvas.

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 AudioFiles edge into Exit. The Files port accepts pure data only. Turn on Split output ports and draw the edge from audio_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; pcm and mp3 are 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

PortWirePayloadNotes
TexttextExecute + Dataexecute_datastring

shown when operation_mode ≠ "as_tool"

Outputs

PortWirePayloadNotes
AudioaudioExecute + Dataexecute_datafile

shown when operation_mode ≠ "as_tool"

As Tooltool_outExtensionlink_extension

shown when operation_mode ≠ "executable"

Configuration

FieldTypeDefaultDescription
Node modeoperation_modestringexecutable

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: executable — Executable, as_tool — As Tool

Modelmodelstringopenrouter/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: openrouter/google/gemini-3.1-flash-tts-preview — OpenRouter / Google: Gemini 3.1 Flash TTS Preview, openrouter/fish-audio/s1 — OpenRouter / Fish Audio: S1, openrouter/fish-audio/s2-pro — OpenRouter / Fish Audio: S2 Pro, openrouter/fish-audio/s2.1-pro-free:free — OpenRouter / Fish Audio: S2.1 Pro Free (free), openrouter/fish-audio/s2.1-pro — OpenRouter / Fish Audio: S2.1 Pro, openrouter/microsoft/mai-voice-2-flash — OpenRouter / Microsoft: MAI-Voice-2-Flash, openrouter/qwen/qwen-audio-3.0-tts-flash — OpenRouter / Qwen: Qwen-Audio-3.0-TTS Flash, openrouter/qwen/qwen-audio-3.0-tts-plus — OpenRouter / Qwen: Qwen-Audio-3.0-TTS Plus, openrouter/deepgram/aura-2 — OpenRouter / Deepgram: Aura-2, openrouter/minimax/speech-2.8-hd — OpenRouter / MiniMax: Speech 2.8 HD, openrouter/minimax/speech-2.8-turbo — OpenRouter / MiniMax: Speech 2.8 Turbo, openrouter/microsoft/mai-voice-2 — OpenRouter / Microsoft: MAI-Voice-2, openrouter/x-ai/grok-voice-tts-1.0 — OpenRouter / xAI: Grok Voice TTS 1.0, openrouter/zyphra/zonos-v0.1-hybrid — OpenRouter / Zyphra: Zonos v0.1 Hybrid, openrouter/canopylabs/orpheus-3b-0.1-ft — OpenRouter / Canopy Labs: Orpheus 3B, openrouter/sesame/csm-1b — OpenRouter / Sesame: CSM 1B, openrouter/hexgrad/kokoro-82m — OpenRouter / hexgrad: Kokoro 82M, openrouter/mistralai/voxtral-mini-tts-2603 — OpenRouter / Mistral: Voxtral Mini TTS

Advanced
Show the result to the modelshow_result_to_modelbooleanfalse

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_catchbooleantrue

Emit loading/success lines for this tool into a connected catch_tool_call node.

shown when operation_mode = as_tool

Connection Idconnection_idstring""

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.