Multilingual TTS API: 10 languages on one OpenAI-compatible endpoint — Audra

Localizing product narration usually means either one expensive multilingual vendor or a frankenstein of regional APIs. Audra Essential keeps it boring on purpose: ten languages, 72 preset voices, one OpenAI-compatible HTTP shape, and −16 LUFS mastering on the file you download.

This is for batch narration — courses, docs, support macros, marketing pages — not realtime agents or voice cloning. If you need sub-200ms conversational turns or a custom clone of a human speaker, stay on a provider built for that.

Who this is for

Languages on Essential

Essential covers the ten locales below on a single endpoint. Prefer a voice slug that already implies the locale (filter the catalog on /voices). Set language as a BCP-47 hint only when the slug is ambiguous — never mix languages inside one request.

Essential languages (BCP-47 hints)
LanguageHintNotes
English (US/UK)en-US / en-GBDefault narration locale
Japaneseja-JPPrefer JA voice slugs
Mandarin Chinesezh-CNPreview before production
Spanishes-ESSlug usually implies locale
Portuguese (Brazil)pt-BRUse BR-oriented voices
Hindihi-INSet language if slug is ambiguous
Frenchfr-FRShown in the example below
Italianit-ITOne locale per request
Germande-DEFilter /compare by language
Dutchnl-NLEssential preset voices

Picking a voice and locale

Example: French narration

Use POST /v2/speech when you need an explicit BCP-47 language hint. OpenAI SDK clients can still point baseURL at /v1 for simple English narration — for locale overrides, prefer the native examples below.

curl
curl https://audratalks.com/v2/speech \
  -H "Authorization: Bearer sk-live-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"audra-essential","text":"Bonjour — narration de documentation.","voice":"june","language":"fr-FR","format":"mp3"}' \
  --output out.mp3
Python
import requests

r = requests.post(
    "https://audratalks.com/v2/speech",
    headers={"Authorization": "Bearer sk-live-YOUR_KEY"},
    json={
        "model": "audra-essential",
        "text": "Bonjour — narration de documentation.",
        "voice": "june",
        "language": "fr-FR",
        "format": "mp3",
    },
    timeout=120,
)
r.raise_for_status()
open("out.mp3", "wb").write(r.content)
JavaScript
import { writeFile } from "node:fs/promises";

const res = await fetch("https://audratalks.com/v2/speech", {
  method: "POST",
  headers: {
    Authorization: "Bearer sk-live-YOUR_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    model: "audra-essential",
    text: "Bonjour — narration de documentation.",
    voice: "june",
    language: "fr-FR",
    format: "mp3",
  }),
});

if (!res.ok) throw new Error(await res.text());
await writeFile("out.mp3", Buffer.from(await res.arrayBuffer()));

When you need an explicit language hint (or jobs/webhooks), prefer POST /v2/speech. Preview candidates on /voices, then A/B on /compare before you bake the slug into CI.

Cost sanity check

FAQ

Which languages does Essential support?

English (US/UK), Japanese, Mandarin Chinese, Spanish, Portuguese (Brazil), Hindi, French, Italian, German, and Dutch — 72 voices on one endpoint.

When should I set the language field?

Prefer a voice slug that implies the locale. Set language (BCP-47) only when the slug is ambiguous or you need an explicit override.

Does Audra support realtime voice agents?

No. Audra is a batch TTS API for mastered MP3/WAV files. For sub-200ms conversational agents, stay on a realtime-oriented provider.

Can I clone a custom brand voice?

No. Audra ships preset voices only. Use ElevenLabs (or similar) when cloning is a hard requirement — see /vs/elevenlabs.

Next steps