Gemini Voice 3.5, Gemini Voice 3.1 Flash API: Pricing, Documentation

by Google

Google's Gemini voice models on one endpoint pair: Gemini 3.5 Transcribe turns recorded speech into text with speaker labels and word-level timestamps across 85+ locales, and Gemini 3.1 Flash TTS turns text into speech with 30 voices, natural-language delivery control and two-speaker dialogue. Both are billed per minute of audio.

Get API Key
Gemini Voice API

Models Version

WELCOME BONUS

Get $5 Free Credit on First Payment

No strings attached — add funds and get $5 bonus instantly

Claim Your $5 →

Gemini 3.5 Transcribe API Documentation

Google's Gemini 3.5 Transcribe converts pre-recorded speech to text, with automatic language identification across 85+ locales, speaker diarization, word-level timestamps and custom-vocabulary biasing. Accepts WAV, MP3, AIFF, AAC, OGG, FLAC, M4A, Opus, WebM and MPEG, up to 1 hour per request. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then fetch the JSON transcript from the returned url.

POST https://gateway.pixazo.ai/gemini-3-5-transcribe/v1/speech-to-text

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Speech to Text - Gemini 3.5 Transcribe

Request Code

POST https://gateway.pixazo.ai/gemini-3-5-transcribe/v1/speech-to-text
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3"
}
import requests

url = "https://gateway.pixazo.ai/gemini-3-5-transcribe/v1/speech-to-text"
headers = {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
  "audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3"
}

resp = requests.post(url, json=data, headers=headers)
print(resp.json())
const res = await fetch("https://gateway.pixazo.ai/gemini-3-5-transcribe/v1/speech-to-text", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
  },
  body: JSON.stringify({
  "audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3"
})
});
console.log(await res.json());
curl -X POST 'https://gateway.pixazo.ai/gemini-3-5-transcribe/v1/speech-to-text' \
  -H 'Content-Type: application/json' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
  --data-raw '{"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3"}'

Output

{
  "request_id": "gemini-3-5-transcribe_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/gemini-3-5-transcribe_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks).

Example: enable Webhook

curl -X POST 'https://gateway.pixazo.ai/gemini-3-5-transcribe/v1/speech-to-text' \
  -H 'Content-Type: application/json' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
  -H 'X-Webhook-URL: https://your-server.com/webhook' \
  --data-raw '{"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3"}'

Callback Payload (success)

{
  "request_id": "gemini-3-5-transcribe_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "gemini-3-5-transcribe",
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/transcript.json"
    ],
    "media_type": "application/json"
  },
  "duration": 19.17,
  "created_at": "2026-08-01T09:14:16.102Z",
  "completed_at": "2026-08-01T09:14:22.870Z"
}

Failure callback shape

{
  "request_id": "gemini-3-5-transcribe_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "gemini-3-5-transcribe",
  "error": "Description of the failure"
}

Delivery semantics

  • terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
  • sync mode: a Webhook callback on each status change.
  • Callbacks are idempotent on request_id — de-duplicate on it.
  • Respond 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
audio_urlYesstringa publicly reachable http(s) urlThe recording to transcribe. We fetch it server-side, so it must be reachable from the internet — a signed url is fine, a private one is not. Accepts WAV, MP3, AIFF, AAC, OGG, FLAC, M4A, Opus, WebM and MPEG.
language_codesNoarray— (auto-detected)BCP-47 codes, e.g. ["en-US"]Leave this out and the model identifies the language itself across 85+ locales, including speakers switching language mid-recording. Set it to pin the transcript to a known language.
modeNostringverbatimverbatim, smartverbatim transcribes exactly what was said, keeping filler words, repetitions and false starts. smart cleans that up — removing disfluencies, applying self-corrections, and formatting lists, numbers, dates and paragraph breaks. smart cannot be combined with diarization or timestamps.
diarizationNobooleanfalsetrue, falseLabel who is speaking, for up to 8 speakers. Each word in the transcript carries a speaker tag. Requires mode verbatim.
timestampsNobooleanfalsetrue, falseWord-level start and end times, in seconds. Requires mode verbatim.
custom_vocabularyNoarrayup to 1,000 termsBias the transcript toward terms the model would otherwise misspell — product names, people, domain jargon.

