klangzeile Sign in Get a free key

One line of text. One line of sound. Click to hear this headline · voice en-heart · unedited API output

Text-to-speech for products that talk. German and English voices, MP3, WAV or OGG, one POST request. Hosted in Germany. Never cloned, never stored.

Try it · no account · nothing is kept
0 / 200

The demo caps at 200 characters and a few requests a minute. The API takes 5,000 characters per request.

Voices · each row spoken by that voice

Five voices, two engines. Each one is exactly what it is.

Kokoro (Apache-2.0) for English, Piper (MIT) for German. No cloning, no "make it sound like X" — that door stays closed on purpose.

Code · one request, audio back
curl -X POST https://klangzeile.com/v1/tts \
  -H "Authorization: Bearer sk_live_…" \
  -H "Idempotency-Key: order-4711-confirmed" \
  -H "Content-Type: application/json" \
  -d '{"text": "Your order is on its way.", "voice": "en-heart", "format": "mp3"}' \
  -o confirmation.mp3

# response headers
Content-Type: audio/mpeg
X-Characters-Billed: 25
import httpx

r = httpx.post("https://klangzeile.com/v1/tts",
    headers={"Authorization": "Bearer sk_live_…",
             "Idempotency-Key": "order-4711-confirmed"},
    json={"text": "Your order is on its way.",
          "voice": "en-heart", "format": "mp3"})
r.raise_for_status()
open("confirmation.mp3", "wb").write(r.content)
print(r.headers["X-Characters-Billed"])  # 25
const r = await fetch("https://klangzeile.com/v1/tts", {
  method: "POST",
  headers: { Authorization: "Bearer sk_live_…",
             "Idempotency-Key": "order-4711-confirmed",
             "Content-Type": "application/json" },
  body: JSON.stringify({ text: "Your order is on its way.",
                         voice: "en-heart", format: "mp3" })
});
if (!r.ok) throw await r.json();   // RFC 7807 problem+json, with request_id
const audio = new Audio(URL.createObjectURL(await r.blob()));
audio.play();
X-Characters-BilledWhat this call cost, on every response. Quotas are counted in characters, nothing else.
Idempotency-KeyRetry the same POST for 24 hours and get the same audio back — billed once.
application/problem+jsonEvery error is RFC 7807 with a request_id you can send us.
Principles
Pricing · monthly · cancel anytime · excl. VAT
free €0 forever
  • 10,000 characters a month
  • 10 requests a minute
  • All voices, MP3 / WAV / OGG
Start free
hobby €9 / month
  • 100,000 characters a month
  • 30 requests a minute
  • All voices, MP3 / WAV / OGG
Choose hobby
pro €49 / month
  • 1,000,000 characters a month
  • 120 requests a minute
  • All voices, MP3 / WAV / OGG
Choose pro

Need more than a million characters, or an invoice instead of a card? Write to us.