# MiniMax Speech 2.8 HD API

> MiniMax's high-definition text to speech in 30+ languages with pauses, emotion and pronunciation control.

MiniMax Speech 2.8 HD voices text in more than 30 languages with fine control: inline pause markers, voice speed, pitch and volume, custom pronunciation dictionaries and voice effects. Choose from the built-in voices and the output sample rate and format.

- Model id: `minimax/speech-2.8-hd`
- Made by: MiniMax
- Category: Text to Speech
- Output: audio
- Price: $0.10 / 1000 characters (cheapest run $0.10 (100 API credits))
- Run: `POST https://api.doitong.com/v1/run/minimax/speech-2.8-hd`
- Quote: `POST https://api.doitong.com/v1/quote/minimax/speech-2.8-hd`
- Docs page: https://doitong.com/developers/models/minimax/speech-2.8-hd

## Pricing

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

The full example input below costs $0.008 = 8 API credits (79 characters × 100 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.com/v1/quote/minimax/speech-2.8-hd` 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 – 10000 characters | Text for speech synthesis, with pauses specified by `<#x#>` where x ranges from 0.01 to 99.99 seconds. Available interjection tags are `(laughs)`, `(sighs)`, `(coughs)`, `(clears throat)`, `(gasps)`, `(sniffs)`, `(groans)`, and `(yawns)`. |
| `voice_setting` |  | object {voice_id, speed, vol, pitch, emotion, english_normalization} | no | `{"english_normalization":false,"pitch":0,"speed":1,"voice_id":"Wise_Woman","vol":1}` |  | Settings for configuring the voice. |
| `voice_setting.voice_id` |  | string | no | `Wise_Woman` | ≥ 1 characters | Predefined voice identifier used for speech synthesis. |
| `voice_setting.speed` |  | number | no | `1` | 0.5 – 2 | Speaking rate, ranging from 0.5 to 2.0. |
| `voice_setting.vol` |  | number | no | `1` | 0.01 – 10 | Output volume, ranging from 0 to 10. |
| `voice_setting.pitch` |  | integer | no | `0` | -12 – 12 | Pitch of the voice, ranging from -12 to 12. |
| `voice_setting.emotion` |  | enum (string) \| null | no |  | `happy`, `sad`, `angry`, `fearful`, `disgusted`, `surprised`, `neutral` | Emotional tone of the synthesized speech. |
| `voice_setting.english_normalization` |  | boolean | no | `false` |  | English text-normalization option that trades a small amount of additional latency for better reading of numbers. |
| `audio_setting` |  | object {sample_rate, bitrate, format, channel} | no |  |  | Settings for configuring audio. |
| `audio_setting.sample_rate` |  | enum (integer) | no | `32000` | `8000`, `16000`, `22050`, `24000`, `32000`, `44100` | Sampling rate for the generated audio. |
| `audio_setting.bitrate` |  | enum (integer) | no | `128000` | `32000`, `64000`, `128000`, `256000` | Bitrate for the generated audio. |
| `audio_setting.format` |  | enum (string) | no | `mp3` | `mp3`, `pcm`, `flac` | Format for the audio. |
| `audio_setting.channel` |  | enum (integer) | no | `1` | `1`, `2` | Audio channel count: 1 for mono or 2 for stereo. |
| `language_boost` |  | enum (string) \| null | no |  | `Chinese`, `Chinese,Yue`, `English`, `Arabic`, `Russian`, `Spanish`, `French`, `Portuguese`, `German`, `Turkish`, `Dutch`, `Ukrainian`, `Vietnamese`, `Indonesian`, `Japanese`, `Italian`, `Korean`, `Thai`, `Polish`, `Romanian`, `Greek`, `Czech`, `Finnish`, `Hindi`, `Bulgarian`, `Danish`, `Hebrew`, `Malay`, `Slovak`, `Swedish`, `Croatian`, `Hungarian`, `Norwegian`, `Slovenian`, `Catalan`, `Nynorsk`, `Afrikaans`, `auto` | Improves recognition for the selected languages and dialects. |
| `output_format` |  | enum (string) | no | `hex` | `url`, `hex` | Output content format; applies only to non-streaming responses. |
| `pronunciation_dict` |  | object {tone_list} \| null | no |  |  | Custom dictionary of pronunciations used to replace text. |
| `pronunciation_dict.tone_list` |  | array of string | no |  |  | Pronunciation replacement list using the syntax ['text/(pronunciation)', ...], for example ['燕少飞/(yan4)(shao3)(fei1)']. Chinese tone numbers range from 1 to 5. |
| `normalization_setting` |  | object {enabled, target_loudness, target_range, target_peak} | no |  |  | Settings that control audio loudness normalization. |
| `normalization_setting.enabled` |  | boolean | no | `true` |  | Enables normalization of audio loudness. |
| `normalization_setting.target_loudness` |  | number | no | `-18` | -70 – -10 | Desired loudness, measured in LUFS; defaults to -18.0. |
| `normalization_setting.target_range` |  | number | no | `8` | 0 – 20 | Desired loudness range, measured in LU; defaults to 8.0. |
| `normalization_setting.target_peak` |  | number | no | `-0.5` | -3 – 0 | Desired peak level, measured in dBTP; defaults to -0.5. |
| `voice_modify` |  | object {pitch, intensity, timbre} \| null | no |  |  | Settings for modifying voice pitch, intensity, and timbre. |
| `voice_modify.pitch` |  | integer | no | `0` | -100 – 100 | Pitch control measured in semitones: use a negative value to lower the voice or a positive value to raise it. Allowed values run from -100 to 100. |
| `voice_modify.intensity` |  | integer | no | `0` | -100 – 100 | Voice-energy control that makes speech more energetic as the setting increases. Its allowed range is -100 to 100. |
| `voice_modify.timbre` |  | integer | no | `0` | -100 – 100 | Voice timbre adjustment from -100 to 100, controlling its tonal character. |

## Example input

Required parameters only:

```json
{
  "prompt": "Hello! Welcome to our new studio. <#0.5#> Let's make something wonderful today."
}
```

A fuller example:

```json
{
  "prompt": "Hello! Welcome to our new studio. <#0.5#> Let's make something wonderful today."
}
```

## 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/minimax/speech-2.8-hd?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Hello! Welcome to our new studio. <#0.5#> Let'\''s make something wonderful today."
  }'