Limits

Audio up to 1 hour per request. Turning on diarization or timestamps lowers that ceiling to 30 minutes. Billing is per minute of input audio, rounded up to the next whole minute — so a 20-second clip and a 55-second clip both bill one minute.

Example Request

{
  "audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3"
}

Example Response

{
  "request_id": "gemini-3-5-transcribe_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/gemini-3-5-transcribe_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Bad request — a missing or out-of-range parameter. The message names the field.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance.
429Too many requests.
500Internal server error.

Retrieving Results

Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or ERROR), then download output.media_url.

curl 'https://gateway.pixazo.ai/v2/requests/status/gemini-3-5-transcribe_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'

Completed response

{
  "request_id": "gemini-3-5-transcribe_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "gemini-3-5-transcribe",
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/transcript.json"
    ],
    "media_type": "application/json"
  },
  "duration": 19.17,
  "created_at": "2026-08-01T09:14:16.102Z",
  "completed_at": "2026-08-01T09:14:22.870Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request.
output.media_urlarrayURL of the JSON transcript file. Fetch it to read text, and segments when you asked for timestamps or diarization.
output.media_typestringAlways application/json — the result is a transcript document, not audio.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is ERROR.

Status Values & Flow

QUEUEDPROCESSINGCOMPLETED (success) or ERROR (failure).

Pricing

Billed per minute of submitted audio, rounded up to the next whole minute — a 10-second clip and a 45-second clip both bill one minute. You are charged for the recording you send, not the length of the transcript. Failed requests are not billed. The current rate is shown on this model's page.

Gemini 3.5 Transcribe API Pricing

ResolutionPrice (USD)
Per minute of audio (rounded up to the next full minute)$0.005
2. Gemini 3.1 Flash TTS

Gemini 3.1 Flash TTS API Documentation

Google's Gemini 3.1 Flash TTS turns text into speech, with 30 prebuilt voices, natural-language control over delivery, optional two-speaker dialogue and 90+ languages detected automatically. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the WAV from the returned url.

POST https://gateway.pixazo.ai/gemini-3-1-flash-tts/v1/text-to-speech

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Text to Speech - Gemini 3.1 Flash TTS

Request Code

POST https://gateway.pixazo.ai/gemini-3-1-flash-tts/v1/text-to-speech
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{   "text": "Say warmly: Welcome back — your report is ready.",   "voice": "Kore" }
import requests

url = "https://gateway.pixazo.ai/gemini-3-1-flash-tts/v1/text-to-speech"
headers = {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {   "text": "Say warmly: Welcome back — your report is ready.",   "voice": "Kore" }

resp = requests.post(url, json=data, headers=headers)
print(resp.json())
const res = await fetch("https://gateway.pixazo.ai/gemini-3-1-flash-tts/v1/text-to-speech", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
  },
  body: JSON.stringify({   "text": "Say warmly: Welcome back — your report is ready.",   "voice": "Kore" })
});
console.log(await res.json());
curl -X POST 'https://gateway.pixazo.ai/gemini-3-1-flash-tts/v1/text-to-speech' \
  -H 'Content-Type: application/json' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
  --data-raw '{   "text": "Say warmly: Welcome back — your report is ready.",   "voice": "Kore" }'

Output

{
  "request_id": "gemini-3-1-flash-tts_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/gemini-3-1-flash-tts_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks).

Example: enable Webhook

curl -X POST 'https://gateway.pixazo.ai/gemini-3-1-flash-tts/v1/text-to-speech' \
  -H 'Content-Type: application/json' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
  -H 'X-Webhook-URL: https://your-server.com/webhook' \
  --data-raw '{   "text": "Say warmly: Welcome back — your report is ready.",   "voice": "Kore" }'

Callback Payload (success)

{
  "request_id": "gemini-3-1-flash-tts_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "gemini-3-1-flash-tts",
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/transcript.json"
    ],
    "media_type": "application/json"
  },
  "duration": 19.17,
  "created_at": "2026-08-01T09:14:16.102Z",
  "completed_at": "2026-08-01T09:14:22.870Z"
}

