Riferimento API
URL di base https://api.vocallab.ai. Ogni richiesta richiede Authorization: Bearer vl_live_... (vedi Chiavi API).
GET /api/v1/ping
Test di connessione + autenticazione. Restituisce il saldo dei tuoi punti.
{ "ok": true, "points": 12345, "unit": "points (1 pt ≈ 1 second of audio)" }
GET /api/v1/voices
Le voci che puoi usare — prima le tue voci clonate e progettate, poi il catalogo pubblico. Usa l'id restituito come voice in generazione. Le voci del catalogo accettano anche il loro slug.
| Parametro | Predefinito | Note |
|---|---|---|
limit | (nessuno) | Quante restituirne, 1–500. Se omesso torna l'elenco completo — circa 260 voci |
offset | 0 | Quante saltarne, per la paginazione |
q | — | Filtro senza distinzione di maiuscole su id, slug e name della voce, ad es. ?q=ashley |
type | — | preset, clone, designed |
Ogni risposta porta total, count, offset e has_more, così puoi paginare senza tirare a indovinare. Gli stessi quattro parametri (tranne type) funzionano su GET /api/v1/voices/clones e 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
I modelli vocali selezionabili. Passa una key come model in POST /api/v1/tts (predefinito v-pro). Le chiavi API possono usarli tutti. Vedi Modelli vocali per le differenze.
{ "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
Genera audio vocale.
| Campo | Obbligatorio | Note |
|---|---|---|
text | sì | Fino a 2.000 caratteri. Ogni chiamata viene sintetizzata come una singola richiesta — per testi più lunghi, suddividi il testo in più chiamate |
voice | sì | Un id di voce da /api/v1/voices |
model | no | v-studio (il più recente, orientabile, oltre 200 lingue), v-flash (oltre 200 lingue, ~5× più veloce, ¾ dei punti), v-pro (predefinito — massima fedeltà, 15 lingue) o v-lite (veloce, ½ punti). Vedi GET /api/v1/models |
speed | no | Numero 0.5–1.5 (passo 0.05). Predefinito: valore della voce |
temperature | no | Numero 0.7–1.5 (passo 0.05). Più alto = più espressivo e variabile. Ignorato da v-studio e v-flash — su v-studio usa delivery_mode. Predefinito: valore della voce |
delivery_mode | no | STABLE, BALANCED o CREATIVE — quanto il modello varia l'interpretazione. Solo v-studio; inviarlo con un altro modello restituisce 422 |
enhance_generation | no | true riduce il rumore dell'audio generato. Funziona su ogni modello. Predefinito false — può rendere la voce troppo levigata |
format | no | Uno tra MP3 (predefinito), WAV, FLAC, OGG_OPUS, LINEAR16, PCM, ALAW, MULAW |
bit_rate | no | Intero 32000–320000. Solo MP3 e OGG_OPUS; ignorato per altri formati |
sample_rate | no | Uno tra 8000, 16000, 22050, 24000, 32000, 44100, 48000 (Hz) |
captions | no | true (o "phrase" / "word") restituisce anche i sottotitoli SRT in captions, senza una seconda chiamata. Vedi 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"}'
Restituisce l'audio inline (base64) più un id. L'URL ospitato compare una volta completato il caricamento — interrogalo con GET /api/v1/tts/:id.
{ "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 }
Modello e costo.
v-flashviene fatturato a ¾ (points = ⌈ caratteri ÷ 20 ⌉) ev-litea metà (÷ 30) dei punti div-pro/v-studio(÷ 15).v-studioè l'unico modello che segue le istruzioni di espressione/orientamento — vedi Modelli vocali e Orientamento vocale.
Pause
Inserisci un silenzio di durata esatta con un tag <break /> auto-chiudente direttamente in text:
{ "text": "Fammi pensare <break time=\"1.5s\" /> Sì, ci ho pensato.", "voice": "Ashley" }
- Secondi o millisecondi —
1.5s=1500ms. - Fino a 20 tag break per richiesta, in tutte le lingue supportate.
- I tag break contano nel limite di 2.000 caratteri e vengono rimossi da sottotitoli/SRT.
GET /api/v1/tts/:id
Stato della generazione e URL dell'audio ospitato una volta pronto.
{ "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
Trasmetti in streaming direttamente i byte audio del clip finito — un'alternativa al blob base64 audio_base64. Servito inline (si riproduce in un browser o lettore multimediale) e supporta l'header HTTP Range per consentire lo scorrimento. Restituisce 409 mentre il clip è ancora in fase di finalizzazione: interroga GET /api/v1/tts/:id finché status non è ready, poi trasmetti.
curl -L https://api.vocallab.ai/api/v1/tts/GENERATION_ID/audio \
-H "Authorization: Bearer vl_live_..." \
-o speech.mp3
Lo stesso link viene restituito come stream_url in POST /api/v1/tts e GET /api/v1/tts/:id.
GET /api/v1/tts/:id/captions
I sottotitoli di una generazione, come file .srt. I cue seguono il parlato reale (timing per parola restituiti con la sintesi) e ogni markup [emotion] o pausa <break /> viene rimosso, così nel file finiscono solo le parole pronunciate.
I sottotitoli vengono costruiti dai timing salvati, non dal file audio: sono disponibili subito, anche mentre status è ancora pending.
| Query | Predefinito | Note |
|---|---|---|
format | srt | srt restituisce il file di sottotitoli; json restituisce { srt, words, duration } per un rendering personalizzato |
mode | phrase | phrase = righe di sottotitolo leggibili (divise su pause, fine frase e fine proposizione). word = un cue per parola, per l'evidenziazione in stile karaoke |
max_words | 4 | Parole per riga in modalità phrase, 2–7 |
uppercase | false | true scrive il testo in MAIUSCOLO |
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.
Con 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 } ] }
Lo stesso link viene restituito come captions_url in POST /api/v1/tts e GET /api/v1/tts/:id. Per ricevere l'SRT insieme all'audio in una sola chiamata, invia "captions": true su POST /api/v1/tts.
Restituisce 409 captions_unavailable quando una generazione non ha timing delle parole salvati (qualche clip più vecchio) — l'audio non è interessato.
DELETE /api/v1/tts/:id
Elimina definitivamente una generazione di tua proprietà — sia il file audio memorizzato sia il suo record nel database. Utile per fare pulizia dopo un download o per soddisfare una richiesta di cancellazione dei dati. Un id che non esiste, o che non è tuo, restituisce 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
Novità:
GET /api/v1/voices/languagesrestituisce ora oltre 470 lingue con le relative varianti di accento (per esempioen-GB,pt-PT).codeè un tag BCP-47; i vecchi valori (EN_US,PT_BR, …) eOthercontinuano a essere accettati.
Le lingue e i limiti di registrazione validi per clonazione e voice design. Interroga questo endpoint invece di scrivere la lista nel codice: è la stessa fonte di verità usata dal modulo di caricamento dello Studio.
{ "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
Inventa una voce del tutto nuova partendo da una descrizione scritta, senza registrare nulla. Sono due chiamate: generare le anteprime candidate e salvare quella che preferisci.
POST /api/v1/voices/designs/previews
Genera fino a tre voci candidate. Addebitato in points — ogni anteprima è una sintesi reale di preview_text alla tariffa API (⌈caratteri ÷ 15⌉ per anteprima).
Non viene ancora salvato nulla, quindi la chiamata non occupa un posto di design — ma ne richiede uno libero. Se i tuoi design sono già al limite del piano la chiamata risponde 409 design_limit e non viene speso alcun point: pagare per una voce che non potresti conservare non avrebbe senso.
| Campo | Obbligatorio | Note |
|---|---|---|
prompt | sì | Descrivi la voce in inglese, da 30 a 1000 caratteri: genere, età, accento, timbro, ritmo e interpretazione. |
language | no | Lingua che la voce deve parlare (English, ES_ES, …). Predefinito auto: dedotta dalla descrizione. |
preview_text | no | Cosa dicono le anteprime, fino a 1.000 caratteri. Predefinito: una breve frase di esempio. |
count | no | Quante candidate generare, 1–3 (predefinito 3). Ognuna viene addebitata. |
include_audio | no | true restituisce ogni anteprima anche in base64. Ogni anteprima ha già una preview_url, quindi i byte sono facoltativi. |
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 }
Un preview_id non è ancora una voce utilizzabile ed è valido per circa 30 minuti.
Le anteprime che non conservi vengono eliminate. Salva quella che vuoi prima di generarne altre: richiamare questo endpoint elimina le anteprime precedenti e i loro preview_url smettono di funzionare, e salvarne una elimina il resto del lotto. In entrambi i casi non resta nulla.
POST /api/v1/voices/designs
Conserva un'anteprima come voce permanente. Non costa points (le anteprime sono già state addebitate) ma occupa uno dei posti di design del tuo piano. L'id restituito funziona subito come voice in POST /api/v1/tts.
| Campo | Obbligatorio | Note |
|---|---|---|
preview_id | sì | Un preview_id dalla chiamata delle anteprime, entro 30 minuti. |
name | sì | Nome visualizzato, fino a 80 caratteri. |
description | no | Nota libera, fino a 500 caratteri. |
tags | no | Fino a 10 etichette. |
sample_base64 | no | Clip di ascolto salvata con la voce. Non serve entro la finestra di 30 minuti: l'anteprima scelta viene conservata automaticamente. |
{ "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
Le tue voci progettate, dalla più recente, con l'uso dei posti: { "voices": [...], "used": 3, "limit": 20 }.
DELETE /api/v1/voices/designs/:voiceId
Elimina la voce dal provider e dalla tua libreria. Su un piano a pagamento libera un posto. Restituisce { "ok": true, "id": "...", "deleted": true }.
Clonazione vocale
Ricrea una voce specifica da una breve registrazione. Clonare non costa points: è limitato solo dal numero di posti di clonazione del tuo piano. Clona esclusivamente voci di tua proprietà o per cui hai un permesso scritto.
POST /api/v1/voices/clones
| Campo | Obbligatorio | Note |
|---|---|---|
name | sì | Nome visualizzato, fino a 80 caratteri. |
language | sì | Un nome o codice da GET /api/v1/voices/languages. Usa auto per farla rilevare. |
samples | sì | [{ "audio_base64": "...", "transcript": "..." }] — una registrazione di circa 30 secondi. transcript è facoltativo ma migliora sensibilmente il clone. |
remove_background_noise | no | Pulisce prima la registrazione. Predefinito true. |
Va bene quasi qualsiasi file audio. audio_base64 è il base64 puro della tua registrazione, senza prefisso data: — MP3, WAV, M4A, AAC, OGG, FLAC, WebM, la traccia audio di un MP4 e altro. Tutto ciò che il provider vocale non accetterebbe direttamente viene convertito lato server in WAV mono a 16 bit, esattamente come fanno le app web nel browser prima di caricare: l'API non è più esigente dello Studio.
- taglia ai primi 30 secondi — puoi inviare un file più lungo, ma viene usato solo l'inizio;
- converte lo stereo in mono e ricampiona a 32 kHz;
- riduce i file troppo grandi, così un WAV da studio a 24 bit non va più preparato a mano.
Il limite riguarda la stringa base64, non i byte decodificati: fino a 8.000.000 di caratteri, circa un file da 6 MB. Oltre, la chiamata risponde 413 sample_too_large; un file senza audio leggibile risponde 400 unreadable_audio.
Quando qualcosa è stato modificato, la risposta include un array audio_notes che lo dichiara — vale la pena registrarlo, così un clone costruito sui primi 30 secondi di una lunga registrazione non è mai una sorpresa silenziosa:
{ "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
Le tue voci clonate, dalla più recente, con l'uso dei posti: { "voices": [...], "used": 2, "limit": 100 }.
DELETE /api/v1/voices/clones/:voiceId
Elimina la voce dal provider e dalla tua libreria. Su un piano a pagamento libera un posto. Restituisce { "ok": true, "id": "...", "deleted": true }.
I posti sono separati. Voci clonate e progettate non condividono mai un budget — vedi Piani e limiti per i numeri di ciascun piano. Nel piano Free il tetto è a vita: eliminare una voce non libera il posto. In uno spazio di lavoro i membri operano entro i limiti del piano del proprietario, e i points del design escono dal saldo del proprietario.
Cosa costa points
| Points | |
|---|---|
| Clonare una voce | nessuno — limitato solo dai posti di clonazione |
| Elencare o eliminare una voce | nessuno |
| Progettare una voce (anteprime) | quantità × ⌈preview_text ÷ 15⌉ — ogni anteprima è una sintesi reale |
| Salvare una voce progettata | nessuno — le anteprime sono già state addebitate |
GET /api/v1/me
Il saldo dei tuoi punti e il tuo piano.
Errori
| Stato | Significato |
|---|---|
400 | Manca un campo obbligatorio nel corpo (missing_text, missing_voice, missing_name, missing_prompt, …) |
401 | Chiave API mancante o non valida |
402 | Punti insufficienti |
403 | Il piano non include l'accesso all'API (richiede Pro o superiore) |
404 | Generazione o voce non trovata (o non è tua) |
409 | Audio non ancora pronto — interroga finché è ready; nessun timing delle parole salvato (sottotitoli); oppure tutti i posti di clonazione/design sono occupati (clone_limit, design_limit) |
413 | Testo, testo di anteprima o campione audio troppo grande |
422 | Modello sconosciuto, lingua non supportata o parametro fuori intervallo |
429 | Limite di frequenza raggiunto — 60 richieste/minuto per chiave e, separatamente, 60 chiamate di clonazione o voice design all'ora |
502 | Il provider vocale ha rifiutato la richiesta o non è riuscito a completarla — il messaggio spiega il motivo e retryable dice se conviene riprovare |
Gli errori hanno la forma { "error": { "code": "...", "message": "..." } }.


