gandr
Official Python & JavaScript clients for the Gandr TTS API, text to speech built for voice agents.
- Audio streams back as it is generated, so playback can start before the whole clip has rendered. First audio byte in 146 ms over the open internet, 116 ms p50 first audio, server side warm
- WER 1.982% on a 1,088-line set, the human recordings score 2.171% on the same scorer
- $10 a month for one million tokens (one token is one character), or unlimited, unmetered stream plans from $150/mo (annual)
- Every render watermarked (imperceptible, detectable)
- Numbers, dates, addresses, and order IDs read back correctly
Install
pip install gandr # Python 3.9+, zero dependencies
npm install gandr # Node 18+, zero dependencies
First call (under a minute)
Python
from gandr import Gandr
g = Gandr("gnd_...") # your API key, https://gandr.ai
audio = g.say("Your table for two is confirmed for Thursday at seven.")
open("confirmation.wav", "wb").write(audio)
JavaScript
import { Gandr } from "gandr";
const g = new Gandr("gnd_...");
const wav = await g.say("Your table for two is confirmed for Thursday at seven.");
// wav is a Uint8Array of a WAV file
Options
g.say(
"Order number 4-2-7-1 ships on March 3rd.",
voice="gandr-jenny", # ava, dane, jenny, leo, lewis, mia
sample_rate=8000, # 8000-48000, resampled server-side (telephony: 8000)
temperature=0.9, # 0.1-1.2, pitch range / melody
cfg_weight=0.4, # 0.2-1.0, pacing (lower = more spacious)
speed=1.1, # 0.6-1.5
pronunciation=[{"text": "Nguyen", "pronunciation": "win"}],
)
Omit a dial and you get the tuned default, per-voice temperature tuning included.
Voices
gandr-ava |
gandr-leo |
gandr-dane |
gandr-lewis |
gandr-jenny |
gandr-mia |
g.voices() returns the live catalog.
Retries
The client moves to the next endpoint when one is unreachable. A real answer, including an error, is never retried elsewhere, so you always see the response you actually got.
Errors
from gandr import Gandr, GandrError
try:
g.say("...")
except GandrError as e:
e.status # 401 invalid key · 402 quota spent · 400 bad input · 429 concurrency
e.payload # the API's JSON, with a hint field
Honest limits
- One request carries up to 2,000 characters, split longer text at sentence boundaries.
- The streaming WebSocket lane (
wss://tts.gandr.ai/ws) is what voice agents should use. This SDK'ssay()returns the complete file, which suits batch and IVR work.
Links
- Product: https://gandr.ai · Docs: https://gandr.ai/docs
- API spec: https://gandr.ai/openapi.yml · Status: https://gandr.ai/status
- Security disclosures: https://gandr.ai/.well-known/security.txt
Release files for gandr 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| gandr-0.1.2.tar.gz | 5.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gandr-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 11.4 kB
Release files / gandr-0.1.2.tar.gz
| Download URL | gandr-0.1.2.tar.gz |
|---|---|
| Size | 5.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8d60a0e6b422b6258588312f8715ce5b022e2b871291de76a9c24b15d8552f85
|
|
BLAKE2b-256 checksum How to use checksums |
d630f20dab8aa9f09b138085f4634097c1136961230d3243b027f7d2fd1d2276
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / gandr-0.1.2-py3-none-any.whl
| Download URL | gandr-0.1.2-py3-none-any.whl |
|---|---|
| Size | 5.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6d79ca9b146da55741555263336b2d98ebd6c5271f4c5a28eb0c3cc9ed912c38
|
|
BLAKE2b-256 checksum How to use checksums |
9f5614ddb67dd3279de33c033911e5832a99c8c5db8c66119297a8b8f31bea1a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|