Ratgeber
Text-to-Speech-API: Anleitung mit Python- und JS-Beispielen
Das Voizum-Team · Aktualisiert · 10 Min. Lesezeit
Eine Text-to-Speech-API macht aus Text eine Audiodatei, direkt aus deinem Code oder deiner Automatisierung, ohne dass jemand Buttons klickt. In dieser Anleitung siehst du, wie du die passende wählst, und eine vollständige, funktionierende Anbindung: Auftrag anlegen, Status abfragen, MP3 herunterladen. Dazu kommen lange Texte, Batches, die Nutzung deiner eigenen geklonten Stimme und die Anbindung an n8n, Make oder Zapier.
Was eine Text-to-Speech-API macht und wann du eine brauchst
Eine TTS-API ist eine HTTP-Adresse: Du schickst einen Text und eine Stimme und bekommst Audio zurück. Sinnvoll wird sie, sobald Audio Teil eines Ablaufs ist und keine Einzelaufgabe mehr. Wenn du einmal im Monat ein Video vertonst, ist der Web-Editor schneller. Wenn du jeden Tag eins vertonst oder dein Produkt sprechen soll, erspart dir die API jedes Mal das Kopieren, Einfügen und Herunterladen.
Am häufigsten sehen wir diese Einsatzzwecke:
- YouTube-Kanäle, auch ohne Gesicht: Das Skript kommt aus einem Schreibschritt (oft ein KI-Modell), geht direkt in die Vertonung und von dort in den Videoschnitt.
- Online-Kurse und Schulungen: Hunderte kurze Lektionen, die neu erzeugt werden, sobald sich der Text ändert.
- Apps und Produkte: Hinweise, Begrüßung, Barrierefreiheit, Buttons wie „Artikel vorlesen“.
- Batches: Produktbeschreibungen, Audioversion eines Blogs, Telefonansagen, dasselbe Skript in mehreren Sprachen.
- Automatisierungen ohne Code: Abläufe in n8n, Make oder Zapier, die eine neue Tabellenzeile in eine MP3 verwandeln.
So wählst du eine Text-to-Speech-API aus
Geh von dem aus, was du baust, nicht von der Stimmen-Demo. Der Markt teilt sich in Latenz und Länge: Ein Sprachassistent braucht die erste Silbe nach wenigen hundert Millisekunden und bekommt das Audio in Stücken, während es entsteht. Ein Sprecher dagegen muss ein 40-Minuten-Skript als eine saubere Datei liefern. Wenige APIs können beides gut, und die pro Zeichen günstigsten klingen oft am wenigsten natürlich.
| Kriterium | Warum es wichtig ist | Worauf du achten solltest |
|---|---|---|
| Latenz oder lange Audios | Ein Echtzeit-Agent braucht Streaming, eine Vertonung lange Dateien ohne Schnittstellen | Gibt es Streaming? Wie viel Text nimmt eine Anfrage maximal? |
| Sprachen | Jede Sprache hat ihre eigenen Stimmen | Spricht dieselbe Stimme alle Sprachen, die du brauchst? |
| Eigene und geklonte Stimmen | Eine wiedererkennbare Stimme gehört zu deiner Marke | Kannst du deine geklonte Stimme per API nutzen? Gibt es eine Obergrenze? |
| Preis pro Zeichen | So rechnen fast alle am Ende ab | Preis pro 1.000 Zeichen, Mindestbetrag pro Anfrage, ob die API extra kostet |
| Ungenutzte Credits | Monatspläne setzen sich zurück: Du zahlst für Ungenutztes | Sammeln sich Credits an, verfallen sie oder gehen sie beim Kündigen verloren? |
| Limits | Anfragen pro Minute und gleichzeitige Aufträge bestimmen deine Architektur | Limit-Header, Retry-After, maximale parallele Aufträge |
| Format und Speicherung | Du speicherst, bearbeitest oder streamst die Datei | Format (MP3, WAV, PCM) und wie lange die Datei aufbewahrt wird |
Dein Schlüssel und deine voice_id, Schritt für Schritt
Alles ist REST mit JSON, Basisadresse https://voizum.com/api/v1, Authentifizierung über einen Bearer-Schlüssel, der mit sk_voizum_ beginnt. Der Ablauf ist immer gleich: Auftrag anlegen, Status abfragen, MP3 herunterladen.
- 1Melde dich bei Voizum mit Google an und kaufe ein beliebiges Credit-Paket: Der Schlüssel wird mit beidem freigeschaltet. Die API verbraucht gekaufte Credits, nie die Gratis-Credits des Monats.
- 2Öffne die API-Seite und erzeuge deinen Schlüssel. Er wird nur einmal angezeigt: Speichere ihn sofort in einer Umgebungsvariablen (VOIZUM_API_KEY) oder in deinem Secret-Manager.
- 3Lege eine Stimme in deine Bibliothek: Klone deine eigene oder speichere eine aus der öffentlichen Bibliothek mit „Hinzufügen“. Die API arbeitet nur mit Stimmen aus deiner Bibliothek.
- 4Liste sie mit GET /voices auf. Jede hat id, name und language; die id ist die voice_id, die du beim Erstellen mitschickst. Du kannst sie auch im Web kopieren: unter „Stimmen“ im Menü ⋯ auf „ID für die API“.
- 5Optional: Vor einem großen Durchlauf zeigt GET /status (öffentlich, ohne Schlüssel), ob der Dienst läuft, und GET /account zeigt dein Guthaben und deine Limits.
Codebeispiele: curl, Python und JavaScript
Die Beispiele funktionieren so, wie sie sind, sobald du YOUR_VOICE_ID und JOB_ID ersetzt. Die Audio-Adresse aus der Statusabfrage braucht denselben Authorization-Header und leitet zur Datei weiter. Dein HTTP-Client muss also Weiterleitungen folgen.
curl
Auftrag anlegen (202 mit job_id und eta_seconds), abfragen und herunterladen:
# 1. Auftrag anlegen
curl -X POST https://voizum.com/api/v1/tts \
-H "Authorization: Bearer $VOIZUM_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: video-042-intro" \
-d '{"text": "Willkommen zurück auf dem Kanal.", "voice_id": "YOUR_VOICE_ID"}'
# 2. Status abfragen (wiederholen, bis "done")
curl https://voizum.com/api/v1/tts/JOB_ID -H "Authorization: Bearer $VOIZUM_API_KEY"
# 3. MP3 herunterladen
curl -L -o vertonung.mp3 https://voizum.com/api/v1/tts/JOB_ID/audio -H "Authorization: Bearer $VOIZUM_API_KEY"Python (requests)
Derselbe Ablauf, mit Warten, solange der Auftrag in der Warteschlange ist oder erzeugt wird:
import os, time, requests
API = "https://voizum.com/api/v1"
H = {"Authorization": "Bearer " + os.environ["VOIZUM_API_KEY"]}
# 1. Auftrag anlegen
with open("skript.txt", encoding="utf-8") as f:
texto = f.read()
r = requests.post(API + "/tts", headers=H, json={"text": texto, "voice_id": "YOUR_VOICE_ID"})
r.raise_for_status()
job = r.json()["job_id"]
# 2. Warten, solange er in der Warteschlange ist oder erzeugt wird
while True:
s = requests.get(API + "/tts/" + job, headers=H).json()
if s["status"] not in ("queued", "processing"):
break
time.sleep(5)
if s["status"] != "done":
raise RuntimeError(s.get("error", s["status"]))
# 3. MP3 herunterladen
audio = requests.get(s["audio_url"], headers=H)
audio.raise_for_status()
with open("vertonung.mp3", "wb") as f:
f.write(audio.content)JavaScript (Node 18 oder neuer, ES-Module)
Mit dem eingebauten fetch, ohne SDK:
import fs from "node:fs";
const API = "https://voizum.com/api/v1";
const H = { Authorization: "Bearer " + process.env.VOIZUM_API_KEY, "Content-Type": "application/json" };
// 1. Auftrag anlegen
const crear = await fetch(API + "/tts", {
method: "POST",
headers: H,
body: JSON.stringify({ text: "Willkommen zurück auf dem Kanal.", voice_id: "YOUR_VOICE_ID" }),
});
if (!crear.ok) throw new Error(await crear.text());
const { job_id } = await crear.json();
// 2. Warten, solange er in der Warteschlange ist oder erzeugt wird
let s;
do {
await new Promise((r) => setTimeout(r, 5000));
s = await (await fetch(API + "/tts/" + job_id, { headers: H })).json();
} while (s.status === "queued" || s.status === "processing");
if (s.status !== "done") throw new Error(s.error ?? s.status);
// 3. MP3 herunterladen
const audio = await fetch(s.audio_url, { headers: H });
fs.writeFileSync("vertonung.mp3", Buffer.from(await audio.arrayBuffer()));Optionale Parameter
speed (von 0.5 bis 2, Standard 1), pause_ms (Pause zwischen Sätzen, 0 bis 800 ms), language ("auto" oder es, en, de, fr, pt, it, ru; ohne Angabe wird sie aus dem Text erkannt) und loudness_normalization (true, damit alle Stimmen gleich laut ausgegeben werden). Mögliche Status sind queued, processing, done, error und canceled. Die vollständige Referenz steht unter https://voizum.com/docs, die OpenAPI-Spezifikation unter https://voizum.com/openapi.json und eine Nur-Text-Version für KI-Coding-Assistenten unter https://voizum.com/llms.txt.
Lange Skripte, Batches und Dialoge
Eine Anfrage nimmt bis zu 600.000 Zeichen an, etwa 10 Stunden Sprache, und kommt als eine einzige MP3 zurück. Du musst das Skript nicht zerlegen und die Teile zusammensetzen: Das erledigt der Auftrag intern, und die Statusabfrage zeigt den Fortschritt (parts_done, parts_total, percent).
Für viele kurze Stücke gibt es POST /tts/batch: bis zu 100 Audios und insgesamt 1.200.000 Zeichen (etwa 20 Stunden). Jedes bekommt eine eigene job_id und eine eigene Datei, aber die Mindestmenge von 100 Credits wird einmal für den ganzen Batch berechnet statt einmal pro Anfrage. Acht kurze App-Hinweise kosten einzeln gesendet 800 Credits, im Batch 100.
Für ein Gespräch in einer Datei (Podcast-Intro, Spot mit zwei Stimmen) gibt es POST /tts/dialogue mit den Sprechbeiträgen in Reihenfolge und bis zu 5 verschiedenen Stimmen. Abgerechnet wird wie bei einem normalen Audio, nach den Zeichen des gesamten Skripts.
Deine geklonte Stimme per API nutzen
Das Klonen machst du einmal im Web, es kostet 199 Credits. Danach ist die Stimme einfach eine weitere voice_id, und jedes Audio wird wie mit jeder anderen Stimme abgerechnet. Einen Klon-Endpunkt gibt es in der API absichtlich nicht: Die Aufnahme ist der Schritt, bei dem du vor dem Weitermachen reinhören solltest. Nimm 15 bis 60 Sekunden auf, nur mit deiner Stimme, schneide in einer Pause statt mitten im Wort und sprich so, wie die Vertonung später klingen soll, denn auch die Betonung wird übernommen.
Deine geklonten Stimmen sprechen alle sieben Sprachen: Eine Aufnahme auf Deutsch vertont also auch die englische, spanische oder französische Version deines Kanals. Klone nur deine eigene Stimme oder eine, für die du die Erlaubnis hast.
Anbindung an n8n, Make oder Zapier
Keine Automatisierungsplattform braucht ein eigenes Voizum-Modul: Alle drei haben einen allgemeinen HTTP-Schritt, und die API besteht aus drei einfachen Aufrufen. Die einzige Entscheidung ist, wie du auf das Audio wartest: in einer Schleife abfragen oder dich per webhook_url benachrichtigen lassen.
Die Benachrichtigung (nur bei POST /tts) sendet einen POST mit event, id, status (completed oder error), voice_id, duration_seconds und credits, sobald der Auftrag fertig ist, mit bis zu drei Versuchen. Die Adresse muss eine öffentliche https-Adresse sein. Ein n8n, das lokal unter localhost läuft, kann sie also nicht empfangen: Frag dann in einer Schleife ab.
n8n
HTTP-Request-Node mit Header-Auth-Zugangsdaten (Authorization, Wert Bearer sk_voizum_…) und eine Schleife zum Warten:
- HTTP Request: POST https://voizum.com/api/v1/tts mit einem JSON-Body, der text und voice_id enthält.
- Wait-Node für ein paar Sekunden, danach HTTP Request: GET /tts/{{ $json.job_id }}.
- If-Node: Bei status done geht es weiter, bei queued oder processing zurück zum Wait, bei error Abbruch.
- HTTP Request auf audio_url mit denselben Zugangsdaten und dem Antwortformat File; die Binärdaten gehen weiter an Drive, S3 oder deinen Videoschritt.
Make und Zapier
In Make sendet das Modul Make a request der HTTP-App den POST mit dem Authorization-Header. In Zapier erledigt Webhooks by Zapier dasselbe mit einer POST- oder Custom-Request-Aktion. In beiden ist das Warten am saubersten über ein zweites Szenario beziehungsweise einen zweiten Zap, der mit einem eigenen Webhook startet (Custom Webhook in Make, Catch Hook in Zapier): Gib diese Adresse als webhook_url mit, und wenn die Benachrichtigung ankommt, rufst du GET /tts/{id} ab und lädst audio_url mit deinem Schlüssel herunter.
Fehler und bewährte Praxis im Betrieb
Alle Fehler haben dieselbe Form, { error: { code, message } }. Programmiere gegen code, der stabil bleibt, nie gegen message, das ein Text für Menschen ist und sich ändern kann.
- Sende bei jedem POST /tts einen Idempotency-Key (die ID deines Videos oder deiner Zeile eignet sich). Wenn ein Netzwerkfehler dich zum erneuten Senden zwingt, bekommst du denselben Auftrag mit 200 zurück und zahlst nicht doppelt.
- Speichere die job_id, sobald du sie hast. Stürzt dein Prozess ab, listet GET /tts deine letzten Aufträge mit einem Cursor auf, und mit ?status=done kannst du filtern.
- Frag alle paar Sekunden ab oder warte die Zeit aus eta_seconds, statt ohne Pause zu fragen.
- Lade die Datei herunter und bewahre deine eigene Kopie auf: Die MP3 bleibt 4 Tage erhalten, danach wird sie gelöscht.
- Fehler gemacht? DELETE /tts/{id} bricht einen Auftrag ab, der noch in der Warteschlange ist, und erstattet ihn vollständig. Wird er schon erzeugt, lässt er sich nicht mehr abbrechen. Endet ein Auftrag mit einem Fehler, werden die Credits automatisch zurückgebucht.
- Rufe die API nie aus dem Browser oder einer Mobile-App auf: Jeder könnte den Schlüssel sehen. Ruf sie von deinem Server aus auf, und lass dein Frontend mit deinem Server sprechen.
- Tausche den Schlüssel, wenn er womöglich öffentlich geworden ist. Ein neuer Schlüssel widerruft den alten sofort, aktualisiere also gleich danach die Umgebungsvariable.
| code | HTTP | Was zu tun ist |
|---|---|---|
| no_autorizado | 401 | Schlüssel fehlt, ist falsch oder wurde widerrufen |
| saldo_insuficiente | 402 | Nicht genug gekaufte Credits; die Antwort nennt, wie viele nötig sind |
| voz_no_encontrada | 404 | Diese voice_id ist nicht in deiner Bibliothek: Füge sie zuerst hinzu |
| texto_demasiado_largo | 400 | Mehr als 600.000 Zeichen: Teile den Text auf |
| limite_peticiones | 429 | Warte die Sekunden aus Retry-After ab und versuche es erneut |
| demasiados_en_cola | 429 | Zu viele laufende Aufträge: Lass einige fertig werden |
| servicio_no_disponible | 503 | Später erneut versuchen, mit wachsenden Abständen |
Was kostet eine Text-to-Speech-API?
Die API verbraucht dieselben Credits wie das Web: 60 Credits pro 1.000 Zeichen (etwa 60 pro Minute Audio), mit einem Minimum von 100 pro Anfrage. Eine 10-Minuten-Vertonung für YouTube hat etwa 9.850 Zeichen, also 591 Credits. Sie läuft nur mit gekauften Credits, die nicht verfallen und ohne Abo auskommen; die Gratis-Credits des Monats, die du mit Google bekommst, gelten nur für den Web-Generator.
Unten siehst du, was eine Minute Audio im günstigsten Tarif jedes Dienstes kostet, nach den Angaben von September 2026. Voizum steht mit dem Paket Máxi, dem mit dem besten Preis pro Credit. Alles in Euro, damit es vergleichbar ist.
| Dienst | Pro Minute Audio (Einstiegstarif) | API in diesem Tarif enthalten | Ungenutzte Credits |
|---|---|---|---|
| Voizum | 0,013 € | Ja | Verfallen nie |
| MiniMax | 0,043 € | Nein, wird extra berechnet | Verfallen nach 2 Monaten |
| Fish Audio | 0,067 € | Nein, wird extra berechnet | Verfallen jeden Monat |
| ElevenLabs | 0,171 € | Ja | Gehen beim Kündigen verloren |
| Narakeet | 0,173 € | Ja | Verfallen nie |
| TTSMaker | 0,040 € | Nein, wird extra berechnet | Verfallen jeden Monat |
Du willst keinen Code schreiben?
Wenn du Audio erzeugen willst, während du mit Claude oder ChatGPT chattest, brauchst du die API nicht: Der Voizum-Konnektor gibt dem Assistenten Werkzeuge zum Erzeugen und zum Auflisten von Stimmen, meldet sich mit deinem Konto an und folgt den Regeln des Webs, einschließlich der Gratis-Credits des Monats. Die Einrichtung dauert ein paar Minuten auf der Seite „Claude und ChatGPT“.
Und wenn du nur eine Seite brauchst, die Text im Browser des Besuchers vorliest, reicht die Web Speech API, die Browser mitbringen. Sie ist gratis, klingt aber robotisch, ist von Gerät zu Gerät verschieden und liefert dir keine Datei. Eine Text-to-Speech-API lohnt sich, sobald du eine natürliche Stimme in einer MP3 brauchst, die du veröffentlichen kannst.
Verwendete Quellen
- n8n-Dokumentation: HTTP-Request-Node (englisch)
- n8n-Dokumentation: HTTP-Request-Zugangsdaten (Header Auth, englisch)
- Make-Entwicklerdokumentation: Anfragen senden (englisch)
- Zapier-Hilfe: Webhooks in Zaps senden (englisch)
- IETF-Entwurf: der HTTP-Header Idempotency-Key (englisch)
- MDN: Retry-After-Header (englisch)
- MDN: Web Speech API
- OWASP: Leitfaden zum Umgang mit Secrets (englisch)