# Voices

> Munsit offers a variety of voices with different accents, including Fusha, Emirati, Saudi Najdi, Saudi Hijazi, and more. List them all with one call, then use the voice_id in any text-to-speech request.

## List voices

`GET /api/v1/voices`

Retrieve a list of all available voices for text-to-speech synthesis. Requires API key authentication via the `x-api-key` header. Returns an array of voice objects.

```bash
curl -X GET "https://api.munsit.com/api/v1/voices" \
  -H "x-api-key: YOUR_API_KEY"
```

```python
import requests

url = "https://api.munsit.com/api/v1/voices"
headers = {
    "x-api-key": "YOUR_API_KEY"
}

response = requests.get(url, headers=headers)
voices = response.json()
print(voices)
```

```javascript
const response = await fetch('https://api.munsit.com/api/v1/voices', {
  method: 'GET',
  headers: {
    'x-api-key': 'YOUR_API_KEY',
  },
});

const voices = await response.json();
console.log(voices);
```

```go
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "os"
)

func main() {
    url := "https://api.munsit.com/api/v1/voices"
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Set("x-api-key", os.Getenv("MUNSIT_API_KEY"))

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    var voices []map[string]any
    json.NewDecoder(resp.Body).Decode(&voices)
    fmt.Println(voices)
}
```

## Response fields

Each voice object contains:

| Field | Type | Description |
| --- | --- | --- |
| `voice_id` | string | Unique identifier for the voice (used in text-to-speech requests) |
| `name` | string | Human-readable name of the voice |
| `description` | string | null | Detailed description of the voice characteristics |
| `gender` | string | null | Gender of the voice (`male`, `female`, or `null`) |
| `age` | string | null | Age category of the voice (`middle`, `elderly`, or `null`) |
| `languages` | array\[string\] | List of language codes supported by the voice (e.g., `["ar", "en"]`) |
| `dialect` | array\[string\] | List of dialects supported by the voice (e.g., `["fusha", "emirati", "najdi"]`) |
| `type` | string | null | Voice type (`neural` or `null`) |
| `sample_url` | string | URL to an audio sample of the voice |

> Treat voice_id as an opaque string. A few ids are readable (ar-najdi-male-2), but most of the catalogue looks like PCtWbxjoNTpVQ6gIPaVZ2Hqm. There is no guaranteed ar-{dialect}-{gender}-{n} convention, and readable ids are not enumerable — neighbouring numbers are not guaranteed to exist. Always list voices with GET /voices and use the ids it returns; never construct or pattern-match one.
> Custom voices. Some voices may have null values for certain fields. These are typically custom user-created voices. The voice_id can still be used in text-to-speech requests regardless of these field values.

## Voice types

Voices can be categorized by **dialect**, **gender** (`male` or `female`), **age** (`middle` or `elderly`) and **languages** (supported language codes, e.g. `ar` for Arabic, `en` for English).

fushaemiratinajdihijazikuwaitibritish…

`fusha` is Modern Standard Arabic; `najdi` and `hijazi` are the Saudi dialects.

## Featured voices

Below are the featured Munsit voices available in the text-to-speech API. Each name links to an audio sample.

