Voizum

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.

KriteriumWarum es wichtig istWorauf du achten solltest
Latenz oder lange AudiosEin Echtzeit-Agent braucht Streaming, eine Vertonung lange Dateien ohne SchnittstellenGibt es Streaming? Wie viel Text nimmt eine Anfrage maximal?
SprachenJede Sprache hat ihre eigenen StimmenSpricht dieselbe Stimme alle Sprachen, die du brauchst?
Eigene und geklonte StimmenEine wiedererkennbare Stimme gehört zu deiner MarkeKannst du deine geklonte Stimme per API nutzen? Gibt es eine Obergrenze?
Preis pro ZeichenSo rechnen fast alle am Ende abPreis pro 1.000 Zeichen, Mindestbetrag pro Anfrage, ob die API extra kostet
Ungenutzte CreditsMonatspläne setzen sich zurück: Du zahlst für UngenutztesSammeln sich Credits an, verfallen sie oder gehen sie beim Kündigen verloren?
LimitsAnfragen pro Minute und gleichzeitige Aufträge bestimmen deine ArchitekturLimit-Header, Retry-After, maximale parallele Aufträge
Format und SpeicherungDu speicherst, bearbeitest oder streamst die DateiFormat (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.

  1. 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. 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.
  3. 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.
  4. 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“.
  5. 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.
codeHTTPWas zu tun ist
no_autorizado401Schlüssel fehlt, ist falsch oder wurde widerrufen
saldo_insuficiente402Nicht genug gekaufte Credits; die Antwort nennt, wie viele nötig sind
voz_no_encontrada404Diese voice_id ist nicht in deiner Bibliothek: Füge sie zuerst hinzu
texto_demasiado_largo400Mehr als 600.000 Zeichen: Teile den Text auf
limite_peticiones429Warte die Sekunden aus Retry-After ab und versuche es erneut
demasiados_en_cola429Zu viele laufende Aufträge: Lass einige fertig werden
servicio_no_disponible503Später erneut versuchen, mit wachsenden Abständen
Limits: 20 neue Audios pro Minute und insgesamt 300 Anfragen pro Minute, je Schlüssel. Jede Antwort enthält X-RateLimit-Limit und X-RateLimit-Remaining.

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.

DienstPro Minute Audio (Einstiegstarif)API in diesem Tarif enthaltenUngenutzte Credits
Voizum0,013 €JaVerfallen nie
MiniMax0,043 €Nein, wird extra berechnetVerfallen nach 2 Monaten
Fish Audio0,067 €Nein, wird extra berechnetVerfallen jeden Monat
ElevenLabs0,171 €JaGehen beim Kündigen verloren
Narakeet0,173 €JaVerfallen nie
TTSMaker0,040 €Nein, wird extra berechnetVerfallen jeden Monat
Wo die API extra berechnet wird, kann ihr Minutenpreis vom Tarifpreis abweichen. Die Standardstimmen der großen Cloud-Anbieter kosten weniger, klingen aber weniger natürlich und klonen keine Stimmen.

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

  1. n8n-Dokumentation: HTTP-Request-Node (englisch)
  2. n8n-Dokumentation: HTTP-Request-Zugangsdaten (Header Auth, englisch)
  3. Make-Entwicklerdokumentation: Anfragen senden (englisch)
  4. Zapier-Hilfe: Webhooks in Zaps senden (englisch)
  5. IETF-Entwurf: der HTTP-Header Idempotency-Key (englisch)
  6. MDN: Retry-After-Header (englisch)
  7. MDN: Web Speech API
  8. OWASP: Leitfaden zum Umgang mit Secrets (englisch)

Das könnte dir auch helfen

Häufige Fragen

Gibt es eine kostenlose Text-to-Speech-API?
Ja, mit Einschränkungen. Browser bringen kostenlos die Web Speech API mit, die auf dem Gerät des Besuchers vorliest, aber keine Datei liefert und synthetisch klingt. Open-Source-Modelle sind gratis, wenn du sie auf einer eigenen GPU betreibst. Die API von Voizum läuft über gekaufte Credits; die Gratis-Credits des Monats gelten nur im Web-Generator.
Wie nutze ich eine Text-to-Speech-API mit Python?
Du schickst mit requests einen POST mit Text und voice_id, speicherst die zurückgegebene job_id, fragst alle paar Sekunden den Status ab, bis er auf done steht, und lädst audio_url mit demselben Authorization-Header herunter. Das Python-Beispiel in dieser Anleitung macht genau das.
Kann ich meine geklonte Stimme per API nutzen?
Ja. Du klonst sie einmal im Web (199 Credits), und ihre ID erscheint in GET /voices wie jede andere Stimme deiner Bibliothek. Von da an nutzt du sie als voice_id, und sie spricht alle sieben unterstützten Sprachen.
Wie viel Text passt in eine Anfrage?
Bis zu 600.000 Zeichen pro Anfrage, etwa 10 Stunden Audio, als eine MP3. Für viele einzelne Stücke nimmt eine Batch-Anfrage bis zu 100 Audios an, und der Mindestbetrag wird nur einmal berechnet.
Eignet sich die Voizum-API für Sprachagenten in Echtzeit?
Nein. Sie arbeitet asynchron und hat kein Streaming: Du legst einen Auftrag an und holst die Datei ab, wenn sie fertig ist. Sie ist für Vertonung, Kurse, Batches und Automatisierungen gedacht; für Live-Gespräche nimm eine API mit Streaming.
Darf ich das erzeugte Audio kommerziell nutzen?
Ja, auf YouTube, in Werbung, in Kursen oder in deinem Produkt. Nicht erlaubt sind die Nachahmung einer anderen Person, die Nutzung einer Stimme, die du nicht klonen darfst, und illegale Inhalte.
Wie binde ich eine TTS-API in n8n ein?
Mit dem HTTP-Request-Node und Header-Auth-Zugangsdaten für den Bearer-Schlüssel: Ein Node legt den Auftrag an, ein Wait- und ein If-Node fragen den Status in einer Schleife ab, und ein letzter HTTP Request lädt audio_url als Datei herunter. Hat dein n8n eine öffentliche https-Adresse, kannst du statt der Schleife einen Webhook angeben.

Weitere Ratgeber

Gib deinen Text ein und hör ihn mit einer echten Stimme

Die API verbraucht Credits aus einem Paket (60 pro 1.000 Zeichen) und verlangt die Anmeldung mit Google. Pakete ab 5,99 €, ohne Abo.