# 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/minimax/speech-2.8-hd?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "Hello! Welcome to our new studio. <#0.5#> Let's make something wonderful today."
  }),
});
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! Welcome to our new studio. <#0.5#> Let's make something wonderful today.",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/minimax/speech-2.8-hd", 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": "minimax/speech-2.8-hd",
      "input": {
        "prompt": "Hello! Welcome to our new studio. <#0.5#> Let's make something wonderful today."
      },
      "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": "minimax/speech-2.8-hd",
  "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": 8,
    "usd": "0.008",
    "charged": 8,
    "refunded": 0
  },
  "input": {
    "prompt": "Hello! Welcome to our new studio. <#0.5#> Let's make something wonderful today."
  },
  "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
    },
    "duration_ms": 1
  },
  "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} | Audio file produced by generation. |
| `duration_ms` | integer | Audio length, measured in milliseconds. |

## Related models

- [MiniMax Speech 2.6 \[HD\]](https://doitong.com/developers/models/minimax/speech-2.6-hd.md) (`minimax/speech-2.6-hd`): $0.10 / 1000 characters
- [MiniMax Speech 2.6 \[Turbo\]](https://doitong.com/developers/models/minimax/speech-2.6-turbo.md) (`minimax/speech-2.6-turbo`): $0.06 / 1000 characters
- [MiniMax Speech 2.8 \[Turbo\]](https://doitong.com/developers/models/minimax/speech-2.8-turbo.md) (`minimax/speech-2.8-turbo`): $0.06 / 1000 characters
- [MiniMax Speech-02 HD](https://doitong.com/developers/models/minimax/speech-02-hd.md) (`minimax/speech-02-hd`): $0.10 / 1000 characters
- [MiniMax Speech-02 Turbo](https://doitong.com/developers/models/minimax/speech-02-turbo.md) (`minimax/speech-02-turbo`): $0.06 / 1000 characters
- [MiniMax Voice Cloning](https://doitong.com/developers/models/minimax/voice-clone.md) (`minimax/voice-clone`): $1.5198 / run
- [MiniMax Voice Design](https://doitong.com/developers/models/minimax/voice-design.md) (`minimax/voice-design`): $3.00 / run
- [Eleven v4 Text to Speech](https://doitong.com/developers/models/elevenlabs/tts/eleven-v4.md) (`elevenlabs/tts/eleven-v4`): $0.08 / 1000 characters

## Links

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