Voizum

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

  1. 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.
  2. Escolha uma voz: clone a sua ou adicione a “Minhas vozes” uma da biblioteca. GET /voices devolve o id dela.
  3. 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 rotaO que faz
GET /statusEstado do serviço. Sem chave.
GET /accountSeu saldo de créditos e o preço por caractere.
GET /voicesAs vozes da sua biblioteca: o id delas é o voice_id.
POST /ttsCria um áudio a partir de um texto.
GET /tts/{job_id}Status do áudio: queued, processing, done, error ou canceled.
GET /tts/{job_id}/audioO 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 /ttsSeus últimos áudios, paginados.
POST /tts/batchVários áudios separados em uma requisição, com um único mínimo (de 2 a 100).
POST /tts/dialogueUm áudio com várias vozes em turnos (até 5 vozes).

O que o POST /tts aceita

CampoO que é
textObrigatório. O texto, até 600.000 caracteres.
voice_idObrigatório. Uma voz da sua biblioteca (GET /voices).
speedOpcional. Velocidade, de 0.5 a 2 (1 = o ritmo natural da voz).
pause_msOpcional. Pausa entre frases, de 0 a 800 ms.
languageOpcional. auto, es, en, de, fr, pt, it, ru. Sem ele, o idioma é deduzido do texto.
loudness_normalizationOpcional. Iguala o volume para que todas as vozes soem com a mesma intensidade.
webhook_urlOpcional. Uma URL https pública para a qual enviamos um POST quando o áudio termina.
Idempotency-KeyCabeç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ódigoHTTPO que aconteceu
no_autorizado401Missing or invalid API key.
parametros_invalidos400Missing fields or invalid values.
cuerpo_invalido400The body is not valid JSON.
texto_demasiado_largo400The text exceeds the character limit.
lote_invalido400A batch takes 2 to 100 items.
dialogo_invalido400A dialogue takes 2 to 100 turns and up to 5 voices.
webhook_invalido400webhook_url is not https or not a public host.
voz_sin_muestra400That voice can't be used yet.
saldo_insuficiente402Not enough credits (the response says how many are needed).
requiere_compra403Batches need an account that has bought credits.
voz_no_encontrada404The voice is not in your library.
no_encontrado404No job with that id (or it isn't yours).
limite_peticiones429Too many requests: wait for Retry-After.
demasiados_en_cola429Too many jobs in progress: wait for some to finish.
mantenimiento503Maintenance pause: retry later.
servicio_no_disponible503Service 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.