API de texto para voz: suas vozes, direto do seu código
Uma API REST simples: você envia um texto e uma das suas vozes e recebe o MP3. Usa os mesmos créditos do site, sem taxa de desenvolvedor nem custo por chamada.
- URL base
- https://voizum.com/api/v1
- Autenticação
- Bearer sk_voizum_…
- Saída
- MP3
- Idiomas
- es · en · de · fr · pt · it · ru
- Preço
- 60 créditos / 1.000 caracteres (mín. 100)
Para assistentes de IA e ferramentas
Três caminhos, conforme quem se conecta. Todos levam ao mesmo lugar: suas vozes e seus créditos.
- Claude, ChatGPT, Cursor… sem programar
- O conector MCP: adicione ao assistente e peça áudios no chat.
- https://voizum.com/mcp
- ChatGPT Actions, Postman, geradores de clientes
- Importe a especificação OpenAPI 3.1: ela descreve todos os endpoints e seus campos.
- https://voizum.com/openapi.json
- Agentes que leem documentação
- llms.txt: o contrato inteiro em texto simples, feito para modelos de linguagem.
- https://voizum.com/llms.txt
Comece em três passos
- Crie sua conta e sua chave na seção API do site. A chave começa com sk_voizum_ e é mostrada uma única vez: guarde-a como segredo, nunca no código do navegador.
- Escolha uma voz: clone a sua ou adicione a “Minhas vozes” uma da biblioteca. GET /voices devolve o id dela.
- Crie o áudio com POST /tts, consulte o status a cada poucos segundos e baixe quando estiver pronto (ou receba um webhook).
Um exemplo completo
Criar, aguardar e baixar. A API é assíncrona: um áudio longo demora a ficar pronto e assim você não precisa manter a conexão aberta.
curl
# 1. Create the audio
curl -X POST https://voizum.com/api/v1/tts \
-H "Authorization: Bearer $VOIZUM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "Hi, this is Voizum.", "voice_id": "VOICE_ID"}'
# → {"job_id": "…", "status": "queued", "credits_charged": 100, "eta_seconds": 20}
# 2. Check the status (until "done")
curl https://voizum.com/api/v1/tts/JOB_ID -H "Authorization: Bearer $VOIZUM_API_KEY"
# 3. Download the MP3
curl -L -o audio.mp3 "https://voizum.com/api/v1/tts/JOB_ID/audio?download=1" -H "Authorization: Bearer $VOIZUM_API_KEY"Python
import os, time, requests
API = "https://voizum.com/api/v1"
H = {"Authorization": f"Bearer {os.environ['VOIZUM_API_KEY']}"}
job = requests.post(f"{API}/tts", headers=H, json={"text": "Hi, this is Voizum.", "voice_id": "VOICE_ID"}).json()
while True:
status = requests.get(f"{API}/tts/{job['job_id']}", headers=H).json()
if status["status"] in ("done", "error", "canceled"):
break
time.sleep(3)
if status["status"] == "done":
mp3 = requests.get(f"{API}/tts/{job['job_id']}/audio?download=1", headers=H)
open("audio.mp3", "wb").write(mp3.content)JavaScript (Node 18+)
const API = "https://voizum.com/api/v1";
const H = { Authorization: `Bearer ${process.env.VOIZUM_API_KEY}`, "Content-Type": "application/json" };
const job = await (await fetch(`${API}/tts`, {
method: "POST", headers: H,
body: JSON.stringify({ text: "Hi, this is Voizum.", voice_id: "VOICE_ID" }),
})).json();
let status;
do {
await new Promise((r) => setTimeout(r, 3000));
status = await (await fetch(`${API}/tts/${job.job_id}`, { headers: H })).json();
} while (!["done", "error", "canceled"].includes(status.status));
if (status.status === "done") {
const mp3 = await fetch(`${API}/tts/${job.job_id}/audio?download=1`, { headers: H });
await (await import("node:fs/promises")).writeFile("audio.mp3", Buffer.from(await mp3.arrayBuffer()));
}Endpoints
| Método e rota | O que faz |
|---|---|
| GET /status | Estado do serviço. Sem chave. |
| GET /account | Seu saldo de créditos e o preço por caractere. |
| GET /voices | As vozes da sua biblioteca: o id delas é o voice_id. |
| POST /tts | Cria um áudio a partir de um texto. |
| GET /tts/{job_id} | Status do áudio: queued, processing, done, error ou canceled. |
| GET /tts/{job_id}/audio | O MP3 pronto (redireciona para o arquivo; ?download=1 para baixar). |
| DELETE /tts/{job_id} | Cancela um áudio que ainda não começou: os créditos são devolvidos. |
| GET /tts | Seus últimos áudios, paginados. |
| POST /tts/batch | Vários áudios separados em uma requisição, com um único mínimo (de 2 a 100). |
| POST /tts/dialogue | Um áudio com várias vozes em turnos (até 5 vozes). |
O que o POST /tts aceita
| Campo | O que é |
|---|---|
| text | Obrigatório. O texto, até 600.000 caracteres. |
| voice_id | Obrigatório. Uma voz da sua biblioteca (GET /voices). |
| speed | Opcional. Velocidade, de 0.5 a 2 (1 = o ritmo natural da voz). |
| pause_ms | Opcional. Pausa entre frases, de 0 a 800 ms. |
| language | Opcional. auto, es, en, de, fr, pt, it, ru. Sem ele, o idioma é deduzido do texto. |
| loudness_normalization | Opcional. Iguala o volume para que todas as vozes soem com a mesma intensidade. |
| webhook_url | Opcional. Uma URL https pública para a qual enviamos um POST quando o áudio termina. |
| Idempotency-Key | Cabeçalho opcional. Se você repetir a requisição com a mesma chave, recebe o mesmo áudio e não é cobrado duas vezes. |
Webhook
Com webhook_url você não precisa consultar o status: ao terminar, enviamos um POST com o evento generation.finished (3 tentativas, 10 s de espera em cada uma). Se o seu servidor responder com 4xx, não há nova tentativa.
O aviso não é assinado: use-o como sinal para consultar GET /tts/{job_id} com a sua chave, que é a fonte da verdade, e não como prova de que o áudio está pronto.
{
"event": "generation.finished",
"id": "JOB_ID",
"status": "completed",
"voice_id": "VOICE_ID",
"duration_seconds": 12.4,
"credits": 100,
"error": null
}Limites
20 criações por minuto (POST /tts, /tts/batch e /tts/dialogue compartilham esse limite) e 300 requisições por minuto por chave no total. As respostas de criação trazem X-RateLimit-Limit e X-RateLimit-Remaining, e todo 429 traz Retry-After com os segundos de espera.
O MP3 fica guardado por 4 dias; depois disso GET /tts/{job_id}/audio retorna 404, então baixe e guarde o arquivo por conta própria.
Um áudio aceita até 600.000 caracteres. Um lote, de 2 a 100 áudios e 1.200.000 caracteres no total. Um diálogo, até 100 turnos e 5 vozes diferentes.
Erros
Sempre no mesmo formato: { "error": { "code", "message" } }, às vezes com detalhes (por exemplo, quantos créditos faltam). As mensagens estão em inglês.
| Código | HTTP | O que aconteceu |
|---|---|---|
| no_autorizado | 401 | Missing or invalid API key. |
| parametros_invalidos | 400 | Missing fields or invalid values. |
| cuerpo_invalido | 400 | The body is not valid JSON. |
| texto_demasiado_largo | 400 | The text exceeds the character limit. |
| lote_invalido | 400 | A batch takes 2 to 100 items. |
| dialogo_invalido | 400 | A dialogue takes 2 to 100 turns and up to 5 voices. |
| webhook_invalido | 400 | webhook_url is not https or not a public host. |
| voz_sin_muestra | 400 | That voice can't be used yet. |
| saldo_insuficiente | 402 | Not enough credits (the response says how many are needed). |
| requiere_compra | 403 | Batches need an account that has bought credits. |
| voz_no_encontrada | 404 | The voice is not in your library. |
| no_encontrado | 404 | No job with that id (or it isn't yours). |
| limite_peticiones | 429 | Too many requests: wait for Retry-After. |
| demasiados_en_cola | 429 | Too many jobs in progress: wait for some to finish. |
| mantenimiento | 503 | Maintenance pause: retry later. |
| servicio_no_disponible | 503 | Service temporarily unavailable: retry. |
Perguntas
- Existe SDK para Python ou JavaScript?
- Não precisa: são poucas chamadas REST com JSON, que funcionam com qualquer cliente HTTP (requests, fetch, curl). Se quiser um cliente gerado, a especificação OpenAPI cria um na sua linguagem.
- Existe streaming em tempo real?
- Não. A API é assíncrona: você cria o áudio, consulta o status e baixa o MP3 pronto. Ela serve para narrações, vídeos, cursos e conteúdo, não para conversa ao vivo.
- Posso usar as vozes da biblioteca?
- Sim: adicione-as antes a “Minhas vozes” pelo site e elas aparecerão em GET /voices. Pela API só são usadas as vozes da sua biblioteca.
- Dá para clonar uma voz pela API?
- Não: a clonagem é feita pelo site (você envia a gravação uma vez) e depois você usa a voz pela API com o voice_id dela.
- Quanto custa?
- O mesmo que no site: 60 créditos a cada 1.000 caracteres, com mínimo de 100 por requisição. Sem mensalidade e sem custo por chamada. Se um áudio falhar, os créditos são devolvidos.
- Em que formato sai o áudio?
- MP3.
Escreva o seu texto e ouça com uma voz real
A API gasta créditos de um pacote (60 a cada 1.000 caracteres) e exige entrar com o Google. Pacotes a partir de US$ 6,99, sem assinatura.