Skip to content

Spex-TTS the engine.

1

engine behind every figure on this site

One model serves every request on this site, the console, the specimens, the benchmarks. This sheet is the engine: where it came from, and how a request steers it.

One grain of sand falls onto the wire at the first-audio mark, and the speech waveform prints itself left to right from the landing.

The signature

Spex, from speck, a single grain of sand. The material this site is built from, at its smallest unit: one grain, one engine, every voice it speaks.

The figures, the published figures, measured on the production API

fig. 01

word error rate, %

1.98

03

against a 2.17% human reference on the same scorer; first audio byte in 146 ms over the open internet, 116 ms p50 first audio, server side warm.

fig. 02

languages, one cloned reference

23

023

One reference, one identity, the inner tick is the eight with published, dated specimens.

Origin

Where it comes from

Spex-TTS grew up inside a production live-translation product speaking to thousands of people at once, the API exposes what that product forced into existence, nothing more.

Controls

Expression, per request

Numeric controls and inline transcript tags steer every read, on every surface, with no added latency.

request

one request, the delivery dialed in, full reference at /docs

{
"transcript": "Chapter Three: The <spell>SS</spell> Halcyon.‣ a spell-out tag reads the initials letter by letter
<break time=\"600ms\"/> She sailed at dawn.",‣ a timed break, exactly where the chapter open needs air
"voice": {"mode": "id", "id": "gandr-dane"},
"temperature": 0.9,‣ prosodic range, the melody itself
"cfg_weight": 0.4,‣ unhurried pacing for the chapter open
"seed": 42‣ the same take, every render
}

The request, the production curl, one complete request

The complete request, as it runs: the three expression fields ride inline in one POST body, and the same shape streams over SSE and WebSocket with only the path changed.

listing 01

<break/><spell>temperaturecfg_weight
POST /v1/tts/bytes
curl -X POST https://tts.gandr.ai/v1/tts/bytes \
  -H "x-api-key: gnd_yourkey" \
  -H "content-type: application/json" \
  -d '{
    "transcript": "Your appointment moved to Thursday at ten. <break time=\"600ms\"/> The confirmation code is <spell>KH4T29</spell>. <break time=\"800ms\"/> Take your time, I’ll hold the line while you write it down.",
    "temperature": 0.9,
    "cfg_weight": 0.3,
    "voice": {"mode": "id", "id": "gandr-jenny"},
    "language": "en",
    "output_format": {"sample_rate": 24000}
  }' --output answer.wav

A key, one stream, your own script, nothing on it counted while you build.

Get a key, run your own script