Skip to main content

List voices

GET https://api.kittenml.com/v1/voices?model=kitten-tts-2-latest
Kitten TTS 2 only

The three KittenTTS 0.8 models have a fixed eight-voice catalog and no voice listing. See feature support by model.

Use this authenticated endpoint instead of hard-coding the voice catalog. It returns all 47 Kitten TTS 2 built-in voices with their title and language, the voice-cloning capability, the active saved voices owned by the caller's organization, and any shared voices that KittenML makes available to every organization.

Query parameters​

ParameterDefaultAccepted values
modelKitten TTS 2kitten-tts-2-latest
limit1001 through 100. Limits saved voices only, never built-ins or shared voices
after—The last_custom_id of the previous page

Always send model=kitten-tts-2-latest. The model fields in the response repeat the ID you sent. A request that omits model still gets the Kitten TTS 2 catalog, but reports it under the model's earlier ID; see the legacy note in Models. The three KittenTTS 0.8 models have a fixed eight-voice catalog, listed in KittenTTS 0.8 voices.

cURL​

curl -L --fail-with-body -sS \
'https://api.kittenml.com/v1/voices?model=kitten-tts-2-latest' \
-H "Authorization: Bearer $KITTENML_API_KEY"

Python with httpx​

pip install httpx
import os

import httpx

response = httpx.get(
"https://api.kittenml.com/v1/voices",
params={"model": "kitten-tts-2-latest"},
headers={"Authorization": f"Bearer {os.environ['KITTENML_API_KEY']}"},
follow_redirects=True,
timeout=30,
)
response.raise_for_status()
catalog = response.json()

for voice in catalog["data"]:
# Send a built-in's id as the voice string; send others as {"id": ...}.
print(f"{voice['type']:<8} {voice['language']} {voice['id']}")
print(f"request_id: {response.headers.get('x-request-id')}")

JavaScript with fetch​

Node.js 18 and later include fetch, which follows redirects by default.

const url = new URL("https://api.kittenml.com/v1/voices");
url.searchParams.set("model", "kitten-tts-2-latest");

const response = await fetch(url, {
headers: {Authorization: `Bearer ${process.env.KITTENML_API_KEY}`},
});
const requestId = response.headers.get("x-request-id");
const catalog = await response.json();
if (!response.ok) {
throw new Error(`${catalog.error?.message} (request_id=${requestId})`);
}

for (const voice of catalog.data) {
// Send a built-in's id as the voice string; send others as {id}.
console.log(`${voice.type.padEnd(8)} ${voice.language} ${voice.id}`);
}
console.log(`request_id: ${requestId}`);

Response​

This response is shortened to one built-in voice and one saved voice. A real response lists all 47 built-ins first, in number order, then the caller's saved voices, newest first, then any shared voices.

{
"object": "list",
"model": "kitten-tts-2-latest",
"data": [
{
"id": "frank_gravelly_male_18",
"object": "audio.voice",
"name": "18 — Frank — Gravelly Male",
"type": "built_in",
"model": "kitten-tts-2-latest",
"language": "en",
"experimental": false
},
{
"id": "voice_0123456789abcdef0123456789abcdef",
"created_at": 1787760000,
"name": "My saved voice",
"object": "audio.voice",
"type": "custom",
"model": "kitten-tts-2-latest",
"language": "en",
"experimental": false
}
],
"public_voices_unavailable": false,
"languages": [
{"code": "en", "experimental": false},
{"code": "ar", "experimental": false},
{"code": "de", "experimental": false},
{"code": "es", "experimental": false},
{"code": "fr", "experimental": false},
{"code": "it", "experimental": false},
{"code": "pt", "experimental": false},
{"code": "ru", "experimental": false},
{"code": "zh", "experimental": false},
{"code": "hi", "experimental": false}
],
"voice_cloning": {
"supported": true,
"custom_voices_included": true,
"saved_voices_supported": true,
"supported_languages": ["en"],
"create_endpoint": "/v1/audio/voices",
"consent_endpoint": "/v1/audio/voice_consents"
},
"has_more": false,
"first_custom_id": "voice_0123456789abcdef0123456789abcdef",
"last_custom_id": "voice_0123456789abcdef0123456789abcdef"
}

Each entry in data is an audio.voice object:

FieldMeaning
idThe value to select this voice with
nameFor a built-in, its title, such as 18 — Frank — Gravelly Male; for a saved or shared voice, the name it was created with
typebuilt_in for the catalog below, custom for a saved voice your organization owns, or public for a shared voice
modelThe model ID you sent
languageISO 639-1 code of the language the voice speaks
experimentalfalse for every current voice
created_atUnix timestamp in seconds; saved and shared voices only

Select a built-in by sending its id as the voice string. Select a saved voice with an object, "voice": {"id": "voice_..."}; a bare voice_... string is checked against the built-in catalog and rejected with 400 invalid_voice. On the input-streaming WebSocket, put either id in the voice query parameter.

Entries with type: "public" are shared voices that KittenML makes available to every organization. Select one by its name as the voice string, for example "voice": "Warm Narrator", or by its id exactly like a saved voice; on the WebSocket, either goes in the voice query parameter. Shared voice names are unique and never reuse a built-in voice ID, which always selects the built-in. They follow your own saved voices on every page and are not counted by limit or the cursors. public_voices_unavailable is true when the shared voices could not be read for this response; the built-ins and your saved voices are still complete.

Saved and shared voices currently use English reference transcripts and report language: "en".

Built-in voices​

