# Zonos2 Text to Speech API

> TTS nhân bản giọng nói đa ngôn ngữ với tùy chọn lấy mẫu và lựa chọn giữa giọng gần giống hoặc cách thể hiện giàu cảm xúc

Nhân bản giọng nói từ `reference_audio_url` và đọc văn bản, trả về âm thanh WAV mono 44.1kHz cùng seed đã dùng. `language` đặt chuẩn hóa văn bản cho en_us, en_gb, fr_fr, de, es, it, pt_br, ja, cmn và ko. `accurate_mode` đánh đổi độ giống giọng để tăng tính biểu cảm, còn việc lấy mẫu có thể điều chỉnh qua `temperature`, `top_p`, `min_p`, `top_k` và `max_tokens` (tối đa 6144).

- Model id: `zonos2`
- Made by: Zyphra
- Category: Text to Speech
- Output: audio
- Charged by usage (up to $0.02 per run, typical $0.01; the rest of the hold is refunded): $0.01 / minute of generated audio (cheapest run $0.01 (10 API credits))
- Run: `POST https://api.doitong.com/v1/run/zonos2`
- Quote: `POST https://api.doitong.com/v1/quote/zonos2`
- Docs page: https://doitong.com/vi/developers/models/zonos2

## Pricing

Price: **$0.01 / minute of generated audio**. Charged by actual usage at $0.01 / minute of generated audio: up to $0.02 per run (the quote gives the maximum for your input), the rest is refunded automatically after the run. A typical run costs $0.01.

The full example input below holds up to $0.02 = 20 API credits (up to 2 min of generated audio × $0.01) when it starts; a typical run costs $0.01 (10 API credits).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). This model is charged by usage: `POST https://api.doitong.com/v1/quote/zonos2` with the same JSON body returns the most the run can cost for that input (`credits`, debited when the run starts); after the run you pay the usage the model reports and the rest is refunded automatically. An input whose maximum would exceed the per-run limit is refused with 422. 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 |
|---|---|---|---|---|---|---|
| `reference_audio_url` |  | string (audio URL) | yes |  |  | Âm thanh cung cấp giọng nói nguồn để sao chép. |
| `language` |  | string | no | `en_us` |  | Lựa chọn ngôn ngữ để chuẩn hóa văn bản; bước này sẽ bị bỏ qua trừ khi mã là một trong các giá trị sau: en_us, en_gb, fr_fr, de, es, it, pt_br, ja, cmn, ko. |
| `seed` |  | integer \| null | no |  | 0 – 2,147,483,647 | Seed cho phép tái tạo kết quả; được chọn ngẫu nhiên nếu bỏ qua. |
| `accurate_mode` |  | boolean | no | `true` |  | Mức độ khớp giọng nói so với tính biểu cảm: True ưu tiên độ khớp cao hơn, còn False ưu tiên lời nói biểu cảm hơn. |
| `clean_speaker_background` |  | boolean | no | `false` |  | Cho biết âm thanh tham chiếu có nền sạch. |
| `temperature` |  | number | no | `1.15` | 0 – 2 | Nhiệt độ dùng để lấy mẫu. |
| `top_p` |  | number | no | `0` | 0 – 1 | Xác suất lấy mẫu nucleus; đặt thành 0 để tắt. |
| `min_p` |  | number | no | `0.18` | 0 – 1 | Ngưỡng xác suất cho phương pháp lấy mẫu xác suất tối thiểu. |
| `top_k` |  | integer | no | `106` | 0 – 2,048 | Giới hạn cho phương pháp lấy mẫu top-k; đặt thành 0 để tắt. |
| `max_tokens` |  | integer \| null | no |  | 1 – 6,144 | Giới hạn tạo khung âm thanh, sử dụng giới hạn ngữ cảnh của mô hình trừ khi cung cấp giá trị tối đa. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Có thể nới lỏng việc kiểm duyệt bằng cách đặt thành false, nếu người gọi được cấp quyền. |

File parameters (`reference_audio_url`) take a public `https://` URL, a `data:` URI up to 10 MB, or the `file_url` of an upload from `POST /files`.

## Example input

Required parameters only:

```json
{
  "reference_audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3"
}
```

A fuller example:

```json
{
  "reference_audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3"
}
```

## 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/zonos2?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "reference_audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3"
  }'

# 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/zonos2?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "reference_audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3"
  }),
});
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 = {
    "reference_audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/zonos2", 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": "zonos2",
      "input": {
        "reference_audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3"
      },
      "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": "zonos2",
  "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": 20,
    "usd": "0.02",
    "charged": 20,
    "refunded": 0
  },
  "input": {
    "reference_audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3"
  },
  "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
    },
    "seed": 42
  },
  "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} | Âm thanh đầu ra ở định dạng WAV, với tần số lấy mẫu 44.1kHz và một kênh mono. |
| `seed` | integer | Giá trị seed được áp dụng trong quá trình tạo sinh. |

## 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
- [Zonos-Audio-Clone](https://doitong.com/developers/models/zonos.md) (`zonos`): $0.05 / 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
- [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
- [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

## Links

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