# Gemini TTS API

> Tekstistä puheeksi -malli, jossa on 30 ääntä, monipuhujakeskustelu, tyyliohjeet ja Flash- tai Pro-mallin valinta

Muuntaa enintään 50,000 merkkiä tekstiä puheeksi. Valitse `voice` sekä `model`: gemini-2.5-flash-tts tai gemini-2.5-pro-tts. `style_instructions` (enintään 4000 merkkiä) ohjaa ilmaisua, ja `speakers` sisältää 2–10 tietuetta monipuhujakäsikirjoituksia varten. Valinnaisia ovat `language_code`, `temperature` 0–2 sekä wav-, mp3- tai ogg_opus-tuloste.

- Model id: `gemini-tts`
- Made by: Google
- Category: Text to Speech
- Output: audio
- Estimated price per run: $0.03 / run (cheapest run $0.03 (30 API credits))
- Run: `POST https://api.doitong.com/v1/run/gemini-tts`
- Quote: `POST https://api.doitong.com/v1/quote/gemini-tts`
- Docs page: https://doitong.com/fi/developers/models/gemini-tts

## Pricing

Price: **$0.03 / run**. Estimated from the typical cost of one run. The quote is exactly what the run charges.

The full example input below costs $0.03 = 30 API credits (1 request × 30 API credits).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.com/v1/quote/gemini-tts` with the same JSON body returns the exact price for that input; the quote is exactly what a run charges. Invalid input is never charged and failed or canceled requests are refunded automatically.

## Input parameters

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `prompt` |  | string | yes |  | 1 – 50000 characters | Gemini TTS:n puheteksti, joka hyväksyy tyylin, tempon, aksentin ja tunteen tekstinsisäiset luonnollisen kielen ohjeet, kuten 'Say cheerfully: Have a wonderful day!'. Tekstinsisäiset merkit, kuten [slowly], [whispering], [excited] ja [extremely fast], ohjaavat myös tempoa ja tyyliä. Usean puhujan rivien on alettava speakers-kentän aliaksilla, esimerkiksi 'Alice: Hello!\nBob: Hi!'. |
| `style_instructions` |  | string \| null | no |  | ≤ 4000 characters | Valinnaiset luonnollisen kielen ohjeet, jotka pidetään erillään puhutusta sisällöstä ja lisätään ennen kehotetta ilmaisun, aksentin, tempon, sävyn ja tunteen muokkaamiseksi. Esimerkkejä ovat 'Speak warmly and slowly', 'Read this as a dramatic newscast', 'Use a British accent with a cheerful tone' ja 'Whisper mysteriously'. |
| `voice` |  | enum (string) | no | `Kore` | `Achernar`, `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`, `Zubenelgenubi` | Yhden puhujan äänivalinta 30 eri esiasetuksesta; speakers-asetuksen määrittäminen poistaa tämän valinnan käytöstä. Suosittuja naisääniä ovat Kore, jonka ilmaisu on voimakas ja päättäväinen, Zephyr, jonka ilmaisu on kirkas ja selkeä, sekä Aoede, jonka ilmaisu on lämmin ja melodinen; suosittuja miesääniä ovat Puck, pirteä ja eloisa, sekä Charon, rauhallinen ja ammattimainen. |
| `model` |  | enum (string) | no | `gemini-2.5-flash-tts` | `gemini-2.5-flash-tts`, `gemini-2.5-pro-tts` | Gemini TTS -mallin valinta. Käytä rakenteisissa työnkuluissa, kuten äänikirjoissa, podcasteissa tai asiakastuessa, korkeimman laadun saavuttamiseksi mallia gemini-2.5-pro-tts. |
| `language_code` |  | enum (string) \| null | no |  | `Arabic (Egypt)`, `Bangla (Bangladesh)`, `Dutch (Netherlands)`, `English (India)`, `English (US)`, `French (France)`, `German (Germany)`, `Hindi (India)`, `Indonesian (Indonesia)`, `Italian (Italy)`, `Japanese (Japan)`, `Korean (South Korea)`, `Marathi (India)`, `Polish (Poland)`, `Portuguese (Brazil)`, `Romanian (Romania)`, `Russian (Russia)`, `Spanish (Spain)`, `Tamil (India)`, `Telugu (India)`, `Thai (Thailand)`, `Turkish (Turkey)`, `Ukrainian (Ukraine)`, `Vietnamese (Vietnam)`, `Afrikaans (South Africa)`, `Albanian (Albania)`, `Amharic (Ethiopia)`, `Arabic (World)`, `Armenian (Armenia)`, `Azerbaijani (Azerbaijan)`, `Basque (Spain)`, `Belarusian (Belarus)`, `Bulgarian (Bulgaria)`, `Burmese (Myanmar)`, `Catalan (Spain)`, `Cebuano (Philippines)`, `Chinese Mandarin (China)`, `Chinese Mandarin (Taiwan)`, `Croatian (Croatia)`, `Czech (Czech Republic)`, `Danish (Denmark)`, `English (Australia)`, `English (UK)`, `Estonian (Estonia)`, `Filipino (Philippines)`, `Finnish (Finland)`, `French (Canada)`, `Galician (Spain)`, `Georgian (Georgia)`, `Greek (Greece)`, `Gujarati (India)`, `Haitian Creole (Haiti)`, `Hebrew (Israel)`, `Hungarian (Hungary)`, `Icelandic (Iceland)`, `Javanese (Java)`, `Kannada (India)`, `Konkani (India)`, `Lao (Laos)`, `Latin (Vatican City)`, `Latvian (Latvia)`, `Lithuanian (Lithuania)`, `Luxembourgish (Luxembourg)`, `Macedonian (North Macedonia)`, `Maithili (India)`, `Malagasy (Madagascar)`, `Malay (Malaysia)`, `Malayalam (India)`, `Mongolian (Mongolia)`, `Nepali (Nepal)`, `Norwegian Bokmal (Norway)`, `Norwegian Nynorsk (Norway)`, `Odia (India)`, `Pashto (Afghanistan)`, `Persian (Iran)`, `Portuguese (Portugal)`, `Punjabi (India)`, `Serbian (Serbia)`, `Sindhi (India)`, `Sinhala (Sri Lanka)`, `Slovak (Slovakia)`, `Slovenian (Slovenia)`, `Spanish (Latin America)`, `Spanish (Mexico)`, `Swahili (Kenya)`, `Swedish (Sweden)`, `Urdu (Pakistan)` | Monikielisen synteesin puhekieli: jätä tämä pois, jotta malli päättelee kielen tekstistä, tai määritä se ohjaamaan puhuttua tulostetta. Kattavuus on Preview-versiossa yli 60 kieltä ja GA-versiossa 24. |
| `speakers` |  | array of object {voice, speaker_id} \| null | no |  | 2 – 10 items | gemini-2.5-pro-tts:n ja gemini-2.5-flash-tts:n tukema puhujamääritys, jota gemini-2.5-flash-lite-preview-tts ei tue. Sen määrittäminen antaa eri äänien lukea tekstin eri osia; määritä kullekin puhujalle ääni sekä puhujan kehotteen etuliitteitä vastaava speaker_id-alias. |
| `speakers[].voice` |  | enum (string) | yes |  | `Achernar`, `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`, `Zubenelgenubi` | Tälle puhujalle määritetty esiasetettu ääni. |
| `speakers[].speaker_id` |  | string | yes |  |  | Puhujan alias, joka sisältää vain aakkosnumeerisia merkkejä eikä välilyöntejä. Tunnista puhuja lisäämällä tämä alias kehotetekstin eteen, kuten 'Alice: Hello! Bob: Hi there!'. |
| `temperature` |  | number | no | `1` | 0 – 2 | Puheen satunnaisuusasetus, jonka vaikutus vaihtelee matalien asetusten keskittyneestä ja ennakoitavasta ilmaisusta korkeiden asetusten luovaan ja vaihtelevaan ilmaisuun. |
| `output_format` |  | enum (string) | no | `mp3` | `wav`, `mp3`, `ogg_opus` | Tulosteäänen muoto: mp3 tuottaa pakattuja ja pienikokoisia tiedostoja, ja sitä suositellaan; wav sisältää pakkaamatonta PCM:ää WAV-säiliössä 24 kHz:n näytteenotolla ja 16-bittisenä monoäänenä; ogg_opus käyttää Opusta Oggin sisällä ja tarjoaa hyvän laadun ja koon tasapainon. |

## Example input

Required parameters only:

```json
{
  "prompt": "Hello from Doitong. This is a short test sentence."
}
```

A fuller example:

```json
{
  "prompt": "Hello from Doitong. This is a short test sentence."
}
```

## Run it

Set `DOITONG_API_KEY` to a key from https://doitong.com/developers/dashboard#keys. `?wait=20` returns the finished request in the same call when it is ready within 20 seconds; otherwise poll `GET /requests/{id}` (it also accepts `?wait=`), or pass `webhook_url`.

### curl

```bash
# Run the model; wait up to 20 s for the finished result in the same call
curl -X POST "https://api.doitong.com/v1/run/gemini-tts?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Hello from Doitong. This is a short test sentence."
  }'

