Prepare Spoken Text
Use this action when you are about to speak text that was written to be read, and want it to sound like something a person would actually say. It returns text only — it produces no audio.
Best for
- Preparing an agent or LLM reply before speaking it
- Speaking a template or a rich-text field that contains formatting
- Any step whose text is headed for Synthesize speech
This is not the same as removing the formatting. A table has no spoken form, so stripping the markup does not give you speakable text — it gives you word soup, reading the cells out in a row or dropping the answer altogether. This action asks a small, inexpensive model to say the same thing the way a person would, while your original text stays untouched for the transcript.
Use something else when
| You want | Use |
|---|---|
| The audio itself | Synthesize speech — run this action first, then that one |
| New content, not a rewrite of text you already have | Generate LLM response — it takes your own prompt and model |
Main fields
| Field | What it does |
|---|---|
| Markdown | The written text to rewrite for speech, at most 8000 characters. Usually the reply from an earlier step, such as step(0).choices[0].message.content |
| Purpose | Optional label for what this step is for, shown in the logs |
What later steps can use
| Value | What it is |
|---|---|
step(N).text | The spoken form. Feed it straight into Synthesize speech's Text field |
step(N).model | The model that produced the rewrite |
Limits
| Limit | Value |
|---|---|
| Input length | 8000 characters |
| Speech requests | 60 per minute, per company |
The rewrite is deliberately short, so it always fits inside Synthesize speech's 4096-character limit — you never need to trim it in between.
The 60-per-minute ceiling is shared with voice mode in the app and with Synthesize speech, so a prepare-then-speak pair costs two of those requests per run.
Cost
This step counts toward your plan's AI token usage, not your audio usage. It runs on a small, inexpensive model chosen for you — you cannot pick the model, because the job is a mechanical rephrase rather than reasoning, and it should not cost reasoning prices.
When it fails
| Code | What happened |
|---|---|
spoken_text_too_long | The input is over 8000 characters. Shorten it or split it across steps |
Voice mode in the app quietly falls back to plain text when this rewrite fails, but a workflow has no such fallback: a failure here fails the step. If you want the same graceful degradation, gate the synthesis step on step_ok(N) and pass the original text through on the other branch.