A recording goes in.
A meeting, an interview, a voice memo — German or English, up to three hours per file. This one went in exactly as it is.
7:14 min · German · 8 minutes billed
Text to speech · Speech to text · EU-hosted
Five voices for your product, and protocols of every conversation: speakers, summary, subtitles, translation. One API. Servers in the EU; results deleted after one fetch.
Voices · tap to listen
Kokoro (Apache-2.0) for English, Piper (MIT) for German. No cloning, no "make it sound like X" — that door stays closed on purpose.
Protocol · two real recordings, unedited API output
One request to POST /v1/transcriptions — speakers, word timestamps and a translation switched on — and this is the answer, byte for byte. Scroll down: each step is one part of it. Pick the English or the German interview.
Switch a term off to see what the model guesses without it.
A meeting, an interview, a voice memo — German or English, up to three hours per file. This one went in exactly as it is.
7:14 min · German · 8 minutes billed
Segments with start and end — and with timestamps=word, every single word. Press play: the text follows the audio.
Ja, hallo und herzlich willkommen zu einer weiteren Ausgabe vom Flying Circus TV.
Voices come back as S1, S2 — the API never guesses a name. You assign them when you fetch the result: GET …?speaker_names=S1:Host,S2:Guest.
S1 42 % · S2 58 % of the talking
Title, abstract, outline, decisions and open points — structured JSON, ready for your own template.
Interview with Maria Spilka from Mädchenflohmarkt.de on Startup Experiences and Female Foundership
translate=en or translate=de adds one translated segment for every original one, with the same timing.
Yes, hello and welcome to another episode of Flying Circus TV.
SRT and VTT, cut from the word timestamps: short lines, two per cue at most. These are the real files of this run.
1 00:00:04,400 --> 00:00:07,300 S1: Ja, hallo und herzlich willkommen zu einer weiteren Ausgabe vom Flying Circus
Terms you keep in your dashboard glossary — or send as vocabulary — go with every transcription, by API or by e-mail. The same sentence, without and with them:
Without glossaryDa stand, Mädchenflomag startet demnächst hier, meldet euch doch schon mal an.
With glossaryDa stand, Mädchenflohmarkt startet demnächst hier, meldet euch doch schon mal an.
Speakers come back as S1, S2; nothing here was edited. Recording: Interview with John Chowning, part 1 (2006), Interview by Alison Chaiken with John Chowning · Wikimedia Commons, CC BY-SA 3.0. Transcript, summary and translation of this recording are shared under the same licence. 606 s of audio → transcript, speakers, summary, word timestamps and the German translation, 11 minutes billed. Data: chowning.json, audio: chowning.mp3.Recording: Gründerin Maria Spilka im Gespräch mit Tobias Kollmann, zoomm.me / Flying Circus TV, CC BY. 434 s of audio → transcript, speakers, summary, word timestamps and the English translation, 8 minutes billed. Data: interview.json, audio: interview.mp3.
Or just send it by e-mail. Switch on "Protocol by e-mail" in your dashboard, then mail a recording to protokoll@klangzeile.com.
Attach the recording — mp3, m4a, wav, ogg … up to 25 MB per mail (about 18 MB of audio, roughly 40 minutes of a voice memo) — and send it from the address on your account. "en" or "de" in the subject asks for a translation.
A few minutes later one mail comes back: "Your protocol is ready (10:06 min) · Dein Protokoll ist fertigYour protocol is ready (7:14 min) · Dein Protokoll ist fertig". It carries a link, never the transcript. Billed like the API, minute by minute.
The link shows summary, speakers and downloads (text, SRT, VTT) — opened once, then deleted on our side. Save what you need.
Speech to text · your voice
Record up to 10 seconds. It goes to our EU transcription, comes back as text with a speaker label and a one-line summary, and is deleted right after.
No microphone at hand? Send a file instead — the quickstart has it running in two minutes.
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. Usage is counted in characters, nothing else.Idempotency-KeyRetry the same POST within 24 hours and it is billed once — the audio is generated again, not cached.application/problem+jsonEvery error is RFC 7807 with a request_id you can send us.MCPFor AI agents: the same API as tools in Claude, Cursor and VS Code — set it up.Upload a recording — a meeting, an interview, a voice memo — and get the transcript back with timestamps, speaker labels on request, plus a structured summary: title, abstract, outline, decisions, open points. German and English. Up to three hours per file; an hour of audio is back in about two minutes. Word timestamps and SRT/VTT subtitles on request. Translation de↔en on request.
curl -X POST https://klangzeile.com/v1/transcriptions \
-H "Authorization: Bearer $KEY" \
-F "file=@meeting.mp3" -F "language=de" -F "summary=true" \
-F "speakers=true" -F "vocabulary=Mädchenflohmarkt,Flying Circus TV"
# → 202 {"id": "tr_…", "status": "queued", "duration_seconds": 1834, …}
curl "https://klangzeile.com/v1/transcriptions/tr_…?speaker_names=S1:Host,S2:Guest" \
-H "Authorization: Bearer $KEY"
# → 200 {"status": "done", "text": "…",
# "segments": [{"start": 0.0, "end": 4.2, "text": "…", "speaker": "Host"}],
# "dialogue": "Host: …\nGuest: …", "speaker_count": 2,
# "summary": {"title": "…", "abstract": "…", "outline": [], "decisions": [], "open_points": []},
# "minutes_billed": 31}
Poll GET or pass webhook_url and we call you when it is done — the webhook is a notification only: it carries the job id and status, never the transcript, and it is unauthenticated, so always fetch the result with GET /v1/transcriptions/{id} and your API key (signature verification is a documented follow-up). The result is delivered once: the first successful GET deletes it from our side; unread results expire after 24 hours. Billing is per started minute of audio, at the moment the job finishes — a failed job costs nothing. Speech-to-text, speaker labels and the summary are produced by Mistral AI in the EU under a zero-data-retention agreement: audio and transcript are used to answer your request and are not stored there. Speakers come back as S1, S2, …; GET …/speakers shows who said what first, then fetch the result with speaker_names=S1:Anna to have the labels replaced — we never guess a name.
Need more than the free allowance, or an invoice instead of a card? Write to us.