Kitten TTS 2 has 47 built-in voices. Select one by its voice ID: lowercase words and the voice's two-digit number, separated by underscores. Copy the ID from this table or from the response's id; the title is the voice's display name (name). Voice IDs are case-sensitive. The default voice is eleanor_somber_female_32.

Voice IDTitleLanguage
matthew_exhausted_mechanic_male_0101 — Matthew — Exhausted Mechanic MaleEnglish
willow_hushed_young_female_0202 — Willow — Hushed Young FemaleEnglish
dolores_southern_elderly_female_0303 — Dolores — Southern Elderly FemaleEnglish
victor_controlled_fury_older_male_0404 — Victor — Controlled Fury Older MaleEnglish
dante_playful_smooth_young_male_0505 — Dante — Playful Smooth Young MaleEnglish
alfred_tender_older_male_0606 — Alfred — Tender Older MaleEnglish
saoirse_joyful_irish_female_0707 — Saoirse — Joyful Irish FemaleEnglish
claire_playful_professional_female_0808 — Claire — Playful Professional FemaleEnglish
raven_controlled_fury_young_female_0909 — Raven — Controlled Fury Young FemaleEnglish
bella_1010 — Bella (Kitten V0.8)English
jasper_1111 — Jasper (Kitten V0.8)English
luna_1212 — Luna (Kitten V0.8)English
bruno_1313 — Bruno (Kitten V0.8)English
rosie_1414 — Rosie (Kitten V0.8)English
hugo_1515 — Hugo (Kitten V0.8)English
kiki_1616 — Kiki (Kitten V0.8)English
leo_1717 — Leo (Kitten V0.8)English
frank_gravelly_male_1818 — Frank — Gravelly MaleEnglish
herbert_wise_male_1919 — Herbert — Wise MaleEnglish
diana_stern_female_2020 — Diana — Stern FemaleEnglish
laurence_dramatic_male_2121 — Laurence — Dramatic MaleEnglish
maeve_cozy_female_2222 — Maeve — Cozy FemaleEnglish
walter_warm_male_2323 — Walter — Warm MaleEnglish
edith_soft_female_2424 — Edith — Soft FemaleEnglish
miles_gentle_male_2525 — Miles — Gentle MaleEnglish
grace_soothing_female_2626 — Grace — Soothing FemaleEnglish
reginald_distinguished_male_2727 — Reginald — Distinguished MaleEnglish
iris_hushed_female_2828 — Iris — Hushed FemaleEnglish
marcus_smooth_male_2929 — Marcus — Smooth MaleEnglish
serena_gentle_female_3030 — Serena — Gentle FemaleEnglish
julian_dreamy_male_3131 — Julian — Dreamy MaleEnglish
eleanor_somber_female_3232 — Eleanor — Somber FemaleEnglish
otis_rumbling_male_3333 — Otis — Rumbling MaleEnglish
vincent_hushed_male_3434 — Vincent — Hushed MaleEnglish
martha_weathered_female_3535 — Martha — Weathered FemaleEnglish
sable_whispering_female_3636 — Sable — Whispering FemaleEnglish
victoria_regal_female_3737 — Victoria — Regal FemaleEnglish
arabic_3838 — Arabic (العربية)Arabic
german_3939 — German (Deutsch)German
english_4040 — EnglishEnglish
spanish_4141 — Spanish (Español)Spanish
french_4242 — French (Français)French
italian_4343 — Italian (Italiano)Italian
portuguese_4444 — Portuguese (Português)Portuguese
russian_4545 — Russian (Русский)Russian
chinese_simplified_4646 — Chinese (Simplified) (简体中文)Simplified Chinese
hindi_4747 — Hindi (हिन्दी)Hindi

Voices 01–37 speak English. Voices 38–47 each speak the language in their name; select the language by selecting the voice. See Language coverage.

Voice IDs use only letters, digits, and underscores, so they need no encoding in a URL, such as the input-streaming WebSocket query.

KittenTTS 0.8 voices​

The three KittenTTS 0.8 models (kitten-tts-nano-0.8, kitten-tts-micro-0.8, and kitten-tts-mini-0.8) share a fixed catalog of eight English voices. This endpoint does not list them; send the value from this table as voice. Voice values are case-sensitive, and the default is Bella.

VoiceCharacter
BellaWarm and expressive
JasperClear and conversational
LunaCalm and smooth
BrunoDeep and steady
RosieBright and friendly
HugoAuthoritative
KikiLively and energetic
LeoRelaxed and natural

A KittenTTS 0.8 voice is not accepted by Kitten TTS 2, and a Kitten TTS 2 voice is not accepted by a 0.8 model.

Saved-voice pagination​

All 47 built-ins are returned on every successful page. limit controls only the number of caller-owned saved voices and accepts 1–100. When has_more is true, send last_custom_id as after:

curl -L --fail-with-body -sS \
'https://api.kittenml.com/v1/voices?model=kitten-tts-2-latest&limit=25&after=voice_0123456789abcdef0123456789abcdef' \
-H "Authorization: Bearer $KITTENML_API_KEY"

after must name a saved voice the caller owns. An unknown, revoked, or foreign ID is rejected with 404 voice_not_found and param: "after" rather than being treated as an empty page, so read the cursor from a previous response's last_custom_id instead of constructing it.

The endpoint requires a durable organization or registered legacy API key because its response can contain private saved-voice IDs. Another organization cannot list your voices. GET /v1/audio/voices is not a listing route and answers 405.

Create and revoke saved voices using the endpoints in Clone a voice. Runnable Python and JavaScript clients are available in the voice-listing TTS examples.