Referência da API
URL base https://api.vocallab.ai. Toda requisição precisa de Authorization: Bearer vl_live_... (veja Chaves de API).
GET /api/v1/ping
Teste de conexão + autenticação. Retorna seu saldo de pontos.
{ "ok": true, "points": 12345, "unit": "points (1 pt ≈ 1 second of audio)" }
GET /api/v1/voices
As vozes que pode usar — primeiro as suas vozes clonadas e criadas, depois o catálogo público. Use o id devolvido como voice ao gerar. As vozes do catálogo também aceitam o seu slug.
| Parâmetro | Por omissão | Notas |
|---|---|---|
limit | (nenhum) | Quantas devolver, 1–500. Se omitido devolve a lista completa — cerca de 260 vozes |
offset | 0 | Quantas ignorar, para paginar |
q | — | Filtro sem distinção de maiúsculas sobre o id, slug e name da voz, p. ex. ?q=ashley |
type | — | preset, clone, designed |
Cada resposta traz total, count, offset e has_more, por isso pode paginar sem adivinhar. Os mesmos quatro parâmetros (menos type) funcionam em 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
Os modelos de fala selecionáveis. Passe uma key como model em POST /api/v1/tts (padrão v-pro). As chaves de API podem usar todos eles. Veja Modelos de Voz para as diferenças.
{ "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
Gera fala.
| Campo | Obrigatório | Observações |
|---|---|---|
text | sim | Até 2.000 caracteres. Cada chamada é sintetizada como uma única requisição — para textos maiores, divida o texto em várias chamadas |
voice | sim | Um id de voz de /api/v1/voices |
model | não | v-studio (mais recente, direcionável, mais de 200 idiomas), v-flash (mais de 200 idiomas, ~5× mais rápido, ¾ dos pontos), v-pro (padrão — maior fidelidade, 15 idiomas) ou v-lite (rápido, ½ dos pontos). Veja GET /api/v1/models |
speed | não | Número 0.5–1.5 (passo 0.05). Padrão: valor da voz |
temperature | não | Número 0.7–1.5 (passo 0.05). Maior = mais expressivo e variável. Ignorado por v-studio e v-flash — no v-studio use delivery_mode. Padrão: valor da voz |
delivery_mode | não | STABLE, BALANCED ou CREATIVE — o quanto o modelo varia a interpretação. Apenas v-studio; enviá-lo com outro modelo retorna 422 |
enhance_generation | não | true reduz o ruído do áudio gerado. Funciona em todos os modelos. Padrão false — pode deixar a voz suavizada demais |
format | não | Um de MP3 (padrão), WAV, FLAC, OGG_OPUS, LINEAR16, PCM, ALAW, MULAW |
bit_rate | não | Inteiro 32000–320000. Apenas MP3 e OGG_OPUS; ignorado em outros formatos |
sample_rate | não | Um de 8000, 16000, 22050, 24000, 32000, 44100, 48000 (Hz) |
captions | não | true (ou "phrase" / "word") também devolve as legendas SRT em captions, dispensando uma segunda chamada. Veja 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"}'
Retorna o áudio inline (base64) mais um id. A URL hospedada aparece assim que o upload termina — consulte GET /api/v1/tts/:id para obtê-la.
{ "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 }
Modelo e custo. O
v-flashé cobrado por ¾ (points = ⌈ caracteres ÷ 20 ⌉) e ov-litepela metade (÷ 30) dos pontos dov-pro/v-studio(÷ 15). Ov-studioé o único modelo que segue instruções de expressão/direcionamento — veja Modelos de Voz e Direcionamento de Voz.
Pausas
Insira um silêncio de duração exata com uma tag <break /> autofechável diretamente em text:
{ "text": "Deixe-me pensar <break time=\"1.5s\" /> Sim, já pensei nisso.", "voice": "Ashley" }
- Segundos ou milissegundos —
1.5s=1500ms. - Até 20 tags break por requisição, em todos os idiomas suportados.
- Tags break contam para o limite de 2.000 caracteres e são removidas das legendas/SRT.
GET /api/v1/tts/:id
Status da geração e a URL do áudio hospedado quando estiver 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
Transmita diretamente os bytes de áudio do clipe finalizado — uma alternativa ao blob base64 audio_base64. Servido inline (reproduz em um navegador ou player de mídia) e compatível com o cabeçalho HTTP Range para permitir avançar. Retorna 409 enquanto o clipe ainda está sendo finalizado: consulte GET /api/v1/tts/:id até que status seja ready e então transmita.
curl -L https://api.vocallab.ai/api/v1/tts/GENERATION_ID/audio \
-H "Authorization: Bearer vl_live_..." \
-o speech.mp3
O mesmo link é retornado como stream_url em POST /api/v1/tts e GET /api/v1/tts/:id.
GET /api/v1/tts/:id/captions
As legendas de uma geração, como arquivo .srt. Os cues seguem a fala real (marcações de tempo por palavra devolvidas com a síntese), e qualquer marcação [emotion] ou pausa <break /> é removida, de modo que apenas as palavras faladas chegam ao arquivo.
As legendas são construídas a partir das marcações de tempo salvas, não do arquivo de áudio — ficam disponíveis imediatamente, mesmo enquanto status ainda é pending.
| Consulta | Padrão | Observações |
|---|---|---|
format | srt | srt devolve o arquivo de legendas; json devolve { srt, words, duration } para renderização própria |
mode | phrase | phrase = linhas de legenda legíveis (divididas em pausas e finais de frase ou oração). word = um cue por palavra, para destaque estilo karaokê |
max_words | 4 | Palavras por linha no modo phrase, 2–7 |
uppercase | false | true deixa o texto em MAIÚSCULAS |
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.
Com 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 } ] }
O mesmo link é retornado como captions_url em POST /api/v1/tts e GET /api/v1/tts/:id. Para receber o SRT junto com o áudio em uma única chamada, envie "captions": true em POST /api/v1/tts.
Retorna 409 captions_unavailable quando uma geração não tem marcações de tempo por palavra salvas (alguns clipes mais antigos) — o áudio não é afetado.
DELETE /api/v1/tts/:id
Exclua permanentemente uma geração que você possui — tanto o arquivo de áudio armazenado quanto seu registro no banco de dados. Útil para limpar após um download ou atender a uma solicitação de exclusão de dados. Um id que não existe, ou que não é seu, retorna 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
Novidade:
GET /api/v1/voices/languagesdevolve agora mais de 470 idiomas com as respetivas variantes de sotaque (por exemploen-GB,pt-PT).codeé uma etiqueta BCP-47; os valores antigos (EN_US,PT_BR, …) eOthercontinuam a ser aceites.
Os idiomas e os limites de gravação aplicados à clonagem e ao design de voz. Consulte aqui em vez de fixar a lista no código: é a mesma fonte de verdade que o formulário de envio do Studio usa.
{ "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"] } }
Design de voz
Invente uma voz totalmente nova a partir de uma descrição escrita, sem gravar nada. São duas chamadas: gerar pré-visualizações candidatas e guardar a preferida.
POST /api/v1/voices/designs/previews
Gera até três vozes candidatas. Cobrado em points — cada pré-visualização é uma síntese real de preview_text à tarifa da API (⌈caracteres ÷ 15⌉ por pré-visualização).
Ainda não se guarda nada, por isso isto não ocupa um lugar de design — mas exige um livre. Se os seus designs já estiverem no limite do plano, a chamada devolve 409 design_limit e não se gasta nenhum point, porque não faz sentido pagar por uma voz que não poderia guardar.
| Campo | Obrigatório | Notas |
|---|---|---|
prompt | sim | Descreva a voz em inglês, entre 30 e 1000 caracteres: género, idade, sotaque, tom, ritmo e interpretação. |
language | não | Idioma que a voz vai falar (English, ES_ES, …). Por omissão auto: deduzido da descrição. |
preview_text | não | O que as pré-visualizações dizem, até 1000 caracteres. Por omissão, uma frase curta de exemplo. |
count | não | Quantas candidatas gerar, 1–3 (por omissão 3). Cada uma é cobrada. |
include_audio | não | true devolve também cada pré-visualização em base64. Todas já incluem um preview_url, por isso os bytes são opcionais. |
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 }
Um preview_id ainda não é uma voz utilizável e é válido durante cerca de 30 minutos.
As pré-visualizações que não guardar são descartadas. Guarde a que quer antes de gerar outro lote — chamar este endpoint outra vez descarta as pré-visualizações anteriores e os seus preview_url deixam de funcionar, e guardar uma descarta o resto do lote. Em qualquer dos casos não fica nada para trás.
POST /api/v1/voices/designs
Guarda uma pré-visualização como voz permanente. Não custa points (as pré-visualizações já foram cobradas), mas ocupa um dos lugares de design do seu plano. O id devolvido funciona logo como voice em POST /api/v1/tts.
| Campo | Obrigatório | Notas |
|---|---|---|
preview_id | sim | Um preview_id da chamada de pré-visualizações, dentro de 30 minutos. |
name | sim | Nome visível, até 80 caracteres. |
description | não | Nota livre, até 500 caracteres. |
tags | não | Até 10 etiquetas. |
sample_base64 | não | Excerto de amostra guardado com a voz. Desnecessário dentro da janela de 30 minutos — a pré-visualização escolhida é guardada 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
As suas vozes criadas, da mais recente para a mais antiga, com o uso de lugares: { "voices": [...], "used": 3, "limit": 20 }.
DELETE /api/v1/voices/designs/:voiceId
Apaga a voz do fornecedor e da sua biblioteca. Num plano pago liberta um lugar. Devolve { "ok": true, "id": "...", "deleted": true }.
Clonagem de voz
Recrie uma voz específica a partir de uma gravação curta. Clonar não custa points — está limitado apenas pelo número de lugares de clonagem do seu plano. Clone apenas vozes que lhe pertençam ou para as quais tenha autorização por escrito.
POST /api/v1/voices/clones
| Campo | Obrigatório | Notas |
|---|---|---|
name | sim | Nome visível, até 80 caracteres. |
language | sim | Um nome ou código de GET /api/v1/voices/languages. Use auto para detetar. |
samples | sim | [{ "audio_base64": "...", "transcript": "..." }] — uma gravação de cerca de 30 segundos. transcript é opcional, mas melhora bastante o clone. |
remove_background_noise | não | Limpa a gravação primeiro. Por omissão true. |
Quase qualquer ficheiro de áudio serve. audio_base64 é o base64 puro da sua gravação, sem prefixo data: — MP3, WAV, M4A, AAC, OGG, FLAC, WebM, a faixa de áudio de um MP4 e mais. Tudo o que o fornecedor de voz não aceitaria diretamente é convertido no servidor para WAV mono de 16 bits, tal como as apps web fazem no navegador antes de enviar — por isso a API não é mais exigente do que o Studio.
- corta aos primeiros 30 segundos — pode enviar um ficheiro mais longo, mas só o início é usado;
- mistura estéreo para mono e reamostra para 32 kHz;
- reduz ficheiros demasiado grandes, por isso um WAV de estúdio de 24 bits já não tem de ser preparado à mão.
O limite aplica-se à string base64, não aos bytes descodificados: até 8 000 000 de caracteres, cerca de um ficheiro de 6 MB. Acima disso devolve 413 sample_too_large; um ficheiro sem áudio legível devolve 400 unreadable_audio.
Quando algo foi alterado, a resposta inclui um array audio_notes a dizê-lo — vale a pena registar, para que um clone feito dos primeiros 30 segundos de uma gravação longa nunca seja uma surpresa silenciosa:
{ "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
As suas vozes clonadas, da mais recente para a mais antiga, com o uso de lugares: { "voices": [...], "used": 2, "limit": 100 }.
DELETE /api/v1/voices/clones/:voiceId
Apaga a voz do fornecedor e da sua biblioteca. Num plano pago liberta um lugar. Devolve { "ok": true, "id": "...", "deleted": true }.
Os lugares são separados. Vozes clonadas e criadas nunca partilham orçamento — veja Planos e limites para os números de cada plano. No plano Free o limite é vitalício: apagar uma voz não liberta o lugar. Num espaço de trabalho, os membros trabalham dentro dos limites do plano do proprietário, e os points de design saem do saldo do proprietário.
O que custa points
| Points | |
|---|---|
| Clonar uma voz | nenhum — limitado apenas pelos lugares de clonagem |
| Listar ou apagar uma voz | nenhum |
| Criar uma voz (pré-visualizações) | quantidade × ⌈preview_text ÷ 15⌉ — cada pré-visualização é uma síntese real |
| Guardar uma voz criada | nenhum — as pré-visualizações já foram cobradas |
GET /api/v1/me
Seu saldo de pontos e plano.
Erros
| Status | Significado |
|---|---|
400 | Falta um campo obrigatório no corpo (missing_text, missing_voice, missing_name, missing_prompt, …) |
401 | Chave de API ausente ou inválida |
402 | Pontos insuficientes |
403 | O plano não inclui acesso à API (requer Pro ou superior) |
404 | Geração ou voz não encontrada (ou não é sua) |
409 | O áudio ainda não está pronto: consulte até ready; sem tempos de palavra guardados (legendas); ou todos os lugares de clonagem/design ocupados (clone_limit, design_limit) |
413 | Texto, texto de pré-visualização ou amostra de áudio demasiado grande |
422 | Modelo desconhecido, idioma não suportado ou parâmetro fora do intervalo |
429 | Limite de pedidos atingido — 60 pedidos/minuto por chave e, separadamente, 60 chamadas de clonagem ou design de voz por hora |
502 | O fornecedor de voz falhou ou rejeitou o pedido — a mensagem explica porquê e retryable diz se vale a pena tentar de novo |
Os erros têm o formato { "error": { "code": "...", "message": "..." } }.
Preços
As gerações são cobradas do seu saldo de pontos, calculado a partir do comprimento do texto (não da duração final do áudio):
points = ⌈ characters ÷ 15 ⌉ (taxa da API — cerca de 15 caracteres por ponto)
⌈ ⌉ arredonda para cima até o próximo ponto inteiro. O aplicativo web usa 17 caracteres por ponto, então a API tem um pequeno prêmio (~13%). Os pontos são medidos antes da chamada upstream — uma requisição que ultrapassaria seu saldo retorna 402 e nunca é gerada. Cada resposta inclui o points_used exato. Como a fala tem, em média, ~15–17 caracteres/segundo, 1 ponto ≈ 1 segundo de áudio, mas a cobrança exata sempre segue a fórmula acima. Veja Créditos e Minutos para mais detalhes.


