Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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
  • 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 fleet runs always-on, so the numbers above are what you get: no cold-start lottery on the demo or the API. Overflow traffic spills to a fallback lane that can take longer on its first request.
  • The streaming WebSocket lane (wss://tts.gandr.ai/ws) is what voice agents should use, first audio byte in the numbers above. This SDK's say() returns the complete file, which suits batch and IVR work.

Links

About

Official JavaScript/TypeScript client for the Gandr TTS API

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages