# Bytedance Seed Speech Text to Speech API

> Synthèse vocale avec de nombreuses voix prédéfinies, contrôle de la vitesse, de la hauteur et du volume, et instructions de style oral

Convertit jusqu’à 5000 caractères de `text` en audio. Choisissez une `voice` et, éventuellement, imposez une `language` ou laissez la détection automatique activée. `speed` et `volume` vont de 0.5 à 2, `pitch` varie de -12 à 12 demi-tons, et `voice_instruction` guide l’interprétation. La sortie est au format mp3 ou opus, avec des fréquences d’échantillonnage de 8000 à 48000 Hz.

- Model id: `bytedance/seed-speech/tts/v2`
- Made by: ByteDance
- Category: Text to Speech
- Output: audio
- Price: $0.03 / 1000 characters (cheapest run $0.03 (30 API credits))
- Run: `POST https://api.doitong.ru/v1/run/bytedance/seed-speech/tts/v2`
- Quote: `POST https://api.doitong.ru/v1/quote/bytedance/seed-speech/tts/v2`
- Docs page: https://doitong.com/fr/developers/models/bytedance/seed-speech/tts/v2

## Pricing

Price: **$0.03 / 1000 characters**. Billed per character of `text` (the price is per 1000 characters).

The full example input below costs $0.002 = 2 API credits (50 characters × 30 API credits / 1000 characters).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.ru/v1/quote/bytedance/seed-speech/tts/v2` 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 |
|---|---|---|---|---|---|---|
| `text` |  | string | yes |  | ≤ 5000 characters | Texte à convertir en parole synthétisée. |
| `voice` |  | enum (string) | no | `stokie_en` | `vivi_mixed_en_zh_ja_es_id`, `mindy_en_es_id_pt_zh`, `stokie_en`, `dacey_en`, `tim_en`, `kian_en_zh`, `cedric_en_zh`, `sophie_en_zh`, `jean_en_zh`, `magnus_en_zh`, `mabel_en_zh`, `nadia_en_zh`, `opal_en_zh`, `pearl_en_zh`, `quentin_en_zh`, `vienna_mixed_en_zh`, `alina_mixed_en_zh`, `corinne_mixed_en_zh`, `esther_mixed_en_zh`, `freya_mixed_en_zh`, `gigi_mixed_en_zh`, `holly_mixed_en_zh`, `lyla_mixed_en_zh`, `daisy_mixed_en_zh`, `tracy_es_zh`, `jess_ja_es_id_pt_en_zh`, `pinky_es_ko_mixed_en_zh`, `sweety_ja_es`, `sandy_es_mixed_en_zh`, `sven_de`, `minimi_ja`, `usseau_fr`, `felipe_es`, `han_id`, `martins_pt`, `enzo_it`, `shane_ko`, `bonnie_zh`, `felix_zh`, `celeste_zh`, `monkey_king_zh` | Préréglage de voix de synthèse, identifié par un nom qui inclut également les codes des langues prises en charge. La prise en charge des langues peut être indépendante, comme avec 'en_zh', ou autoriser un mélange fluide de l’anglais et du chinois, indiqué par 'mixed_en_zh'. |
| `output_format` |  | enum (string) | no | `mp3` | `mp3`, `opus` | Encodage de l’audio de sortie : 'mp3' produit du MP3, tandis que 'opus' produit de l’Opus dans un conteneur Ogg. |
| `sample_rate` |  | enum (integer) | no | `24000` | `8000`, `16000`, `22050`, `24000`, `32000`, `44100`, `48000` | Fréquence d’échantillonnage en Hz de l’audio de sortie. |
| `speed` |  | number | no | `1` | 0.5 – 2 | Multiplicateur de débit de parole : 1.0 donne une vitesse normale, 0.5 une vitesse deux fois plus lente et 2.0 une vitesse deux fois plus rapide. |
| `volume` |  | number | no | `1` | 0.5 – 2 | Multiplicateur de volume : 1.0 donne un volume normal, 0.5 un volume deux fois plus faible et 2.0 un volume deux fois plus élevé. |
| `pitch` |  | integer | no | `0` | -12 – 12 | Réglage de la hauteur de la voix, mesuré en demi-tons : 0 laisse la hauteur inchangée, -12 la baisse d’une octave et 12 l’augmente d’une octave. |
| `language` |  | enum (string) \| null | no |  | `zh`, `en`, `ja`, `es-mx`, `id`, `pt-br`, `ko`, `it`, `de`, `fr` | Remplacement de la langue de lecture : lorsqu’il est omis, la détection est automatique et les voix bilingues peuvent mélanger le chinois et l’anglais de façon fluide ; lorsqu’il est fourni, il désactive la détection et limite la lecture à une seule langue. Choisissez le chinois avec zh, l’anglais avec en, le japonais avec ja, l’espagnol mexicain avec es-mx, l’indonésien avec id, le portugais brésilien avec pt-br, le coréen avec ko, l’italien avec it, l’allemand avec de ou le français avec fr. |
| `voice_instruction` |  | string \| null | no |  |  | Instruction facultative en langage naturel pour la diction, comme 'Speak in a cheerful tone' ou 'Could you speak a bit slower?'. Elle peut définir le ton, l’émotion, le volume et le rythme. |

## Example input

Required parameters only:

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

A fuller example:

```json
{
  "text": "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.ru/v1/run/bytedance/seed-speech/tts/v2?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Hello from Doitong. This is a short test sentence."
  }'

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

### JavaScript

```javascript
const API = "https://api.doitong.ru/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/bytedance/seed-speech/tts/v2?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "text": "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.ru/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "text": "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/bytedance/seed-speech/tts/v2", 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.ru/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": "bytedance/seed-speech/tts/v2",
      "input": {
        "text": "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": "bytedance/seed-speech/tts/v2",
  "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": 2,
    "usd": "0.002",
    "charged": 2,
    "refunded": 0
  },
  "input": {
    "text": "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.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `audio` | object {url, content_type, file_name, file_size} | Fichier audio produit par la génération. |

## 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
- [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
- [Chatterbox · Speech to Speech](https://doitong.com/developers/models/chatterbox/speech-to-speech.md) (`chatterbox/speech-to-speech`): $0.015 / minute of input audio
- [Chatterbox · Text to Speech](https://doitong.com/developers/models/chatterbox/text-to-speech.md) (`chatterbox/text-to-speech`): $0.025 / 1000 characters
- [Chatterbox · Text to Speech · Multilingual](https://doitong.com/developers/models/chatterbox/text-to-speech/multilingual.md) (`chatterbox/text-to-speech/multilingual`): $0.025 / 1000 characters
- [Chatterboxhd · Speech to Speech](https://doitong.com/developers/models/resemble-ai/chatterboxhd/speech-to-speech.md) (`resemble-ai/chatterboxhd/speech-to-speech`): $0.02 / minute of input audio
- [Chatterboxhd · Text to Speech](https://doitong.com/developers/models/resemble-ai/chatterboxhd/text-to-speech.md) (`resemble-ai/chatterboxhd/text-to-speech`): $0.0108 / run

## Links

- HTML page: https://doitong.com/developers/models/bytedance/seed-speech/tts/v2
- 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=bytedance/seed-speech/tts/v2
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.ru/v1/models/bytedance/seed-speech/tts/v2