# Still "queued" or "running"? Poll with the id from the response:
curl "https://api.doitong.com/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.com/v1";
const headers = {
  "Authorization": "Bearer " + process.env.DOITONG_API_KEY,
  "Content-Type": "application/json",
};

// Run the model; wait up to 20 s for the finished result in the same call
let res = await fetch(API + "/run/gemini-tts?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "Hello from Doitong. This is a short test sentence."
  }),
});
let request = await res.json();
if (!res.ok) throw new Error(request.error.code + ": " + request.error.message);

// Not finished yet: long-poll until it is
while (request.status === "queued" || request.status === "running") {
  res = await fetch(API + "/requests/" + request.id + "?wait=20", { headers });
  request = await res.json();
}
if (request.status !== "succeeded") throw new Error(JSON.stringify(request.error));
console.log(request.outputs.map((o) => o.url), request.cost.credits + " API credits ($" + request.cost.usd + ")");
```

### Python

```python
import os
import requests

API = "https://api.doitong.com/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "prompt": "Hello from Doitong. This is a short test sentence.",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/gemini-tts", params={"wait": 20}, json=payload, headers=headers)
request = r.json()
if not r.ok:
    raise RuntimeError(request["error"]["code"] + ": " + request["error"]["message"])

# Not finished yet: long-poll until it is
while request["status"] in ("queued", "running"):
    request = requests.get(API + "/requests/" + request["id"], params={"wait": 20}, headers=headers).json()
