Dialogue tools
Generate speech with the generate_dialogue tool. Pick one of four providers with the provider parameter:
- ElevenLabs v3 (
provider: "elevenlabs", the default): 26 human-named voices, the most natural prosody. One voice per call. - Google Gemini 3.1 Flash TTS (
provider: "google"or"gemini"): 30 voices, 70+ languages, a natural-language style prompt, and inline expressive tags ([sigh],[laughing],[whispering],[shouting],[extremely fast],[like dracula]) that are actually performed. One voice per call. - Gemini 3.8 Flash TTS (
provider: "gemini-3.8"): a two-speaker conversation in one call, with a delivery style per line and angle-bracket tags such as<laugh>. 70 voices. - Seed 1.0 Audio (
provider: "seed"): prompt-driven generative audio. You describe the voices, sound effects and music in prose instead of picking a voice, and can clone up to 3 voices from audio references.
Rates differ by provider and are never fixed in these docs: read them from get_models (filter model_type: "speech") or call estimate before generating. ElevenLabs, Gemini 3.1 and Gemini 3.8 bill per 1,000 characters; Seed bills per second of output.
To dub an existing video into other languages, use generate_dubbing below.
#ElevenLabs v3 (default)
elevenlabs/v3 accepts these 26 voices (case-sensitive). Any value outside this list is rejected with 400 Unsupported voice and you are not charged. Audio tags like [laughs] are stripped server-side before synthesis (not spoken).
#Female voices
| Voice ID | Description | Preview |
|---|---|---|
| Rachel | Calm, articulate American | |
| Aria | Expressive, raspy American | |
| Domi | Strong, confident young American | |
| Sarah | Soft, warm young American | |
| Jane | Mature, dignified Australian | |
| Juniper | Natural, articulate American | |
| Arabella | Mysterious British narrator | |
| Hope | Bright, upbeat American | |
| Blondie | Casual American conversationalist | |
| Priyanka | Sultry, soothing Indian | |
| Alexandra | Conversational young American | |
| Monika | Deep, natural Indian |
#Male voices
| Voice ID | Description | Preview |
|---|---|---|
| Drew | Well-rounded American narrator | |
| Clyde | Gritty war-veteran character | |
| Paul | Authoritative ground reporter | |
| Dave | Conversational young British | |
| Roger | Classy American businessman | |
| Fin | Sailor character, Irish accent | |
| James | Calm Australian narrator | |
| Bradford | Theatrical, articulate British | |
| Reginald | Intense, dramatic British character | |
| Gaming | Animated, energetic gaming character | |
| Austin | Easygoing American country | |
| Kuon | Cheerful, steady character voice | |
| Mark | Casual, relaxed American | |
| Grimblewood | Gruff fantasy creature character |
#Google Gemini 3.1 Flash TTS
Pass provider: "google". Gemini adds a natural-language style prompt (set the tone, pace, accent, emotion, or a character) and performs inline [tags] instead of stripping them. It accepts 30 voices (case-sensitive) and BCP-47 language codes.
Inline tags are performed, not stripped:
[sigh],[laughing],[uhm],[whispering],[shouting],[sarcasm],[robotic],[extremely fast],[short pause]/[medium pause]/[long pause], and free-form descriptive tags like[like dracula]or[excitedly].
#Female voices
| Voice ID | Character | Preview |
|---|---|---|
| Kore | Firm | |
| Zephyr | Bright | |
| Leda | Youthful | |
| Aoede | Breezy | |
| Callirrhoe | Easy-going | |
| Autonoe | Bright | |
| Despina | Smooth | |
| Erinome | Clear | |
| Laomedeia | Upbeat | |
| Achernar | Soft | |
| Gacrux | Mature | |
| Pulcherrima | Forward | |
| Vindemiatrix | Gentle | |
| Sulafat | Warm |
#Male voices
| Voice ID | Character | Preview |
|---|---|---|
| Puck | Upbeat | |
| Charon | Informative | |
| Fenrir | Excitable | |
| Orus | Firm | |
| Enceladus | Breathy | |
| Iapetus | Clear | |
| Umbriel | Easy-going | |
| Algenib | Gravelly | |
| Algieba | Smooth | |
| Schedar | Even | |
| Achird | Friendly | |
| Zubenelgenubi | Casual | |
| Sadachbia | Lively | |
| Sadaltager | Knowledgeable | |
| Alnilam | Firm | |
| Rasalgethi | Informative |
Languages: BCP-47 codes (e.g. en-US, en-GB, es-ES, es-MX, pt-BR, fr-FR, de-DE, it-IT, ja-JP, ko-KR, hi-IN, ar-001, ru-RU, ro-RO, tr-TR, vi-VN, th-TH, and 70+ more), or auto to auto-detect. Default en-US. Call get_limits_for_model('text-to-dialogue-gemini') for the full list.
<a id="gemini-3-8"></a>
#Gemini 3.8 Flash TTS
Pass provider: "gemini-3.8". This is the provider for a conversation between two voices, or for one voice whose delivery changes line by line. Output is WAV (24 kHz mono).
- Simple:
text+voice(defaultFola), withstyle_promptas that line's delivery. - Dialogue:
speakersis a list of 1 or 2 items,[{"voice": "Fola"}, {"voice": "Zephyr"}], numbered Speaker 1 and Speaker 2 in order.dialogue_turnsis the ordered script,[{"speaker": "Speaker 1", "text": "...", "style": "slow and dry"}, ...], up to 50 turns. Every turn's speaker must be declared inspeakers.textis ignored whendialogue_turnsis set. styleper turn (optional): free-form tone, emotion or pace, for example"tired night-shift radio host, slow and dry". Up to 500 characters per turn and 2,000 across all turns.filler_words: trueadds natural hesitations such as um and uh. It only applies with two speakers.- Tags use angle brackets, inline in a turn's text:
<laugh>,<sigh>,<whispers>,<short pause>,<long pause>,<gasp>,<chuckle>,<breath>,<cough>,<yawn>and the rest of the 40 supported tags.[square]tags are not performed by this model. - No
language_code: the model reads the language from the text. - Limit: up to 5,000 characters across all turns, tags included. Unknown voices or speakers are rejected before billing.
- Billing: per 1,000 characters of turn text, tags included, with a minimum of 1 credit.
Voices (70), grouped by use case:
| Use case | Voices |
|---|---|
| Tutor | Bodi, Lumi, Sadaltager, Sola, Sulafat, Varo, Zephyr |
| Commercial voiceover | Koda, Kore, Nika, Tavi, Zeno |
| Instructional | Algenib, Despina, Erinome, Kira, Ludo, Mako, Rasalgethi, Rina |
| Podcast | Alnilam, Brio, Jori, Laomedeia, Rami, Veda |
| Storyteller | Achird, Enzo, Riko, Sami, Zali, Zubenelgenubi |
| Digital assistant | Algieba, Aoede, Autonoe, Callirrhoe, Enceladus, Gero, Iapetus, Neno, Olin, Tari, Umbriel |
| Call center | Achernar, Charon, Daro, Fola, Hali, Milo, Puck |
| Concierge | Arlo, Cleo, Fenrir, Finn, Leda, Lora, Orus |
| Tech support | Enya, Jett, Knox, Nyla, Sadachbia, Vindemiatrix |
| Professional | Cruz, Elio, Gacrux, Pulcherrima, Schedar, Tova, Zuri |
Call get_limits_for_model('gemini-3-8-flash-tts') for the current list.
<a id="seed"></a>
#Seed 1.0 Audio
Pass provider: "seed". Seed is prompt-driven: text is a free-form "director's script" that can produce voices, sound effects and background music together, not a fixed voice reading words verbatim. There is no voice parameter, [tags] are not used, and the ElevenLabs tuning parameters do not apply. Describe each voice (gender, age, accent, timbre, emotion) in the prose. Fetch the seed-audio-prompting skill before writing the prompt; a bare line gives bare output.
text(required): the prompt, up to 2,048 characters.- References (optional; image and audio cannot be mixed):
- one image, as
image_url(HTTPS) or base64image_data, to guide voice and mood; or - up to 3 audio references for voice cloning, as
audio_references: a list where each item is one of{"audio_url": "..."},{"audio_data": "<base64>"}or{"speaker": "..."}, each clip up to 30 seconds. Tag each cloned voice intextby upload order as<<TGT_SPK1>>,<<TGT_SPK2>>,<<TGT_SPK3>>(for exampleMarcus (..., the actor is <<TGT_SPK1>>) says: "...").@Voice1,@Audio1and@Speaker1are also accepted and normalized server-side.
- one image, as
audio_config(optional):format(mp3,wav,ogg_opus,pcm),sample_rate,speech_rate(-50 to 100),loudness_rate(-50 to 100),pitch_rate(-12 to 12).- Limits: each reference up to 10 MB, at most 3 audio references or 1 image, output capped at 120 seconds.
- Billing: per second of output (capped at 120 seconds), minimum 1 credit.
Example (Seed, two voices described in prose):
{
"provider": "seed",
"text": "A quiet coffee shop at dawn, soft rain on the windows. A warm, low-voiced barista in her fifties says: \"First cup's on the house.\" A sleepy young man laughs and answers: \"You say that every morning.\""
}
#generate_dialogue
Generate a speech clip.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
text (or prompt) | string | Yes (except Gemini 3.8 with dialogue_turns) | ElevenLabs: 5 to 5,000 characters (after [bracket] tags are stripped). Google: up to 4,000 bytes (UTF-8), inline [tags] kept. Gemini 3.8: up to 5,000 characters, tags included. Seed: the prompt, up to 2,048 characters. |
provider | string | No | elevenlabs (default), google (or gemini), gemini-3.8 or seed. |
voice | string | No | A voice ID for the chosen provider. Default: Rachel (ElevenLabs) / Kore (Google) / Fola (Gemini 3.8). Not used by Seed. |
speakers | array | No | Gemini 3.8 only. 1 or 2 items, {"voice": "..."}, numbered Speaker 1 and Speaker 2 in order. |
dialogue_turns | array | No | Gemini 3.8 only. Ordered {"speaker", "text", "style"} items, up to 50. |
filler_words | boolean | No | Gemini 3.8 only. Adds natural hesitations; two speakers only. Default false. |
image_url / image_data | string | No | Seed only. One image reference (HTTPS URL or base64). Cannot be combined with audio references. |
audio_references | array | No | Seed only. Up to 3 voice-cloning references. |
audio_config | object | No | Seed only. Output format, sample rate, speech rate, loudness and pitch. |
style_prompt | string | No | Google and Gemini 3.8. Natural-language delivery direction (tone, pace, accent, emotion, character). Google: up to 4,000 bytes; text + style_prompt must be ≤ 8,000 bytes combined. Default: Say the following. Gemini 3.8: the delivery of a simple single-line request. |
language_code | string | No | ElevenLabs: ISO code (default en; 29 supported). Google: BCP-47 code (default en-US) or auto. Not used by Gemini 3.8 or Seed. |
stability | number | No | ElevenLabs only. 0..1, default 0.5. Higher = more stable, lower = more expressive. |
similarity_boost | number | No | ElevenLabs only. 0..1, default 0.75. |
style | number | No | ElevenLabs only. 0..1, default 0. Style exaggeration. |
speed | number | No | ElevenLabs only. 0.7..1.2, default 1.0. |
previous_text / next_text | string | No | ElevenLabs only. Surrounding context to keep prosody consistent across stitched chunks. |
ElevenLabs strips
[HEY]/[laughs]/[whispers]before synthesis. Google performs inline tags — see the tag list above.
Example (Google Gemini):
{
"provider": "google",
"text": "[whispering] I have a secret. [laughing] Just kidding!",
"voice": "Callirrhoe",
"style_prompt": "Speak playfully, like sharing a fun secret with a friend.",
"language_code": "en-US"
}
Example (Gemini 3.8, two speakers):
{
"provider": "gemini-3.8",
"speakers": [{ "voice": "Fola" }, { "voice": "Zephyr" }],
"dialogue_turns": [
{ "speaker": "Speaker 1", "text": "Did you hear that? <short pause> Something moved.", "style": "nervous, whispering" },
{ "speaker": "Speaker 2", "text": "<laugh> It's the cat. It's always the cat.", "style": "amused, relaxed" }
],
"filler_words": true
}
Example (ElevenLabs):
{
"text": "Welcome back, ready to generate?",
"voice": "Rachel",
"stability": 0.5,
"language_code": "en"
}
Response: Returns a generation_id. Poll with get_status.
#Multi-voice scenes
For a conversation between two speakers, use Gemini 3.8 (provider: "gemini-3.8") with speakers and dialogue_turns: the whole exchange comes back as one file. Seed can also voice several characters in one prompt. ElevenLabs and Gemini 3.1 are single-voice: call the tool once per line (ElevenLabs: pass previous_text / next_text for prosody continuity), then concatenate the resulting audio files yourself.
#get_status
Use the generation_id returned by generate_dialogue to check progress. When the status is completed, the audio file URL is in the outputs array (media_type: "audio").
<a id="generate_dubbing"></a>
#generate_dubbing
Translates and re-voices the speech already in a video, and returns one dubbed MP4 per language. Two engines: sonilo-dubbing (default) and elevenlabs-dubbing (ElevenLabs, 90+ languages including Romanian, voice cloning, a lower per-second rate). It writes no music, effects or subtitles, and it cannot add speech to a silent clip. This is the most expensive model on the platform and generations cannot be refunded, so quote with estimate and get the user's explicit go-ahead first.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
video_url | string | Yes | HTTPS URL of the clip, up to 300 seconds. For a local file, call get_upload_url(model_id=<engine id>), let the user upload, then get_upload_session(token); uploading this way also measures the duration, which makes the price exact. |
languages | array | Yes | One or more of en, zh_cn, ja, ko, pt, pt_br, es, es_419, de, fr, it, ru, th, ar, tr, vi, id. No default. pt_br is Brazilian Portuguese and es_419 Latin American Spanish; plain pt and es are separate options, not synonyms. Romanian is not available on Sonilo. For elevenlabs-dubbing: BCP-47 codes such as es, es-MX, pt-BR, fr-CA, ro, pl, hi, 1 to 10 per run; the full list is in get_models. Ask the user which languages they want, because each one is charged in full. |
model | string | No | sonilo-dubbing (default) or elevenlabs-dubbing. Options of one engine are refused on the other. |
ducking | boolean | No | Sonilo only. Lowers the clip's own music and effects while the dubbed voice speaks. Free, default false. |
source_language | string | No | ElevenLabs only. The language spoken in the clip, or auto (default) to detect it. |
cloning_strength | integer | No | ElevenLabs only. 0 to 10, default 7: how closely the dubbed voices clone the original speakers. Lower gives more natural delivery in the target language. |
duration_seconds | number | No | Clip length, when it is not already known from an upload or one of your own generations. |
Billing: clip seconds multiplied by the number of languages, at the engine's own per-second rate. Sonilo applies a 10-second minimum to that total rather than to each language; ElevenLabs has no minimum. Three languages cost three times one. Quote it with estimate(model=<engine id>, reference_video_seconds=<clip seconds>, variant_count=<number of languages>).
Response: {generation_id, status: "pending", languages}. Poll get_status until completed or failed: the poll is also what settles the run, so keep polling to the end. Each output's metadata.language names its language.
#Credits and limits
- Cost: read the live rate from
get_modelsor call estimate; rates differ by provider. ElevenLabs, Gemini 3.1 and Gemini 3.8 bill per 1,000 characters (rounding: decimal ≤ 0.3 floors, > 0.3 ceils; Gemini 3.8 counts tags as characters). Seed bills per second of output, capped at 120 seconds. - Minimum: 1 credit for any non-empty request.
- Minimum length: 5 characters after audio tags are stripped.
- Maximum length: ElevenLabs 5,000 characters; Google 4,000 bytes for
text(and ≤ 8,000 bytes fortext+style_promptcombined); Gemini 3.8 5,000 characters across all turns, tags included; Seed 2,048 characters of prompt.
See Limitations for full details.

