Mandarin Chinese TTS API for batch content pipelines — Audra
Mandarin narration fails in batch pipelines for one reason: reading selection. Audra ships eight zh Essential presets that read simplified-Han input naturally — the pipeline work is picking the slug and spot-checking polyphones, not wiring a new vendor.
Mandarin voice slugs on Essential
- xiao — neutral broadcast read, default for explainers
- xiao-xiao and xiao-yi — warmer female variants for courses
- yun-jian and yun-yang — male news/documentary pacing
- All eight zh slugs on /voices, A/B on /compare
Mandarin-specific pitfalls
- Polyphones: numbers, 行, 了 context readings — spot-check a sample before a 50k-character batch
- Latin letters and digits inside Han text (product names, versions) read per-context; test each format
- Punctuation controls pause length more than English — full-width vs half-width matters
- Keep zh input in one request; mixed-language docs should be split per language before POSTing
Example request in Mandarin (zh-CN)
curl
curl https://audratalks.com/v2/speech \
-H "Authorization: Bearer sk-live-YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"audra-essential","text":"\u6b22\u8fce\u6765\u5230\u7b2c\u4e09\u8bfe:\u672c\u7ae0\u4ecb\u7ecd\u6e32\u67d3\u961f\u5217\u7684\u5de5\u4f5c\u65b9\u5f0f\u4e0e\u5e38\u89c1\u95ee\u9898\u3002","voice":"xiao","language":"zh-CN","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": '欢迎来到第三课:本章介绍渲染队列的工作方式与常见问题。',
"voice": "xiao",
"language": "zh-CN",
"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: '欢迎来到第三课:本章介绍渲染队列的工作方式与常见问题。',
voice: "xiao",
language: "zh-CN",
format: "mp3",
}),
});
if (!res.ok) throw new Error(await res.text());
await writeFile("out.mp3", Buffer.from(await res.arrayBuffer()));
Test xiao on your real lesson script — API key at /dashboard, 25k free characters.
FAQ
Simplified or Traditional input?
Essential zh presets target Simplified (zh-CN). Preview Traditional input on /voices before committing it to a batch.
How do I fix a misread polyphone?
Rephrase around it, or add an account lexicon entry (/docs) that pins the reading for that term.
Same pricing as English?
Yes — zh is one of the ten Essential languages at $25/1M characters before multipliers.
Voice catalogue: /voices. Batch strategy for long Chinese docs: jobs API, one chapter per request.