if request["status"] != "succeeded":
    raise RuntimeError(request["error"])
print([o["url"] for o in request["outputs"]], request["cost"]["credits"], "API credits", "$" + request["cost"]["usd"])
```

### MCP

The MCP server at `https://api.doitong.com/v1/mcp` exposes the tools `search_models`, `get_model`, `quote`, `run`, `get_request`, `cancel_request`, `list_requests`, `create_upload` and `get_account`. A `run` call for this model:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run",
    "arguments": {
      "model_id": "gemini-tts",
      "input": {
        "prompt": "Hello from Doitong. This is a short test sentence."
      },
      "wait_seconds": 20
    }
  }
}
```

## Response

Every call returns a request object. `status` is one of `queued`, `running`, `succeeded`, `failed`, `canceled`. `outputs` lists the generated files with URLs on our storage (kept forever, or 7 days with `?storage=temporary`; `storage` says which); `output` is the model's own result object with the same URLs.

```json
{
  "id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
  "object": "request",
  "model": "gemini-tts",
  "status": "succeeded",
  "created_at": "2026-10-20T12:00:00Z",
  "started_at": "2026-10-20T12:00:02Z",
  "completed_at": "2026-10-20T12:00:09Z",
  "queue_position": null,
  "cost": {
    "credits": 30,
    "usd": "0.03",
    "charged": 30,
    "refunded": 0
  },
  "input": {
    "prompt": "Hello from Doitong. This is a short test sentence."
  },
  "output": {
    "audio": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp3",
      "content_type": "audio/mpeg",
      "file_name": "0-output.mp3",
      "file_size": 1843200
    }
  },
  "outputs": [
    {
      "type": "audio",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp3",
      "content_type": "audio/mpeg",
      "file_size": 1843200,
      "duration": 12,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `audio` | object {url, content_type, file_name, file_size} | Generoinnissa tuotettu äänitiedosto. |

## Related models

- [Eleven v4 Text to Speech](https://doitong.com/developers/models/elevenlabs/tts/eleven-v4.md) (`elevenlabs/tts/eleven-v4`): $0.08 / 1000 characters
- [MiniMax Speech 2.8 HD](https://doitong.com/developers/models/minimax/speech-2.8-hd.md) (`minimax/speech-2.8-hd`): $0.10 / 1000 characters
- [Gemini 3.1 Flash Tts](https://doitong.com/developers/models/gemini-3.1-flash-tts.md) (`gemini-3.1-flash-tts`): $0.05 / 1000 characters
- [Gemini 3.8 Flash Lite TTS](https://doitong.com/developers/models/google/gemini-3.8-flash-lite-tts.md) (`google/gemini-3.8-flash-lite-tts`): $0.111 / run
- [Gemini 3.8 Flash TTS](https://doitong.com/developers/models/google/gemini-3.8-flash-tts.md) (`google/gemini-3.8-flash-tts`): $0.045 / run
- [Async Text to Speech Pro V1.0](https://doitong.com/developers/models/async/tts-pro/v1.0.md) (`async/tts-pro/v1.0`): $0.01 / 1000 characters
- [Bytedance Seed Speech Text to Speech](https://doitong.com/developers/models/bytedance/seed-speech/tts/v2.md) (`bytedance/seed-speech/tts/v2`): $0.03 / 1000 characters
- [Chatterbox · Speech to Speech](https://doitong.com/developers/models/chatterbox/speech-to-speech.md) (`chatterbox/speech-to-speech`): $0.015 / minute of input audio

## Links

- HTML page: https://doitong.com/developers/models/gemini-tts
- All models and guides for AI agents: https://doitong.com/developers/llms.txt
- OpenAPI 3.1 with this model's typed request body: https://doitong.com/developers/openapi.json?model=gemini-tts
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/gemini-tts
