Product · Spex-TTS
every number below is published
Builtto answer.
Spex-TTS grew out of a production live-translation product. Every feature below exists because a live call needed it — and every number beside it is published, not promised.
01 · Cloning
Instant voice cloning
A reference clip of about ten seconds. No training job, no per-voice fee. The identity holds across all 23 languages — including ones the reference never spoke; that held up in blind listening tests.
reference ≈ 10 s of audio
~1.5 MB cap
fingerprinted and cached after first use
no training job
no per-voice fee
six stock voices ready-made, all multilingual
02 · Streaming
WebSocket, SSE, raw bytes
Persistent sockets for conversations, server-sent events for streams, one-shot WAV for everything else. Pick the surface per call site — the request body barely changes.
wss://
one socket per live call, an utterance per turn
POST /v1/tts/sse
base64 PCM chunks, {"done": true} to close
POST /v1/tts/bytes
one-shot WAV
PCM or WAV
any output sample rate
curl -N -X POST https://tts.gandr.ai/v1/tts/sse \
-H "x-api-key: gnd_yourkey" \
-d '{"transcript": "Streaming in about
a hundred milliseconds.",
"voice": {"mode": "clone", "wav_b64": "<ref>"}}'
03 · Drop-in
Familiar request shapes
If you've integrated another TTS API, you already know this schema: transcript, voice, output format. The switch is a diff, not a rewrite.
transcript · voice · language · output_format
x-api-key or Authorization: Bearer
either header
requests cap at 2,000 characters
usage per key at GET /v1/usage
# either header works
x-api-key: gnd_yourkey
{
"transcript": "Dock four is clear.",
"voice": {"mode": "id",
"voice_id": "jenny"},
"language": "en",
"output_format": {"container": "wav",
"sample_rate": 24000}
}
→ 200 · audio/wav · 24,000 Hz
04 · Reliability
Three serving tiers
Primary GPU fleet, warm spill, and an independent fallback behind one endpoint. A full fleet outage costs you latency, not availability.
one endpoint, three tiers behind it
past capacity: 503 at_capacity, retryable
a busy signal, not a hang
clients retry in milliseconds; the fleet scales in seconds
standby failover lines beside your current provider
05 · Languages
23 languages, one identity
Clone a voice once and it speaks all 23 — the identity survives translation, which is what a live-translation product needed first. Eight have published specimens; the rest run live on the call.
23 languages from a single reference clip
identity holds in languages the reference never spoke
blind listening tests, not vibes
eight specimen languages published
Jenny — one clone
one reference · three scripts · rendered on the production API
06 · Privacy
No training on your data
Customer text and reference audio never enter a training set. Usage is visible per key and auditable via the API.
no training on customer text or reference audio
usage visible per key, auditable via the API
provenance watermark on every clip, every tier
training set: — customer text and reference audio never enter
The datasheet — published, not promised
- First audio
- 107 ms p50 · 108 ms p95, single stream
- Languages
- 23 from one cloned voice
- Stock voices
- 6 — all multilingual
- Clone reference
- ≈ 10 s of audio, ~1.5 MB cap
- Request cap
- 2,000 characters per request
- Output
- PCM or WAV · any sample rate
- Surfaces
- WebSocket · SSE · one-shot bytes
- Auth
- x-api-key or Authorization: Bearer
- Past capacity
- 503 at_capacity · retryable
- Cold start
- ~23 s measured, one automatic retry rides the boot
Provenance
Every clip leaves signed.
An inaudible provenance watermark is embedded in every sample at generation time, on every serving tier. When a clip of your agent surfaces somewhere it shouldn’t, you can prove where it came from — and where it didn’t.
voice Leo · 11.3s · 2026-07-16
watermark inaudible · applied on every tier
