Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate speech from text via POST /audio/speech. Covers TTS models (Kokoro, Qwen 3, xAI, Inworld, Chatterbox, Orpheus, ElevenLabs Turbo, MiniMax, Gemini Flash), voices per family, output formats (mp3/opus/aac/flac/wav/pcm), streaming, prompt/emotion styling, temperature/top_p, and language hints.
.claude/skills/sediman-agent-venice-audio-speech/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 56% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 107% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 201% | 0% |
/audio/speech)POST /api/v1/audio/speech converts text to an audio stream or file. OpenAI-compatible — the OpenAI SDK's audio.speech.create() works as a drop-in.
For music generation (lyrics + instrumental), see venice-audio-music. For transcription (audio → text), see venice-audio-transcription.
bashcurl https://api.venice.ai/api/v1/audio/speech \ -H "Authorization: Bearer $VENICE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "tts-xai-v1", "voice": "eve", "input": "Hello, welcome to Venice Voice.", "response_format": "mp3", "speed": 1.0, "streaming": false }' --output hello.mp3
Response is the raw audio (Content-Type matches response_format).
| Field | Type | Default | Notes | |---|---|---|---| | input | string | — | Required. Up to 4096 characters. | | model | enum | tts-kokoro (OpenAPI schema default) | See model list below. tts-xai-v1 is the recommended frontier default; pick the model that fits your voice + language needs. | | voice | enum | model-specific (e.g. eve for tts-xai-v1) | Voice is model-specific — wrong combo = 400. See voice families. | | response_format | mp3 / opus / aac / flac / wav / pcm | mp3 | pcm returns 24 kHz signed-16 LE for pipelines. | | speed | number | 1.0 | Range 0.25–4.0. | | streaming | bool | false | true → streamed sentence-by-sentence as audio continues to generate. | | language | string | — | Optional hint. Accepted form depends on model (Qwen 3 = full names like English; xAI / ElevenLabs = ISO 639-1 like en; MiniMax = full names). Unsupported values silently ignored. | | prompt | string, ≤ 500 | — | Emotion / style cue. Only for models with supportsPromptParam (Qwen 3 currently). Examples: "Very happy.", "Sad and slow.". | | temperature | 0–2 | — | Sampling temperature. Only for models with supportsTemperatureParam (Qwen 3, Orpheus, Chatterbox HD). | | top_p | 0–1 | — | Only Qwen 3 currently. |
| Model ID | Family | Highlights | |---|---|---| | tts-xai-v1 | xAI | Recommended default. Conversational style, ISO 639-1 language hints. | | tts-kokoro | Kokoro | OpenAPI schema default. Multilingual, many voices across languages. | | tts-qwen3-0-6b / tts-qwen3-1-7b | Qwen 3 | Emotion control via prompt, temperature, top_p. | | tts-inworld-1-5-max | Inworld | Character-driven voices (Craig, Ashley, …). | | tts-chatterbox-hd | Chatterbox | HD voices (Aurora, Blade, …), temperature. | | tts-orpheus | Orpheus | Conversational (tara, leah, jess, leo, …), temperature. | | tts-elevenlabs-turbo-v2-5 | ElevenLabs Turbo | Rachel, Aria, Charlotte, Roger, … | | tts-minimax-speech-02-hd | MiniMax | WiseWoman, DeepVoiceMan, … | | tts-gemini-3-1-flash | Gemini Flash | Star-named voices (Achernar, Achird, Zephyr, …). |
Always inspect the entry for your model in GET /models?type=tts — model_spec.voices is the authoritative voice list. Per-model toggles like supportsPromptParam, supportsTemperatureParam, supportsTopPParam live on the internal model definitions but are not currently exposed on /models — treat the request schema below (instructions, temperature, top_p) as the support matrix.
af_*, am_* — American female / malebf_*, bm_* — British female / malezf_*, zm_* — Chineseff_*, hf_*, hm_*, if_*, im_*, jf_*, jm_*, pf_*, pm_*, ef_*, em_* — French, Hindi, Italian, Japanese, Portuguese, Spanishaf_sky, af_bella, am_adam, bm_george, zf_xiaoxiaoVivian, Serena, Ono_Anna, Sohee, Uncle_Fu, Dylan, Eric, Ryan, Aideneve, ara, rex, sal, leotara, leah, jess, mia, zoe, dan, zacCraig, Ashley, Olivia, Sarah, Elizabeth, Priya, Alex, Edward, Theodore, Ronald, Mark, Hades, Luna, PixieAurora, Britney, Siobhan, Vicky, Blade, Carl, Cliff, Richard, RicoRachel, Aria, Laura, Charlotte, Alice, Matilda, Jessica, Lily, Roger, Charlie, George, Callum, River, Liam, Will, Chris, Brian, Daniel, BillWiseWoman, FriendlyPerson, InspirationalGirl, CalmWoman, LivelyGirl, LovelyGirl, SweetGirl, ExuberantGirl, DeepVoiceMan, CasualGuy, PatientMan, YoungKnight, DeterminedMan, ImposingManner, ElegantManAchernar, Achird, Algenib, Algieba, Alnilam, Aoede, Autonoe, Callirrhoe, Charon, Despina, Enceladus, Erinome, Fenrir, Gacrux, Iapetus, Kore, Laomedeia, Leda, Orus, Pulcherrima, Puck, Rasalgethi, Sadachbia, Sadaltager, Schedar, Sulafat, Umbriel, Vindemiatrix, Zephyr, ZubenelgenubiPass a voice that isn't in the chosen model's list and you get 400.
json{ "model": "tts-xai-v1", "voice": "eve", "input": "Hello, this is a long document to narrate. ...", "streaming": true, "response_format": "mp3" }
With streaming: true, the HTTP body is a chunked audio stream. Decode as it arrives — useful for latency-sensitive UIs. response_format: pcm pairs well with browser Web Audio API for raw playback.
tsimport OpenAI from 'openai' import fs from 'node:fs/promises' const client = new OpenAI({ apiKey: process.env.VENICE_API_KEY, baseURL: 'https://api.venice.ai/api/v1', }) const mp3 = await client.audio.speech.create({ model: 'tts-xai-v1', voice: 'eve', input: 'Hello from Venice.', response_format: 'mp3', }) await fs.writeFile('hello.mp3', Buffer.from(await mp3.arrayBuffer()))
json{ "model": "tts-qwen3-1-7b", "voice": "Vivian", "input": "We did it!", "prompt": "Excited and energetic.", "temperature": 0.9, "top_p": 0.95 }
For other families, emotion comes from the voice choice itself (e.g. Inworld Hades vs Pixie). prompt / temperature / top_p are silently ignored.
| Code | Meaning | |---|---| | 400 | Bad voice/model combo, input too long (>4096), language hint rejected by a strict model, invalid voice for the chosen model. | | 401 | Auth / Pro-only model. | | 402 | Insufficient balance. | | 429 | Rate limited. | | 500 / 503 | Inference / capacity issue — retry with jitter. |
input hard cap is 4096 chars. For books / long content, split on sentence boundaries and concatenate audio client-side.streaming: true + SDKs: some OpenAI SDK versions don't expose streaming for audio.speech.create; call the REST endpoint directly and consume the HTTP body.speed compounds with model internal speech rate — extreme values (0.25, 4.0) often sound unnatural; keep within 0.8–1.3 for narration.eve ≠ EVE, af_sky ≠ AF_SKY).| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 14,220 | 9,052 | -36% | 1 | 1 | 0% | 2,452 | 4,181 | +71% | 0 | 0 | — |
case-02 | fail→pass | 16,090 | 6,071 | -62% | 1 | 1 | 0% | 2,618 | 3,603 | +38% | 0 | 0 | — |
case-03 | pass→pass | 12,395 | 5,480 | -56% | 1 | 1 | 0% | 2,274 | 3,450 | +52% | 0 | 0 | — |
case-04 | fail→pass | 16,121 | 7,430 | -54% | 1 | 1 | 0% | 2,370 | 3,699 | +56% | 0 | 0 | — |
case-05 | pass→pass | 14,018 | 6,847 | -51% | 1 | 1 | 0% | 2,399 | 3,814 | +59% | 0 | 0 | — |
case-06 | fail→pass | 9,526 | 3,922 | -59% | 1 | 1 | 0% | 1,541 | 3,188 | +107% | 0 | 0 | — |
case-07 | fail→pass | 6,566 | 4,572 | -30% | 1 | 1 | 0% | 1,093 | 3,295 | +201% | 0 | 0 | — |
case-08 | fail→pass | 12,952 | 3,249 | -75% | 1 | 1 | 0% | 2,150 | 3,044 | +42% | 0 | 0 | — |
case-09 | fail→pass | 7,981 | 3,602 | -55% | 1 | 1 | 0% | 1,284 | 3,091 | +141% | 0 | 0 | — |
case-10 | fail→pass | 6,451 | 2,484 | -61% | 1 | 1 | 0% | 1,049 | 2,948 | +181% | 0 | 0 | — |
case-11 | fail→pass | 8,006 | 3,758 | -53% | 1 | 1 | 0% | 1,417 | 3,169 | +124% | 0 | 0 | — |
case-12 | fail→pass | 8,571 | 2,928 | -66% | 1 | 1 | 0% | 1,355 | 3,016 | +123% | 0 | 0 | — |
case-13 | fail→pass | 10,448 | 3,182 | -70% | 1 | 1 | 0% | 1,731 | 3,061 | +77% | 0 | 0 | — |
case-14 | pass→pass | 12,576 | 6,351 | -49% | 1 | 1 | 0% | 2,156 | 3,654 | +69% | 0 | 0 | — |
case-15 | pass→pass | 3,343 | 2,190 | -34% | 1 | 1 | 0% | 547 | 2,867 | +424% | 0 | 0 | — |
case-16 | pass→pass | 15,365 | 3,943 | -74% | 1 | 1 | 0% | 2,369 | 3,139 | +33% | 0 | 0 | — |
case-17 | pass→pass | 5,554 | 2,011 | -64% | 1 | 1 | 0% | 852 | 2,773 | +225% | 0 | 0 | — |
case-18 | pass→pass | 7,850 | 3,361 | -57% | 1 | 1 | 0% | 1,119 | 3,038 | +171% | 0 | 0 | — |
case-19 | fail→pass | 13,808 | 4,042 | -71% | 1 | 1 | 0% | 2,008 | 3,217 | +60% | 0 | 0 | — |
case-20 | pass→pass | 4,758 | 2,937 | -38% | 1 | 1 | 0% | 699 | 3,004 | +330% | 0 | 0 | — |
case-21 | pass→pass | 4,987 | 2,051 | -59% | 1 | 1 | 0% | 801 | 2,831 | +253% | 0 | 0 | — |
case-22 | fail→pass | 8,276 | 3,461 | -58% | 1 | 1 | 0% | 1,228 | 3,117 | +154% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +59 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.