API de voz
Gere fala a partir do seu próprio código com as vozes do Voice Studio: uma voz ou um roteiro inteiro, 0,4 crédito por caractere falado em qualquer idioma, com uma estimativa gratuita antes.
Gere fala a partir do seu próprio código com o NueSpeak Apex, as mesmas vozes do Voice Studio. As requisições gastam créditos do seu saldo do NueForm: 0,4 crédito por caractere falado (cerca de US$ 0,04 a cada 1.000 caracteres) em qualquer idioma, arredondado para cima até um crédito inteiro uma vez por requisição. As estimativas são gratuitas.
Todos os corpos de requisição e resposta usam nomes de campo em snake_case. As vozes são identificadas por IDs nv_… e as gerações por IDs gen_….
As chaves Voice funcionam em todos os planos assim que sua conta fizer uma primeira compra de créditos (ou tiver um plano pago) e verificar o e-mail. Veja Chaves da API de voz.
Gerar fala
/api/v1/voiceGera o áudio e responde quando ele fica pronto (de forma síncrona, no máximo 5.000 caracteres falados por requisição). Envie Accept: audio/mpeg (ou audio/wav, audio/ogg, audio/basic, audio/*) para receber o próprio áudio; caso contrário, a resposta é JSON com uma audio.url autenticada.
Os créditos são cobrados quando a requisição começa. As falas que falham são devolvidas automaticamente, e nada que termine em erro é cobrado. Uma requisição que já foi cobrada nunca termina em erro: se o áudio dela não ficar pronto a tempo, ela responde 202 com um cabeçalho Location. Baixe o áudio por ali em vez de enviar a requisição de novo.
Corpo da requisição
modestring"speak" (uma voz lê text), "script" (várias vozes) ou "estimate" (veja Estimar o custo)
textstringspeak: as palavras a serem lidas
voicestringUma voz nv_… de Listar vozes. Obrigatória em speak; em um script, a voz das falas sem tag de personagem
linesarrayscript: falas estruturadas, cada uma {"speaker", "voice", "text"} ou uma pausa {"pause_ms": 800} (até 10.000)
scriptstringscript: o formato multivoz, uma linha por personagem: [Maya] Did you hear that?
castarrayscript: uma voz para cada personagem com tag, [{"speaker": "Maya", "voice": "nv_…"}]
auto_convertbooleanConverter primeiro um roteiro ou uma conversa colados (MAYA: Hi) para o formato multivoz. Gratuito, dentro de um limite diário
auto_castbooleanEscolher uma voz para cada personagem que não tenha uma. Gratuito, dentro de um limite diário. Envie language para um roteiro que não esteja em inglês
languagestringUm nome ou código de idioma ("es", "Spanish"). Padrão: o idioma da própria voz
qualitystring"standard" (padrão), "studio" ou "phone". Mesmo preço
speednumberDe 0,85 a 1,15 (padrão 1)
formatstring"mp3" (padrão), "wav", "ogg_opus" ou "mulaw_8k"
max_creditsintegerRecusar a requisição (409, nada é cobrado) se ela custar mais
reusebooleanPadrão true: uma requisição idêntica feita nos últimos 30 dias recebe esse áudio por 0 crédito
savebooleantrue guarda o áudio até você excluí-lo. Padrão: excluído após 30 dias
retake_ofstringRefazer uma geração (veja Refações)
titlestringO título dela na sua Library
Campos da resposta
idstringA geração (gen_…)
statusstring"ready", "rendering" (202: ainda está sendo gerada), "partial" (algumas falas falharam e não custam nada) ou "failed"
audioobject or nullurl (envie sua chave de API), format, sample_rate, duration_seconds, retained_until
creditsobjectestimated, charged (o que esta requisição cobrou) e remaining
linesarraySomente script: speaker, voice, text, status, start_ms, end_ms e credits de cada fala
retakes_remainingintegerRefações gratuitas restantes deste clipe
reusedbooleanO áudio de uma requisição idêntica anterior, por 0 crédito
Exemplos de código
curl -X POST https://nueform.io/api/v1/voice \
-H "Authorization: Bearer $NUEFORM_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: audio/mpeg" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"mode": "speak",
"voice": "nv_7QmS2xK9aLpe3vT8a",
"text": "Fresh bread every morning at seven. Croissants too. See you on Main Street."
}' \
--output speech.mp3 --dump-header -
Este texto tem 75 caracteres falados, então custa 30 créditos (75 × 0,4).
Cabeçalhos da resposta
HTTP/1.1 200 OK
Content-Type: audio/mpeg
NueForm-Generation-Id: gen_2cH4kXyQ9vLmNp3Rs
NueForm-Credits-Estimated: 30
NueForm-Credits-Charged: 30
NueForm-Credits-Remaining: 48730
NueForm-Rate-Card: 1
NueForm-Retakes-Remaining: 2
NueForm-Audio-Duration: 4.8
Idempotent-Replayed: false
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-RateLimit-Reset: 2026-11-04T18:13:00.000Z
Resposta JSON
{
"data": {
"id": "gen_2cH4kXyQ9vLmNp3Rs",
"object": "voice.generation",
"status": "ready",
"mode": "speak",
"source": "api",
"voice": { "id": "nv_7QmS2xK9aLpe3vT8a", "name": "Amara" },
"language": "English",
"characters": 75,
"audio": {
"url": "https://nueform.io/api/v1/voice/generations/gen_2cH4kXyQ9vLmNp3Rs/audio?format=mp3",
"format": "mp3",
"sample_rate": 24000,
"duration_seconds": 4.8,
"retained_until": "2026-12-04T18:12:00.000Z"
},
"credits": { "estimated": 30, "charged": 30, "remaining": 48730 },
"retakes_remaining": 2,
"reused": false,
"created_at": "2026-11-04T18:12:00.000Z"
},
"meta": { "rate_card": "1" }
}
Roteiros
Um roteiro faz várias vozes falarem em um único arquivo de áudio. Envie lines estruturadas (sem nenhuma análise) ou um script no formato multivoz com o seu cast. As pausas ({"pause_ms": 800}, ou (pause 2s) em um roteiro) não custam nada; só os caracteres falados são cobrados.
A resposta acrescenta lines: onde cada fala começa e termina no áudio, o status dela e quanto dão os seus caracteres (credits, em decimal). A requisição é cobrada uma única vez, arredondada para cima. Uma fala que falha mostra "credits": 0 e não custa nada.
Com auto_convert, um roteiro ou uma conversa colados são convertidos primeiro; com auto_cast, cada personagem sem voz recebe uma.
Exemplo de requisição
{
"mode": "script",
"lines": [
{ "speaker": "Maya", "voice": "nv_7QmS2xK9aLpe3vT8a", "text": "Did you hear that?" },
{ "speaker": "Leo", "voice": "nv_P3vT8aLeQ2mwX4kZ9", "text": "Hear what?" },
{ "pause_ms": 800 },
{ "speaker": "Maya", "voice": "nv_7QmS2xK9aLpe3vT8a", "text": "Exactly. Nothing." }
],
"format": "wav"
}
Ou o formato multivoz
{
"mode": "script",
"script": "[Maya] Did you hear that?\n[Leo] Hear what?\n(pause 1s)\n[Maya] Exactly. Nothing.",
"auto_cast": true
}
Estimar o custo
/api/v1/voice"mode": "estimate" aceita o mesmo corpo de speak ou script e responde com o custo exato, sem gerar nada. É gratuito e não conta nos seus limites de geração (até 300 por minuto por chave).
Campos da resposta
charactersintegerCaracteres falados: o que é cobrado
creditsintegerExatamente o que a requisição cobraria
seconds_estimatednumberQuanto o áudio vai durar, aproximadamente
balanceintegerO seu saldo atual
enoughbooleanO seu saldo (e o limite mensal da chave, se houver) cobre o custo
Exemplo
curl -X POST https://nueform.io/api/v1/voice \
-H "Authorization: Bearer $NUEFORM_API_KEY" \
-d '{"mode": "estimate", "voice": "nv_7QmS2xK9aLpe3vT8a", "text": "Fresh bread every morning at seven. Croissants too. See you on Main Street."}'
{
"data": {
"object": "voice.estimate",
"characters": 75,
"credits": 30,
"seconds_estimated": 4.8,
"balance": 48760,
"enough": true
},
"meta": { "rate_card": "1" }
}
Transmitir fala
/api/v1/voice/streamEnvia o áudio enquanto ele é gerado, para que seu app comece a tocar em cerca de um segundo em vez de esperar o clipe inteiro: um agente, um bot de voz, um leitor. Uma voz lê text. Com o mecanismo de voz já aquecido, o primeiro áudio costuma chegar em 1–2 segundos, seja qual for o tamanho do texto.
O preço é o de Gerar fala: 0,4 crédito por caractere falado, arredondado para cima uma vez por requisição e cobrado quando a transmissão começa. Uma transmissão aceita até cerca de 200 segundos de fala: cerca de 3.100 caracteres em inglês, menos em idiomas falados mais devagar (um texto maior gera 413 TEXT_TOO_LONG com max_characters). Para textos maiores, envie várias transmissões ou use POST /api/v1/voice.
Antes do primeiro byte, qualquer falha é um erro normal e não custa nada: se o mecanismo de voz falhar antes de qualquer áudio, a cobrança é devolvida (500, ou 503 WARMING_UP com Retry-After enquanto o mecanismo inicia). Depois do primeiro byte o status não pode mais mudar, então uma transmissão que falha no meio para antes do fim: seu cliente HTTP informa um corpo incompleto. Use NueForm-Generation-Id com Obter uma geração para ver a cópia salva e quanto ela custou. Se você desligar, a transmissão é concluída e salva do mesmo jeito, e não há devolução.
Toda transmissão também é salva como uma geração: ela fica na sua Library e Baixar o áudio a entrega, normalizada como qualquer clipe.
Transmitir ou /voice? Transmita quando alguém está esperando para ouvir (agentes, bots de voz, leitura em voz alta). Use POST /api/v1/voice para arquivos, roteiros com várias vozes, speed, refações e estimativas. As ferramentas MCP não transmitem: elas geram áudio do jeito do /voice.
Corpo da requisição
voicestringUma voz nv_… de Listar vozes
textstringAs palavras a ler
formatstring"mp3" (padrão, para navegadores), "pcm_24k" (PCM mono bruto de 16 bits little-endian a 24.000 Hz, para agentes) ou "mulaw_8k" (G.711 μ-law a 8 kHz, para telefonia; "ulaw_8000" também funciona)
languagestringUm nome ou código de idioma. Padrão: o próprio idioma da voz
qualitystring"standard" (padrão; "phone" para mulaw_8k), "studio" ou "phone". Mesmo preço
max_creditsintegerRecusar a requisição (409, nada é cobrado) se ela custar mais
savebooleantrue guarda a cópia salva até você excluí-la. Padrão: excluída após 30 dias
titlestringO título dela na sua Library
speed, roteiros, retake_of e reuse não estão disponíveis em uma transmissão (400, reason: "not_on_stream").
Exemplos de código
curl -N -X POST https://nueform.io/api/v1/voice/stream \
-H "Authorization: Bearer $NUEFORM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"voice": "nv_7QmS2xK9aLpe3vT8a", "text": "Fresh bread every morning at seven.", "format": "mp3"}' \
--output stream.mp3
Este texto tem 35 caracteres falados, então custa 14 créditos (35 × 0,4).
Cabeçalhos da resposta
HTTP/1.1 200 OK
Content-Type: application/octet-stream
Transfer-Encoding: chunked
NueForm-Generation-Id: gen_2cH4kXyQ9vLmNp3Rs
NueForm-Credits-Estimated: 14
NueForm-Credits-Charged: 14
NueForm-Credits-Remaining: 48716
NueForm-Rate-Card: 1
NueForm-Audio-Format: pcm_24k
NueForm-Audio-Encoding: pcm_s16le
NueForm-Audio-Sample-Rate: 24000
NueForm-Audio-Channels: 1
X-Accel-Buffering: no
Refações
Envie {"mode": "speak", "retake_of": "gen_…"} para refazer uma geração com as mesmas palavras, vozes, idioma, qualidade e velocidade. Com retake_of, só vão mode, format, max_credits e save.
- Gratuita duas vezes em até 24 horas após a geração, desde que as refações gratuitas da chave neste mês não passem de um quarto dos caracteres cobrados dela neste mês. Uma refação gratuita mantém o mesmo ID
gen_…. - Caso contrário, é uma nova geração, cobrada como qualquer requisição (0,4 crédito por caractere), e
retake_ofindica a geração refeita.
Envie "mode": "estimate" com retake_of para saber antes: a resposta diz "free": true ou quanto custaria.
Idempotência
Envie um cabeçalho Idempotency-Key (de 1 a 255 caracteres, por exemplo um UUID) com as requisições speak e script, e uma nova tentativa nunca poderá cobrar duas vezes:
- a mesma chave com o mesmo corpo responde de novo com o que a primeira requisição gerou, sem cobrar (
Idempotent-Replayed: true,NueForm-Credits-Charged: 0); - a mesma chave com outro corpo resulta em
409 CONFLICTcomreason: "idempotency_conflict"; - enquanto a primeira requisição ainda está em andamento,
409 CONFLICTcomreason: "request_in_progress"eRetry-After.
As chaves ficam guardadas por 24 horas, por chave de API.
Em uma transmissão, a mesma chave com o mesmo corpo responde com JSON: a geração que a primeira requisição fez (ela não é transmitida de novo).
Cabeçalhos da resposta
Toda resposta diz quanto custou:
| Cabeçalho | Significado |
|---|---|
NueForm-Generation-Id | A geração (gen_…) |
NueForm-Credits-Estimated | O preço cotado para a requisição |
NueForm-Credits-Charged | O que esta requisição cobrou, depois de qualquer devolução automática (0 para uma estimativa, um clipe reutilizado, uma refação gratuita, uma repetição e qualquer erro) |
NueForm-Credits-Remaining | O seu saldo depois |
NueForm-Rate-Card | A versão da tabela de preços usada na cobrança |
NueForm-Retakes-Remaining | Refações gratuitas restantes deste clipe |
NueForm-Audio-Duration | A duração do áudio em segundos |
Idempotent-Replayed | Com uma Idempotency-Key: se isto responde a uma requisição anterior |
NueForm-Audio-Format, NueForm-Audio-Encoding, NueForm-Audio-Sample-Rate, NueForm-Audio-Channels | O áudio de uma transmissão: formato, codificação, taxa de amostragem e canais |
X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset | As requisições desta chave neste minuto (veja Limites de taxa) |
Listar vozes
/api/v1/voice/voicesAs vozes prontas do NueForm e depois as suas vozes e as das suas equipes, cada uma com o seu ID nv_…, o seu idioma, uma prévia gratuita e o seu ritmo. Gratuito.
Parâmetros de consulta
sourcestring"all" (padrão), "stock" ou "mine"
languagestringUm nome ou código de idioma
genderstringPor exemplo "female"
qstringPesquisar nomes, estilos e rótulos
featuredbooleantrue: só as vozes prontas em destaque
Resposta
{
"data": [
{
"id": "nv_7QmS2xK9aLpe3vT8a",
"object": "voice",
"name": "Amara",
"source": "stock",
"type": "clone",
"language": "English",
"language_label": "English (US)",
"gender": "female",
"age": null,
"style": "Warm",
"featured": true,
"preview_url": "https://nueform.io/voice-previews/amara.mp3",
"team_id": null,
"can_delete": false,
"chars_per_second": 15.5,
"created_at": null
}
],
"meta": { "count": 1 }
}
Excluir uma voz
/api/v1/voice/voices/:idExclui de vez uma das suas vozes: a amostra, os prompts e a prévia, depois a voz. Os créditos não são reembolsados. Enquanto formulários ou números de telefone ainda usarem a voz, a resposta é 409 CONFLICT com reason: "voice_in_use" e quantos são; envie ?replacement=nv_… para trocá-los antes por outra voz.
Resposta
{
"data": {
"id": "nv_9LmQ2xT4aPe7vK3sW",
"object": "voice",
"deleted": true,
"switched": { "forms": 2, "numbers": 1 },
"forms_to_republish": 1
}
}
Listar gerações
/api/v1/voice/generationsAs suas gerações, das mais recentes para as mais antigas. Avance com meta.next_cursor.
Parâmetros de consulta
limitintegerDe 1 a 100 (padrão 20)
cursorstringnext_cursor da página anterior
sourcestringSó as geradas por "api", "studio", "mcp" ou "app"
Resposta
{
"data": [
{ "id": "gen_2cH4kXyQ9vLmNp3Rs", "object": "voice.generation", "status": "ready", "credits": { "charged": 30 } }
],
"meta": { "next_cursor": null, "has_more": false }
}
Obter uma geração
/api/v1/voice/generations/:idUma geração, com as suas lines se for um roteiro. Aqui credits.charged é quanto ela custou no total, depois de qualquer devolução automática.
Baixar o áudio
/api/v1/voice/generations/:id/audioO próprio áudio, transmitido com a sua chave de API (aceita intervalos de bytes). ?format= é mp3 (padrão), wav, ogg_opus ou mulaw_8k. Ogg/Opus e μ-law de 8 kHz são gerados na primeira vez que você pede: um 202 significa "peça de novo depois de Retry-After segundos". Gratuito.
Excluir uma geração
/api/v1/voice/generations/:idExclui de vez a geração e o seu áudio. Os créditos não são reembolsados. Uma geração que ainda está sendo gerada responde 409 CONFLICT com reason: "still_rendering".
Consultar seus créditos
/api/v1/creditsO saldo de onde a sua chave gasta, o mês da chave e a tabela de preços. Somente leitura, com uma chave Voice ou uma chave de acesso total.
Campos da resposta
balanceintegerCréditos que você pode gastar agora (10.000 créditos = US$ 1)
approxstringO saldo em dólares
keyobjectmonthly_credit_limit desta chave (null = nenhum), spent_this_month, paused e resets_at (o dia 1º, UTC)
voice_apiobjectcredits_per_character (0,4), como arredonda e que as estimativas são gratuitas
rate_cardobjectTodos os preços, por ação
Resposta
{
"data": {
"object": "credits",
"balance": 48730,
"approx": "≈ $4.87",
"currency": "usd",
"frozen": false,
"key": {
"id_prefix": "nf_a1b2c3d4",
"monthly_credit_limit": 100000,
"spent_this_month": 1240,
"paused": false,
"resets_at": "2026-12-01T00:00:00.000Z"
},
"voice_api": { "credits_per_character": 0.4, "rounding": "up_per_request", "estimate_free": true }
},
"meta": { "rate_card": "1" }
}
Preços
| O quê | Créditos | Em dólares |
|---|---|---|
| Fala pela API de voz | 0,4 por caractere falado, em qualquer idioma | cerca de US$ 0,04 a cada 1.000 caracteres |
| Uma estimativa | 0 | gratuito |
Um clipe reutilizado (reuse) | 0 | gratuito |
| Uma refação | 0 duas vezes em até 24 horas (uso justo), depois 0,4 por caractere |
Os créditos vêm em pacotes (a partir de US$ 5 por 50.000 créditos) e nunca expiram. Uma chave pode ter um limite mensal de créditos: depois de gastar esse valor, as requisições de fala e de exclusão dela recebem 403 FORBIDDEN com reason: "key_limit_reached" até o dia 1º (ela ainda pode listar e baixar o que gerou), e as suas outras chaves continuam funcionando. As requisições são pagas com os créditos que o dono da chave escolheu em Pagar o Voice Studio com, na Carteira: os dele, a menos que tenha escolhido uma equipe. Uma equipe que não pode pagar nunca é trocada pelos créditos próprios: a requisição recebe 403 FORBIDDEN com reason: "team_payer_unavailable", ou reason: "member_cap_reached" ao atingir o limite mensal como membro, e nada é cobrado.
Erros
Todo erro usa o formato de erro padrão, e nada que termine em erro é cobrado. Os mais comuns:
| Status | code | Quando |
|---|---|---|
| 402 | INSUFFICIENT_CREDITS | O seu saldo não cobre a requisição (credits_required, credits_available, top_up_url; payer: "team" quando quem não tem saldo é a equipe com que o dono da chave paga: aí top_up_url abre a Carteira, onde Pagar o Voice Studio com pode ser trocado pelos créditos próprios) |
| 403 | FORBIDDEN | reason: key_limit_reached, account_gate, scope_not_allowed, cooldown, voice_studio_suspended, wallet_frozen, member_cap_reached, team_payer_unavailable |
| 409 | CONFLICT | reason: quote_exceeds_max_credits, idempotency_conflict, request_in_progress, unit_rendering |
| 413 | TEXT_TOO_LONG | Mais de 5.000 caracteres falados (max_characters) |
| 422 | CONTENT_BLOCKED, VOICE_UNAVAILABLE, LANGUAGE_NOT_SUPPORTED_BY_VOICE, INVALID_SCRIPT | O texto ou as vozes não podem ser falados do jeito que foram enviados |
| 429 | RATE_LIMITED, CONCURRENCY_LIMIT | Requisições demais (veja Limites de taxa) |
| 503 | CAPACITY, WARMING_UP, MODERATION_UNAVAILABLE, AI_UNAVAILABLE | Tente de novo depois de Retry-After segundos |