Audio Generation
Turn a script into spoken audio via the audio_generate tool. Two decisions drive quality: which
voice reads it, and how the script is written for the ear.
Scope. Speech — a voice reading written words, delivered as its own audio file. Nothing here makes
non-speech sound, alters audio that already exists, or combines two tracks into one.
Lip-synced dialogue spoken by a character inside a video clip belongs to generating-videos.
Workflow
Step 1: Settle the script
Generate only from the exact words that will be spoken.
- Supplied → use them verbatim.
- Enough to write them — the product, audience, platform, and length are known → draft the script
and show it before generating.
- Not enough → ask. Never invent a tagline, product claim, or brand name to fill the gap.
Write to a duration. Speech runs about two to three words a second, so a fifteen-second read is
thirty to forty-five words. Set the word count before writing, and trim words rather than speeding up
the delivery.
Step 2: Pick the model
eleven-v3 is the default — the most expressive read, and right for anything heard as a
performance. Reach for another only on a clear signal:
| Reach for another model when the script… |
Model |
| Is a long, even read — an explainer, documentary narration, an audiobook chapter — where the voice must not drift |
eleven-multilingual-v2 |
| Is high-volume, a throwaway draft, or cost-sensitive, and expressiveness doesn't matter |
eleven-flash-v2.5 |
When the user names a model, use it. Per-request character limits differ sharply between models, and
an over-limit script is rejected rather than truncated — list_audio_models carries each ceiling.
Step 3: Pick the voice
Call list_voices, filtered by what the brief demands — gender, accent, age, use_case,
language, or free-text search. Each row carries a preview_url.
There is no default voice: every request needs a voice_id chosen here, passed as voice.
Display names are not accepted.
- A stated gender, accent, or age is a hard filter — apply it, don't trade it away on tone.
Read the attribute back from the row's own fields; never infer it from the voice's name.
- Let the user hear the options. Unless they named a voice, offer two or three candidates with
their
preview_urls and let them pick.
- Choose on tone: what is the listener doing (half-watching a social clip wants attack and
momentum; following an explainer wants a voice that stays out of the way), and whose voice is it
meant to be (a brand narrator should stay neutral enough to reuse; a character should match the
age and register of the writing).
- Non-English script → check the row's
language, and that the model of Step 2 covers it.
- A
voice_id the user pastes themselves is taken as given.
- Reuse the chosen
voice_id for every clip in the job.
- Nothing matched → a normal result, not a dead end. Drop the narrowest facet —
use_case
first, then age — and search again. Only when gender and accent alone come back empty is the
account genuinely short of voices; then relay the tool's hint verbatim, since the cause and the fix
differ by provider and by whose key is in use.
Step 4: Prepare the text
text is read out word for word, so write it the way it should sound.
- Strip anything unspoken — stage directions, speaker labels, bracketed cues, markdown.
- Spell out numbers, dates, currency, acronyms, and URLs as a person would say them.
- Punctuate for pacing — commas and full stops become pauses, and are the main lever on rhythm.
Direct the delivery with stability and style (references/directing-the-read.md), never with instructions
written into the text.
Step 5: Generate
Speech comes only from audio_generate. If it errors, or no voice fits, say so and stop — never
substitute another text-to-speech tool the host happens to expose. A different engine means a
different voice, no access to the account's voices, and output outside the media directory.
Call audio_generate with a requests list — one object per clip, up to ten per call.
- Per object:
text and voice (both required — the voice_id from Step 3); model only when
Step 2 chose a non-default; speed, stability, style, similarity_boost, format as needed.
- Split only where the audio will actually be cut — per scene, or per section placed separately.
Objects generate independently, so a continuous read split across two of them seams audibly.
- Hold one
voice and model across every object, for the same reason. In a dialogue, one voice
per character, consistent across that character's lines.
- Repeat a line to get alternate takes — different voices when the choice is unclear, or the same
voice twice at low
stability. Worth it on one short line, not a whole script.
Step 6: Return
Share the audio file path(s). When the script was split, label each with the section it covers.
Edge cases
- Something other than speech is asked for (music, sound effects, ambience, re-voicing, dubbing,
cloning a voice from a sample) → say so plainly rather than substituting something else. In
particular, do not generate a clip through
generating-videos to get music or effects out of its
native audio: that bakes the sound into the picture, so it can never serve as a track the user
mixes. An already-cloned voice still works by its voice_id, and another language works by
translating the script and generating it fresh.
- Tracks need mixing or timing ("the voiceover under the music", "a swoosh on the logo") → deliver
clean speech and let the user assemble it in their editor.
- Part of the brief is speech and part isn't → state the limits in one message up front, then
deliver the speech. Never generate first and disclose the gaps after.
- Script over the model's character limit → split it at a natural break, or switch to a
higher-ceiling model.
error: "no_voices_available" → relay the hint; it distinguishes an empty account from a key
lacking permission to read voices, and the fixes differ.
- Part of a batch fails → keep the takes that worked and resend only the failed lines.
- The read itself came out wrong (flat, erratic, mispronounced, stress on the wrong word) →
references/directing-the-read.md diagnoses it symptom by symptom.
- Safety rejection → remove the sensitive wording and retry once.
- Generic failure → retry once as-is, then report the error.
error: "no_provider_configured" → relay the tool's hint (the user must set their key).
Reference
references/directing-the-read.md — tuning the delivery with stability, style,
similarity_boost and speed, and diagnosing a read that isn't working.
1---2name: generating-audio3description: ALWAYS read this skill before generating spoken audio or calling audio_generate — a voiceover, narration, an ad read, a character line, or any script read aloud. Turns a script into speech — picks the model and voice, prepares the text for reading, and splits a long script into clips. Use whenever the user asks for text-to-speech, a voiceover, narration, or to have something read or spoken aloud.4license: Apache-2.05---6
7# Audio Generation
8
9Turn a script into spoken audio via the `audio_generate` tool. Two decisions drive quality: **which
10voice** reads it, and **how the script is written for the ear**.
11
12**Scope.** Speech — a voice reading written words, delivered as its own audio file. Nothing here makes
13non-speech sound, alters audio that already exists, or combines two tracks into one.
14
15Lip-synced dialogue spoken by a character *inside* a video clip belongs to `generating-videos`.
16
17## Workflow
18
19### Step 1: Settle the script
20
21Generate only from the exact words that will be spoken.
22
23- **Supplied** → use them verbatim.
24- **Enough to write them** — the product, audience, platform, and length are known → draft the script
25 and show it before generating.
26- **Not enough** → ask. Never invent a tagline, product claim, or brand name to fill the gap.
27
28**Write to a duration.** Speech runs about two to three words a second, so a fifteen-second read is
29thirty to forty-five words. Set the word count before writing, and trim words rather than speeding up
30the delivery.
31
32### Step 2: Pick the model
33
34**`eleven-v3` is the default** — the most expressive read, and right for anything heard as a
35performance. Reach for another only on a clear signal:
36
37| Reach for another model when the script… | Model |
38| --- | --- |
39| Is a long, even read — an explainer, documentary narration, an audiobook chapter — where the voice must not drift | `eleven-multilingual-v2` |
40| Is high-volume, a throwaway draft, or cost-sensitive, and expressiveness doesn't matter | `eleven-flash-v2.5` |
41
42When the user names a model, use it. Per-request character limits differ sharply between models, and
43an over-limit script is rejected rather than truncated — `list_audio_models` carries each ceiling.
44
45### Step 3: Pick the voice
46
47Call `list_voices`, filtered by what the brief demands — `gender`, `accent`, `age`, `use_case`,
48`language`, or free-text `search`. Each row carries a `preview_url`.
49**There is no default voice**: every request needs a `voice_id` chosen here, passed as `voice`.
50Display names are not accepted.
51
52- A stated **gender, accent, or age is a hard filter** — apply it, don't trade it away on tone.
53 Read the attribute back from the row's own fields; **never infer it from the voice's name**.
54- **Let the user hear the options.** Unless they named a voice, offer two or three candidates with
55 their `preview_url`s and let them pick.
56- **Choose on tone**: what is the listener doing (half-watching a social clip wants attack and
57 momentum; following an explainer wants a voice that stays out of the way), and whose voice is it
58 meant to be (a brand narrator should stay neutral enough to reuse; a character should match the
59 age and register of the writing).
60- **Non-English script** → check the row's `language`, and that the model of Step 2 covers it.
61- A `voice_id` the user pastes themselves is taken as given.
62- Reuse the chosen `voice_id` for every clip in the job.
63- **Nothing matched** → a normal result, not a dead end. Drop the narrowest facet — `use_case`
64 first, then `age` — and search again. Only when gender and accent alone come back empty is the
65 account genuinely short of voices; then relay the tool's hint verbatim, since the cause and the fix
66 differ by provider and by whose key is in use.
67
68### Step 4: Prepare the text
69
70`text` is read out word for word, so write it the way it should sound.
71
72- **Strip anything unspoken** — stage directions, speaker labels, bracketed cues, markdown.
73- **Spell out** numbers, dates, currency, acronyms, and URLs as a person would say them.
74- **Punctuate for pacing** — commas and full stops become pauses, and are the main lever on rhythm.
75
76Direct the delivery with `stability` and `style` (`references/directing-the-read.md`), never with instructions
77written into the text.
78
79### Step 5: Generate
80
81Speech comes **only** from `audio_generate`. If it errors, or no voice fits, say so and stop — never
82substitute another text-to-speech tool the host happens to expose. A different engine means a
83different voice, no access to the account's voices, and output outside the media directory.
84
85Call `audio_generate` with a `requests` list — one object per clip, up to ten per call.
86
87- Per object: `text` and `voice` (both required — the `voice_id` from Step 3); `model` only when
88 Step 2 chose a non-default; `speed`, `stability`, `style`, `similarity_boost`, `format` as needed.
89- **Split only where the audio will actually be cut** — per scene, or per section placed separately.
90 Objects generate independently, so a continuous read split across two of them seams audibly.
91- **Hold one `voice` and `model` across every object**, for the same reason. In a dialogue, one voice
92 per character, consistent across that character's lines.
93- **Repeat a line to get alternate takes** — different voices when the choice is unclear, or the same
94 voice twice at low `stability`. Worth it on one short line, not a whole script.
95
96### Step 6: Return
97
98Share the audio file path(s). When the script was split, label each with the section it covers.
99
100## Edge cases
101
102- **Something other than speech is asked for** (music, sound effects, ambience, re-voicing, dubbing,
103 cloning a voice from a sample) → say so plainly rather than substituting something else. In
104 particular, do not generate a clip through `generating-videos` to get music or effects out of its
105 native audio: that bakes the sound into the picture, so it can never serve as a track the user
106 mixes. An already-cloned voice still works by its `voice_id`, and another language works by
107 translating the script and generating it fresh.
108- **Tracks need mixing or timing** ("the voiceover under the music", "a swoosh on the logo") → deliver
109 clean speech and let the user assemble it in their editor.
110- **Part of the brief is speech and part isn't** → state the limits in one message up front, then
111 deliver the speech. Never generate first and disclose the gaps after.
112- **Script over the model's character limit** → split it at a natural break, or switch to a
113 higher-ceiling model.
114- **`error: "no_voices_available"`** → relay the hint; it distinguishes an empty account from a key
115 lacking permission to read voices, and the fixes differ.
116- **Part of a batch fails** → keep the takes that worked and resend only the failed lines.
117- **The read itself came out wrong** (flat, erratic, mispronounced, stress on the wrong word) →
118 `references/directing-the-read.md` diagnoses it symptom by symptom.
119- **Safety rejection** → remove the sensitive wording and retry once.
120- **Generic failure** → retry once as-is, then report the error.
121- **`error: "no_provider_configured"`** → relay the tool's `hint` (the user must set their key).
122
123## Reference
124
125- `references/directing-the-read.md` — tuning the delivery with `stability`, `style`,
126 `similarity_boost` and `speed`, and diagnosing a read that isn't working.