| Name | Dialect | Language | Sample |
| --- | --- | --- | --- |
| **Fahad** | Najdi | Arabic - English | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/samples/ar-fahad-male.wav) |
| **Lama** | Hijazi | Arabic - English | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/samples/ar-lama-female.wav) |
| **James** | American | English - Arabic | [Listen](https://pub-416e4565a11a4a838ddb6bd06095ea75.r2.dev/voices/user_36IjgcsiPYmjwpTzdvy0Ew687Gi/xqSiYjA5a4Y1PoHRTW99v3FA.wav) |
| **Jake** | American | Arabic - English | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/voices/user_36IjgcsiPYmjwpTzdvy0Ew687Gi/qnwatnZiPm1XgtUpp1l0pjuQ.wav) |
| **Mansour** | Emirati | Arabic - English | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/voices/user_36IjgcsiPYmjwpTzdvy0Ew687Gi/WpB2Nltu72GF4lcZl9yi62D4.wav) |
| **Maha** | Najdi | Arabic - English | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/voices/user_36IjgcsiPYmjwpTzdvy0Ew687Gi/IPK8qQ3F5NMiQLWFz1a83TG3.wav) |
| **Faisal** | Najdi | English - Arabic | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/voices/user_36IjgcsiPYmjwpTzdvy0Ew687Gi/8jo3glQpNtAdvRHIyNN8now2.wav) |
| **Turki** | Najdi | Arabic - English | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/voices/user_36IjgcsiPYmjwpTzdvy0Ew687Gi/jEF6Tjsxg3rJhJijqItKNNey.wav) |
| **Reem** | Najdi | Arabic - English | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/voices/user_36IjgcsiPYmjwpTzdvy0Ew687Gi/ybQaNl0nzt9TjN3Oh1zzyNgp.wav) |
| **Mishari** | Najdi | Arabic - English | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/voices/user_36IjgcsiPYmjwpTzdvy0Ew687Gi/MvC2GIG9tT9xvPcCWjILXqkM.wav) |
| **Hala** | Najdi | Arabic - English | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/voices/user_36IjgcsiPYmjwpTzdvy0Ew687Gi/08XOzRjaaumxbHhcGOrWkJ7z.wav) |
| **May** | British | English - Arabic | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/generations/user_36IjgcsiPYmjwpTzdvy0Ew687Gi/e824f251-d000-451c-94c5-91c42af35650.wav) |
| **Latifa** | Emirati | Arabic - English | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/generations/user_36IjgcsiPYmjwpTzdvy0Ew687Gi/440c7554-d1b5-4273-b83b-1c4c696eca61.wav) |
| **Mishal** | Najdi | Arabic - English | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/voices/user_36IjgcsiPYmjwpTzdvy0Ew687Gi/DsNnaed3aGVyZZ8iFgXDK0gS.wav) |
| **Maya** | American | English - Arabic | [Listen](https://pub-a2eeb500293c41df9e06b82b4178468a.r2.dev/samples/en-Maya_woman.wav) |

> Explore all voices. View the complete voice library in the dashboard.

## Using a voice

Use the `voice_id` from the response in text-to-speech generation endpoints: POST `/text-to-speech/:model_id` (include `voice_id` in the request body) or WS `/text-to-speech` (include `voice_id` in the WebSocket message). This example uses the `faseeh-v1-preview` model with the `ar-najdi-male-2` voice.

```bash
curl -X POST "https://api.munsit.com/api/v1/text-to-speech/faseeh-v1-preview" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "voice_id": "ar-najdi-male-2",
    "text": "مرحبا بك في فصيح كيف يمكنني مساعدتك اليوم",
    "stability": 0.5,
    "speed": 1.0,
    "streaming": true
  }' \
  --output audio.pcm
```

```python
import requests

url = "https://api.munsit.com/api/v1/text-to-speech/faseeh-v1-preview"
headers = {
    "x-api-key": "YOUR_API_KEY",
    "Content-Type": "application/json"
}
data = {
    "voice_id": "ar-najdi-male-2",
    "text": "مرحبا بك في فصيح كيف يمكنني مساعدتك اليوم",
    "stability": 0.5,
    "speed": 1.0,
    "streaming": True
}

response = requests.post(url, json=data, headers=headers, stream=True)
with open("audio.pcm", "wb") as f:
    for chunk in response.iter_content(chunk_size=8192):
        f.write(chunk)
```

```javascript
const response = await fetch('https://api.munsit.com/api/v1/text-to-speech/faseeh-v1-preview', {
  method: 'POST',
  headers: {
    'x-api-key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    voice_id: 'ar-najdi-male-2',
    text: 'مرحبا بك في فصيح كيف يمكنني مساعدتك اليوم',
    stability: 0.5,
    speed: 1.0,
    streaming: true,
  }),
});

const reader = response.body.getReader();
const chunks = [];

while (true) {
  const { done, value } = await reader.read();
  if (done) break;
  chunks.push(value);
}
```

```go
package main

import (
    "bytes"
    "encoding/json"
    "io"
    "net/http"
    "os"
)

func main() {
    url := "https://api.munsit.com/api/v1/text-to-speech/faseeh-v1-preview"
    payload, _ := json.Marshal(map[string]any{
        "voice_id":  "ar-najdi-male-2",
        "text":      "مرحبا بك في فصيح كيف يمكنني مساعدتك اليوم",
        "stability": 0.5,
        "speed":     1.0,
        "streaming": true,
    })

    req, _ := http.NewRequest("POST", url, bytes.NewReader(payload))
    req.Header.Set("x-api-key", os.Getenv("MUNSIT_API_KEY"))
    req.Header.Set("Content-Type", "application/json")

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    out, _ := os.Create("audio.pcm")
    defer out.Close()
    io.Copy(out, resp.Body)
}
```

> Caching. Voice information doesn't change frequently. Consider caching the voice list to reduce API calls and improve application performance.

## Go further

- [Synthesize](/text-to-speech/synthesize) — Use a voice_id to generate a complete WAV file. — `POST /text-to-speech/{model_id}`

- [Preview a voice](/text-to-speech/voice-preview) — Hear a cloned voice before creating it permanently. — `POST /voices/preview`

- [Voice cloning](/text-to-speech/voice-cloning) — Create a custom voice from your own audio. — `POST /voices/clone`

- [Models](/text-to-speech/models) — Choose the model that pairs with your voice. — `GET /models`
