API-Referenz
Basis-URL https://api.vocallab.ai. Jede Anfrage benötigt Authorization: Bearer vl_live_... (siehe API-Schlüssel).
GET /api/v1/ping
Verbindungs- und Authentifizierungstest. Gibt dein Credit-Guthaben zurück.
{ "ok": true, "points": 12345, "unit": "points (1 pt ≈ 1 second of audio)" }
GET /api/v1/voices
Die Stimmen, die du nutzen kannst — zuerst deine geklonten und gestalteten Stimmen, dann der öffentliche Katalog. Verwende die zurückgegebene id als voice beim Generieren. Katalogstimmen akzeptieren auch ihren slug.
| Parameter | Standard | Hinweise |
|---|---|---|
limit | (keiner) | Wie viele zurückkommen, 1–500. Weggelassen kommt die ganze Liste — rund 260 Stimmen |
offset | 0 | Wie viele übersprungen werden, zum Blättern |
q | — | Groß-/kleinschreibungsunabhängiger Filter auf id, slug und name der Stimme, z. B. ?q=ashley |
type | — | preset, clone, designed |
Jede Antwort enthält total, count, offset und has_more, du kannst also blättern, ohne zu raten. Dieselben vier Parameter (ohne type) funktionieren bei GET /api/v1/voices/clones und GET /api/v1/voices/designs.
curl "https://api.vocallab.ai/api/v1/voices?q=narrator&limit=20" \
-H "Authorization: Bearer vl_live_..."
{ "voices": [
{ "id": "Ashley", "slug": "warm-natural-female-explainer-voice-for-youtube-podcasts",
"name": "Warm Natural Female Explainer Voice for YouTube & Podcasts",
"type": "preset", "languages": ["en"], "category": "Narration" },
{ "id": "default-abc123__my-voice", "name": "My Narrator", "type": "clone", "languages": ["en"] }
] }
GET /api/v1/models
Die auswählbaren Sprachmodelle. Übergib einen key als model an POST /api/v1/tts (Standard v-pro). API-Schlüssel können sie alle verwenden. Die Unterschiede findest du unter Sprachmodelle.
{ "default": "v-pro", "models": [
{ "key": "v-studio", "label": "VocalLab Studio", "steerable": true, "costMultiplier": 1,
"supportsTemperature": false, "supportsDeliveryMode": true },
{ "key": "v-flash", "label": "VocalLab Studio Flash", "steerable": false, "costMultiplier": 0.75,
"supportsTemperature": false, "supportsDeliveryMode": false },
{ "key": "v-pro", "label": "VocalLab Pro", "steerable": false, "costMultiplier": 1,
"supportsTemperature": true, "supportsDeliveryMode": false },
{ "key": "v-lite", "label": "VocalLab Lite", "steerable": false, "costMultiplier": 0.5,
"supportsTemperature": true, "supportsDeliveryMode": false }
] }
POST /api/v1/tts
Sprache erzeugen.
| Feld | Erforderlich | Hinweise |
|---|---|---|
text | ja | Bis zu 2.000 Zeichen. Jeder Aufruf wird als einzelne Anfrage synthetisiert — teile längere Texte in mehrere Aufrufe auf |
voice | ja | Eine Stimmen-id aus /api/v1/voices |
model | nein | v-studio (neuestes, steuerbar, 200+ Sprachen), v-flash (200+ Sprachen, ca. 5× schneller, ¾ Punkte), v-pro (Standard — höchste Wiedergabetreue, 15 Sprachen) oder v-lite (schnell, ½ Punkte). Siehe GET /api/v1/models |
speed | nein | Zahl 0.5–1.5 (Schritt 0.05). Standard: Stimmenwert |
temperature | nein | Zahl 0.7–1.5 (Schritt 0.05). Höher = ausdrucksstärker und variabler. Von v-studio und v-flash ignoriert — nutze bei v-studio stattdessen delivery_mode. Standard: Stimmenwert |
delivery_mode | nein | STABLE, BALANCED oder CREATIVE — wie stark das Modell seinen Vortrag variiert. Nur v-studio; mit einem anderen Modell gesendet ergibt es 422 |
enhance_generation | nein | true entrauscht das erzeugte Audio. Funktioniert bei jedem Modell. Standard false — es kann die Stimme zu glatt klingen lassen |
format | nein | Eines von MP3 (Standard), WAV, FLAC, OGG_OPUS, LINEAR16, PCM, ALAW, MULAW |
bit_rate | nein | Ganzzahl 32000–320000. Nur MP3 & OGG_OPUS; bei anderen Formaten ignoriert |
sample_rate | nein | Eines von 8000, 16000, 22050, 24000, 32000, 44100, 48000 (Hz) |
captions | nein | true (oder "phrase" / "word") liefert die SRT-Untertitel direkt mit als captions — ein zweiter Aufruf entfällt. Siehe GET /api/v1/tts/:id/captions |
curl -X POST https://api.vocallab.ai/api/v1/tts \
-H "Authorization: Bearer vl_live_..." \
-H "Content-Type: application/json" \
-d '{"text":"Hello from VocalLab","voice":"Ashley"}'
Gibt das Audio inline (base64) plus eine id zurück. Die gehostete URL erscheint, sobald der Upload abgeschlossen ist — frage sie über GET /api/v1/tts/:id ab.
{ "id": "...", "status": "pending", "audio_base64": "data:audio/mp3;base64,...",
"audio_url": null, "stream_url": "https://api.vocallab.ai/api/v1/tts/.../audio",
"captions_url": "https://api.vocallab.ai/api/v1/tts/.../captions",
"format": "MP3", "model": "v-pro", "points_used": 12 }
Modell & Kosten.
v-flashberechnet ¾ (points = ⌈ Zeichen ÷ 20 ⌉) undv-litedie Hälfte (÷ 30) der Punkte vonv-pro/v-studio(÷ 15).v-studioist das einzige Modell, das Ausdrucks-/Steuerungsanweisungen befolgt — siehe Sprachmodelle und Voice Steering.
Pausen
Eine Stille exakter Länge fügst du mit einem selbstschließenden <break />-Tag direkt im text ein:
{ "text": "Lass mich überlegen <break time=\"1.5s\" /> Ja, ich habe darüber nachgedacht.", "voice": "Ashley" }
- Sekunden oder Millisekunden —
1.5s=1500ms. - Bis zu 20 Break-Tags pro Anfrage, in jeder unterstützten Sprache.
- Break-Tags zählen zum 2.000-Zeichen-Limit und werden aus Untertiteln/SRT entfernt.
GET /api/v1/tts/:id
Generierungsstatus und die gehostete Audio-URL, sobald sie bereit ist.
{ "id": "...", "status": "ready", "audio_url": "https://...",
"stream_url": "https://api.vocallab.ai/api/v1/tts/.../audio",
"captions_url": "https://api.vocallab.ai/api/v1/tts/.../captions", "format": "MP3" }
GET /api/v1/tts/:id/audio
Streame die Audiobytes des fertigen Clips direkt — eine Alternative zum base64-Blob audio_base64. Wird inline ausgeliefert (spielt im Browser oder Media-Player ab) und unterstützt den HTTP-Range-Header, sodass Clients spulen können. Solange der Clip noch fertiggestellt wird, kommt 409 — frage GET /api/v1/tts/:id ab, bis status ready ist, und streame dann.
curl -L https://api.vocallab.ai/api/v1/tts/GENERATION_ID/audio \
-H "Authorization: Bearer vl_live_..." \
-o speech.mp3
Derselbe Link wird als stream_url bei POST /api/v1/tts und GET /api/v1/tts/:id zurückgegeben.
GET /api/v1/tts/:id/captions
Untertitel einer Generierung als .srt-Datei. Die Cues folgen dem tatsächlichen Sprechtempo (Wort-Timings aus der Synthese), und jegliche [emotion]-Markierung oder <break />-Pause wird entfernt — nur gesprochene Wörter landen in der Datei.
Untertitel werden aus den gespeicherten Timings gebaut, nicht aus der Audiodatei — sie sind sofort verfügbar, auch während status noch pending ist.
| Query | Standard | Hinweise |
|---|---|---|
format | srt | srt liefert die Untertiteldatei; json liefert { srt, words, duration } für eigenes Rendering |
mode | phrase | phrase = lesbare Untertitelzeilen (getrennt an Pausen, Satz- und Satzteilenden). word = ein Cue pro Wort, für Karaoke-Hervorhebung |
max_words | 4 | Wörter pro Zeile im phrase-Modus, 2–7 |
uppercase | false | true schreibt den Untertiteltext in GROSSBUCHSTABEN |
curl -L "https://api.vocallab.ai/api/v1/tts/GENERATION_ID/captions" \
-H "Authorization: Bearer vl_live_..." \
-o speech.srt
1
00:00:00,000 --> 00:00:01,240
Hello from VocalLab,
2
00:00:01,240 --> 00:00:03,100
this is your narrator speaking.
Mit format=json:
{ "id": "...", "mode": "phrase", "duration": 3.1,
"srt": "1\n00:00:00,000 --> 00:00:01,240\nHello from VocalLab,\n\n...",
"words": [ { "word": "Hello", "start": 0, "end": 0.32 } ] }
Derselbe Link wird als captions_url bei POST /api/v1/tts und GET /api/v1/tts/:id zurückgegeben. Mit "captions": true bei POST /api/v1/tts kommt das SRT direkt zusammen mit dem Audio zurück.
Gibt 409 captions_unavailable zurück, wenn zu einer Generierung keine Wort-Timings gespeichert sind (einige ältere Clips) — das Audio ist davon nicht betroffen.
DELETE /api/v1/tts/:id
Lösche eine dir gehörende Generierung endgültig — sowohl die gespeicherte Audiodatei als auch ihren Datenbankeintrag. Praktisch zum Aufräumen nach dem Download oder zum Erfüllen einer Löschanfrage. Eine id, die nicht existiert oder nicht dir gehört, ergibt 404.
curl -X DELETE https://api.vocallab.ai/api/v1/tts/GENERATION_ID \
-H "Authorization: Bearer vl_live_..."
{ "ok": true, "id": "...", "deleted": true }
GET /api/v1/voices/languages
Neu:
GET /api/v1/voices/languagesliefert jetzt über 470 Sprachen samt Akzentvarianten (z. B.en-GB,pt-PT).codeist ein BCP-47-Tag; die alten Enum-Werte (EN_US,PT_BR, …) undOtherwerden weiterhin akzeptiert.
Die Sprachen und Aufnahmegrenzen für Cloning und Voice Design. Frag sie hier ab, statt die Liste fest zu verdrahten — es ist dieselbe Quelle, die auch das Upload-Formular im Studio liest.
{ "languages": [
{ "name": "English", "code": "EN_US", "experimental": false },
{ "name": "Other", "code": "AUTO", "experimental": true }
],
"sample_limits": { "max_samples": 1, "max_base64_length": 4194304,
"allowed_formats": ["mp3", "wav", "webm"] } }
Voice Design
Erfinde eine völlig neue Stimme aus einer schriftlichen Beschreibung — ganz ohne Aufnahme. Es sind zwei Aufrufe: Kandidaten-Vorschauen erzeugen, dann die beste behalten.
POST /api/v1/voices/designs/previews
Erzeugt bis zu drei Stimmkandidaten. Kostet Points — jede Vorschau ist eine echte Synthese von preview_text zum API-Tarif (⌈Zeichen ÷ 15⌉ pro Vorschau).
Gespeichert wird noch nichts, also belegt das keinen Design-Platz — aber es setzt einen freien voraus. Sind deine Designs bereits am Tariflimit, antwortet der Aufruf mit 409 design_limit und es werden keine Points abgebucht: für eine Stimme, die du nicht behalten kannst, sollst du nicht zahlen.
| Feld | Pflicht | Hinweise |
|---|---|---|
prompt | ja | Beschreibe die Stimme auf Englisch, 30–1000 Zeichen: Geschlecht, Alter, Akzent, Klang, Tempo und Vortrag. |
language | nein | Sprache, die die Stimme sprechen soll (English, ES_ES, …). Standard auto — aus der Beschreibung abgeleitet. |
preview_text | nein | Was die Vorschauen sagen, bis zu 1.000 Zeichen. Standard ist ein kurzer Beispielsatz. |
count | nein | Wie viele Kandidaten erzeugt werden, 1–3 (Standard 3). Jeder wird berechnet. |
include_audio | nein | true liefert jede Vorschau zusätzlich als base64. Jede Vorschau hat ohnehin eine preview_url, die Bytes sind also optional. |
curl -X POST https://api.vocallab.ai/api/v1/voices/designs/previews \
-H "Authorization: Bearer vl_live_..." \
-H "Content-Type: application/json" \
-d '{"prompt":"A warm, unhurried British woman in her forties, low and reassuring, like a documentary narrator.","count":2}'
{ "previews": [
{ "preview_id": "...", "text": "Hello! This is a preview of my voice...",
"preview_url": "https://api.vocallab.ai/api/v1/audio/..." }
],
"points_used": 12, "expires_in": 1800 }
Eine preview_id ist noch keine nutzbare Stimme und rund 30 Minuten gültig.
Vorschauen, die du nicht behältst, werden verworfen. Speichere die gewünschte, bevor du einen neuen Satz erzeugst — ein erneuter Aufruf verwirft deine vorherigen Vorschauen und ihre preview_urls hören auf zu funktionieren, und das Speichern einer verwirft den Rest ihres Satzes. In beiden Fällen bleibt nichts zurück.
POST /api/v1/voices/designs
Behält eine Vorschau als dauerhafte Stimme. Kostet keine Points (die Vorschauen wurden bereits berechnet), belegt aber einen Design-Platz deines Tarifs. Die zurückgegebene id funktioniert sofort als voice in POST /api/v1/tts.
| Feld | Pflicht | Hinweise |
|---|---|---|
preview_id | ja | Eine preview_id aus dem Vorschau-Aufruf, innerhalb von 30 Minuten. |
name | ja | Anzeigename, bis zu 80 Zeichen. |
description | nein | Freitext-Notiz, bis zu 500 Zeichen. |
tags | nein | Bis zu 10 Labels. |
sample_base64 | nein | Hörprobe, die mit der Stimme gespeichert wird. Innerhalb des 30-Minuten-Fensters nicht nötig — die gewählte Vorschau wird automatisch abgelegt. |
{ "id": "default-abc123__narrator", "name": "Documentary Narrator", "type": "designed",
"languages": ["EN_US"], "created_at": "...",
"preview_url": "https://api.vocallab.ai/api/v1/audio/...", "used": 3, "limit": 20 }
GET /api/v1/voices/designs
Deine gestalteten Stimmen, neueste zuerst, mit Platznutzung: { "voices": [...], "used": 3, "limit": 20 }.
DELETE /api/v1/voices/designs/:voiceId
Löscht die Stimme beim Anbieter und aus deiner Bibliothek. In bezahlten Tarifen wird ein Platz frei. Antwortet mit { "ok": true, "id": "...", "deleted": true }.
Voice Cloning
Bilde eine bestimmte Stimme aus einer kurzen Aufnahme nach. Cloning kostet keine Points — begrenzt ist nur die Zahl der Clone-Plätze deines Tarifs. Klone ausschließlich Stimmen, die dir gehören oder für die du eine schriftliche Erlaubnis hast.
POST /api/v1/voices/clones
| Feld | Pflicht | Hinweise |
|---|---|---|
name | ja | Anzeigename, bis zu 80 Zeichen. |
language | ja | Ein Name oder Code aus GET /api/v1/voices/languages. auto erkennt sie automatisch. |
samples | ja | [{ "audio_base64": "...", "transcript": "..." }] — eine Aufnahme von rund 30 Sekunden. transcript ist optional, verbessert den Klon aber deutlich. |
remove_background_noise | nein | Aufnahme vorher säubern. Standard true. |
Fast jede Audiodatei funktioniert. audio_base64 ist das rohe base64 deiner Aufnahme, ohne data:-Präfix — MP3, WAV, M4A, AAC, OGG, FLAC, WebM, die Tonspur eines MP4 und mehr. Alles, was der Sprachanbieter nicht direkt annimmt, wird serverseitig in mono 16-Bit-WAV konvertiert, genau wie es die Web-Apps vor dem Upload im Browser tun — die API ist also nicht wählerischer als das Studio.
- kürzt auf die ersten 30 Sekunden — eine längere Datei darf gesendet werden, genutzt wird nur der Anfang;
- mischt Stereo auf Mono und rechnet auf 32 kHz um;
- verkleinert übergroße Dateien, ein großes 24-Bit-Studio-WAV muss also nicht mehr von Hand vorbereitet werden.
Die Grenze gilt für den base64-String, nicht für die dekodierten Bytes: bis zu 8.000.000 Zeichen, rund 6 MB Datei. Darüber kommt 413 sample_too_large; eine Datei ohne lesbares Audio ergibt 400 unreadable_audio.
Wurde etwas verändert, enthält die Antwort ein audio_notes-Array, das das benennt — lohnt sich zu loggen, damit ein Klon aus den ersten 30 Sekunden einer langen Aufnahme nie eine stille Überraschung ist:
{ "id": "...", "name": "My Narrator", "type": "clone", "used": 2, "limit": 100,
"audio_notes": ["Re-encoded to mono 16-bit WAV at 32 kHz — aac isn't a format the provider accepts.",
"Trimmed to the first 30s (the sample was 90s)."] }
curl -X POST https://api.vocallab.ai/api/v1/voices/clones \
-H "Authorization: Bearer vl_live_..." \
-H "Content-Type: application/json" \
-d "{\"name\":\"My Narrator\",\"language\":\"English\",\"samples\":[{\"audio_base64\":\"$(base64 -w0 sample.mp3)\"}]}"
{ "id": "default-abc123__my-narrator", "name": "My Narrator", "type": "clone",
"languages": ["EN_US"], "created_at": "...", "used": 2, "limit": 100 }
GET /api/v1/voices/clones
Deine geklonten Stimmen, neueste zuerst, mit Platznutzung: { "voices": [...], "used": 2, "limit": 100 }.
DELETE /api/v1/voices/clones/:voiceId
Löscht die Stimme beim Anbieter und aus deiner Bibliothek. In bezahlten Tarifen wird ein Platz frei. Antwortet mit { "ok": true, "id": "...", "deleted": true }.
Plätze sind getrennt. Geklonte und gestaltete Stimmen teilen sich nie ein Budget — die Zahlen je Tarif stehen unter Tarife & Limits. Im Free-Tarif gilt das Limit lebenslang: Löschen gibt den Platz nicht frei. In einem Workspace arbeiten Mitglieder innerhalb der Limits des Inhabers, und Design-Points gehen vom Guthaben des Inhabers ab.
Was Points kostet
| Points | |
|---|---|
| Eine Stimme klonen | keine — nur durch Clone-Plätze begrenzt |
| Stimmen auflisten oder löschen | keine |
| Eine Stimme gestalten (Vorschauen) | Anzahl × ⌈preview_text ÷ 15⌉ — jede Vorschau ist eine echte Synthese |
| Eine gestaltete Stimme speichern | keine — die Vorschauen wurden bereits berechnet |
GET /api/v1/me
Dein Credit-Guthaben und dein Plan.
Fehler
| Status | Bedeutung |
|---|---|
400 | Ein Pflichtfeld fehlt im Body (missing_text, missing_voice, missing_name, missing_prompt, …) |
401 | Fehlender oder ungültiger API-Schlüssel |
402 | Nicht genügend Credits |
403 | Plan ohne API-Zugriff (mindestens Pro erforderlich) |
404 | Generierung oder Stimme nicht gefunden (oder nicht deine) |
409 | Audio noch nicht bereit — abfragen, bis ready; keine Wort-Timings vorhanden (Untertitel); oder alle Clone-/Design-Plätze belegt (clone_limit, design_limit) |
413 | Text, Vorschautext oder Audio-Sample zu groß |
422 | Unbekanntes Modell, nicht unterstützte Sprache oder ein Parameter außerhalb des gültigen Bereichs |
429 | Ratenlimit erreicht — 60 Anfragen/Minute pro Schlüssel und davon getrennt 60 Cloning- oder Voice-Design-Aufrufe pro Stunde |
502 | Der Sprachanbieter ist fehlgeschlagen oder hat die Anfrage abgelehnt — die Meldung nennt den Grund, retryable sagt, ob sich ein neuer Versuch lohnt |
Fehler haben die Form { "error": { "code": "...", "message": "..." } }.


