Skip to main content
Tokay turns text into speech. Send a string and a voice name, get audio back. It speaks Kazakh (model tokay-kk-v1) in six named voices, and expands numbers, currency and dates into how a Kazakh speaker would actually say them before it synthesizes. Your existing key works. One API key covers text-to-speech and speech-to-text, and both draw down the same credit balance — nothing new to provision.

Voices

Six Kazakh voices — audition them and pick by ear.

Drop-in for OpenAI TTS

Change baseURL on your OpenAI client. That’s the whole migration.

try it in one line

from code

Or start playback before synthesis finishes — tts.stream() yields one complete WAV per sentence:

what comes back

Raw WAV bytes — 24 kHz, 16-bit PCM, mono — not JSON. The billed character count rides along in a response header:
See playing & saving audio for turning those bytes into files, playback, MP3, or telephony µ-law.

the parameters

nfe is the one dial worth knowing: it trades synthesis time for fidelity, and 16 is genuinely usable on a live call. See latency & quality.
Keep your punctuation. It guides phrasing and pauses, and a trailing . / ! / ? helps the model finish the last word cleanly (the server adds one if you omit it). More in text normalization.

what it costs

Roughly $1 ≈ 25,000 characters ≈ 30 minutes of speech, since Kazakh runs about 14 characters per second of audio. Streaming and the OpenAI-compatible endpoint bill identically — delivery changes, price doesn’t. Same credit pool as speech-to-text, so running dry returns HTTP 429 on both products. The catalog endpoints (/v1/models, /v1/voices, /health) are open and free.

latency and cold starts

The GPU scales to zero when idle, so the first request after a quiet period pays a cold start of tens of seconds; calls within the next few minutes are fast. The SDK’s default 120 s timeout is sized for exactly this. Three things cut perceived latency: drop nfe to 16, use tts.stream() so audio starts after sentence one instead of the full render, and keep a container warm with a periodic geko.health() if your traffic is bursty.

Voices

All six, with style and best-for hints.

Streaming

Sentence-by-sentence delivery and the raw frame protocol.

TypeScript SDK

geko.tts.create(...) and stream(...), typed end to end.

Limits

Text length, formats, rate limits, and cold starts.