Voice design
Describe a voice. Hear it.
Write a plain-English description of the voice you want and hear it read your line. No parameter dropdowns, no preset library to dig through.
Start with a character. Tap one to hear it and load its brief.
Then edit the brief, or write your own.
How it works
A description in. A voice out.
No DSP knobs. No tagged parameters. Just plain English and audio back.
Describe
Write the voice you want.
Plain-English brief. Timbre, age, accent, pacing, register, emotional tone. The model parses the description into acoustic parameters.
Generate
Hear it speak any text.
Pass your brief and a line of text. The model renders speech that matches both, in roughly the time TTS takes.
Iterate
Tune the description, regenerate.
Adjust the brief and re-run. When you find a voice you like, keep the audio it renders; each request synthesizes a fresh speaker, so the takes are what you reuse.
What you can ask for
Six axes. All compositional.
Describe what you want in plain English. The model resolves parameters internally; you don't pick from dropdowns.
Timbre
Deep, light, gravelly, smooth, warm, bright, edgy, breathy.
Age
Young (mid-20s), middle-aged (30sā40s), elderly (60s+).
Accent
American (Midwest, Southern), British (RP, Cockney), Italian, Scottish, neutral, etc.
Register
Conversational, formal, dramatic, intimate, professional.
Pacing
Slow and measured, fast clip, deliberate with pauses, rapid.
Emotional tone
Calm, energetic, melancholic, confident, warm, detached.
For developers
Describe a voice, keep a take, speak in it by id.
Send a brief to the design endpoint and the model renders takes to match. Keep the one you want and its id works as a voice on the same OpenAI-compatible speech endpoint.
import base64, requests
headers = {"Authorization": "Bearer sk-sprag-..."}
designed = requests.post(
"https://api.sprag.ai/v1/audio/voices/design",
headers=headers,
json={
"model": "chorus",
"description": (
"A weathered old sea captain, seventy, thick gravelly "
"rasp, heavy West Country accent. Slow and salt-worn."
),
"input": "We do not sail past the point tonight.",
"n": 3,
},
).json()
for i, take in enumerate(designed["data"]):
with open(f"captain-{i + 1}.wav", "wb") as f:
f.write(base64.b64decode(take["audio"]))
# Keep the take you like; its id is what you pass as `voice`.
voice = requests.post(
"https://api.sprag.ai/v1/audio/voices",
headers=headers,
data={"design_id": designed["data"][0]["id"], "name": "Captain"},
).json()- Write the briefPlain English: timbre, age, accent, register, pacing, tone. No parameters to tune.
- Call /v1/audio/voices/designPass the brief as description and the line as input. Ask for up to three takes in one round trip.
- Keep the take you likeQuote its design id on /v1/audio/voices with a name. The voice id that comes back works on every speech request.
Plain-English briefs
No DSP knobs, no tagged parameters.
Kept, not regenerated
Audition takes, keep one, and it is the same speaker every time.
10+ languages
Every designed voice speaks all of them.
Drop-in OpenAI
Call it from the client you already have.