Failure callback shape

{
  "request_id": "gemini-3-1-flash-tts_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "gemini-3-1-flash-tts",
  "error": "Description of the failure"
}

Delivery semantics

  • terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
  • sync mode: a Webhook callback on each status change.
  • Callbacks are idempotent on request_id — de-duplicate on it.
  • Respond 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
textYesstringup to ~8,000 tokensWhat to say. This is also where you direct how it is said — the model follows natural-language direction, so "Say warmly and slowly: ..." works, as do inline tags like [whispers] and [laughs].
voiceNostringKoreZephyr, Puck, Charon, Kore, Fenrir, Leda, Orus, Aoede, Callirrhoe, Autonoe, Enceladus, Iapetus, Umbriel, Algieba, Despina, Erinome, Algenib, Rasalgethi, Laomedeia, Achernar, Alnilam, Schedar, Gacrux, Pulcherrima, Achird, Zubenelgenubi, Vindemiatrix, Sadachbia, Sadaltager, SulafatWhich of the 30 prebuilt voices to speak in. Ignored when speakers is given.
speakersNoarrayat most 2 entriesTwo-speaker dialogue. Each entry is {"speaker": "Joe", "voice": "Kore"}, where speaker matches a name used in your text. Supplying this replaces voice.

Limits

A session has a 32k-token context. Speech quality can drift on outputs longer than a few minutes, so split long scripts into separate requests. Language is detected from the text automatically across 90+ languages. Billing is per minute of generated audio, rounded up to the next whole minute.

Example Request

{   "text": "Say warmly: Welcome back — your report is ready.",   "voice": "Kore" }

Example Response

{
  "request_id": "gemini-3-1-flash-tts_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/gemini-3-1-flash-tts_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Bad request — a missing or out-of-range parameter. The message names the field.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance.
429Too many requests.
500Internal server error.

Retrieving Results

Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or ERROR), then download output.media_url.

curl 'https://gateway.pixazo.ai/v2/requests/status/gemini-3-1-flash-tts_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'

Completed response

{
  "request_id": "gemini-3-1-flash-tts_01a0xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "gemini-3-1-flash-tts",
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/transcript.json"
    ],
    "media_type": "application/json"
  },
  "duration": 19.17,
  "created_at": "2026-08-01T09:14:16.102Z",
  "completed_at": "2026-08-01T09:14:22.870Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request.
output.media_urlarrayURL of the generated WAV file (PCM, 24 kHz, mono).
output.media_typestringAlways audio/wav.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is ERROR.

Status Values & Flow

QUEUEDPROCESSINGCOMPLETED (success) or ERROR (failure).

Pricing

Billed per minute of generated audio, rounded up to the next whole minute — a 10-second clip and a 45-second clip both bill one minute. You are charged for the audio produced, not the text you submit. Failed requests are not billed. The current rate is shown on this model's page.

Gemini 3.1 Flash TTS API Pricing

ResolutionPrice (USD)
Per minute of generated audio (rounded up to the next full minute)$0.0384

⚡ Performance

Live usage measured on Pixazo's gateway, split by model version. Generation time is how long a generation takes end-to-end (lower is better). Success rate is the percent of generations that complete (higher is better).

Show data for the last
Generations
200last 30d
~7 per day
Success rate
100.0%
of completed generations
Generation time
81.8savg
p95 94.3s
Requests
Aug 1max 100Aug 30
Gemini 3.5 TranscribeAvg 3/day
Gemini 3.1 Flash TTSAvg 3/day
Generation Time
Aug 1max 94.3sAug 30
Gemini 3.5 TranscribeAvg 94.3s
Gemini 3.1 Flash TTSAvg 69.3s
Error Rate
Aug 1max 5.0%Aug 30
Gemini 3.5 TranscribeAvg 0.0%
Gemini 3.1 Flash TTSAvg 0.0%

〰 Uptime

Percent of generations that succeeded over the selected period, per model version.

Avg. Success Rate (30d)
100.00%
across all generations of this model family
Uptime
Aug 1max 100%Aug 30
Gemini 3.5 TranscribeAvg 100.00%
Gemini 3.1 Flash TTSAvg 100.00%