NueForm

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

POST/api/v1/voice

Gera 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)

textstring

speak: as palavras a serem lidas

voicestring

Uma voz nv_… de Listar vozes. Obrigatória em speak; em um script, a voz das falas sem tag de personagem

linesarray

script: falas estruturadas, cada uma {"speaker", "voice", "text"} ou uma pausa {"pause_ms": 800} (até 10.000)

scriptstring

script: o formato multivoz, uma linha por personagem: [Maya] Did you hear that?

castarray

script: uma voz para cada personagem com tag, [{"speaker": "Maya", "voice": "nv_…"}]

auto_convertboolean

Converter primeiro um roteiro ou uma conversa colados (MAYA: Hi) para o formato multivoz. Gratuito, dentro de um limite diário

auto_castboolean

Escolher 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

languagestring

Um 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

speednumber

De 0,85 a 1,15 (padrão 1)

formatstring

"mp3" (padrão), "wav", "ogg_opus" ou "mulaw_8k"

max_creditsinteger

Recusar a requisição (409, nada é cobrado) se ela custar mais

reuseboolean

Padrão true: uma requisição idêntica feita nos últimos 30 dias recebe esse áudio por 0 crédito

saveboolean

true guarda o áudio até você excluí-lo. Padrão: excluído após 30 dias

retake_ofstring

Refazer uma geração (veja Refações)

titlestring

O título dela na sua Library

Campos da resposta

idstring

A geração (gen_…)

statusstring

"ready", "rendering" (202: ainda está sendo gerada), "partial" (algumas falas falharam e não custam nada) ou "failed"

audioobject or null

url (envie sua chave de API), format, sample_rate, duration_seconds, retained_until

creditsobject

estimated, charged (o que esta requisição cobrou) e remaining

linesarray

Somente script: speaker, voice, text, status, start_ms, end_ms e credits de cada fala

retakes_remaininginteger

Refações gratuitas restantes deste clipe

reusedboolean

O áudio de uma requisição idêntica anterior, por 0 crédito

Exemplos de código

bash
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

text
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

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

json
{
  "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

json
{
  "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

POST/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

charactersinteger

Caracteres falados: o que é cobrado

creditsinteger

Exatamente o que a requisição cobraria

seconds_estimatednumber

Quanto o áudio vai durar, aproximadamente

balanceinteger

O seu saldo atual

enoughboolean

O seu saldo (e o limite mensal da chave, se houver) cobre o custo

Exemplo

bash
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."}'
json
{
  "data": {
    "object": "voice.estimate",
    "characters": 75,
    "credits": 30,
    "seconds_estimated": 4.8,
    "balance": 48760,
    "enough": true
  },
  "meta": { "rate_card": "1" }
}

Transmitir fala

POST/api/v1/voice/stream

Envia 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

voicestring

Uma voz nv_… de Listar vozes

textstring

As 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)

languagestring

Um 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_creditsinteger

Recusar a requisição (409, nada é cobrado) se ela custar mais

saveboolean

true guarda a cópia salva até você excluí-la. Padrão: excluída após 30 dias

titlestring

O 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

bash
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

text
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_of indica 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 CONFLICT com reason: "idempotency_conflict";
  • enquanto a primeira requisição ainda está em andamento, 409 CONFLICT com reason: "request_in_progress" e Retry-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çalhoSignificado
NueForm-Generation-IdA geração (gen_…)
NueForm-Credits-EstimatedO preço cotado para a requisição
NueForm-Credits-ChargedO 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-RemainingO seu saldo depois
NueForm-Rate-CardA versão da tabela de preços usada na cobrança
NueForm-Retakes-RemainingRefações gratuitas restantes deste clipe
NueForm-Audio-DurationA duração do áudio em segundos
Idempotent-ReplayedCom uma Idempotency-Key: se isto responde a uma requisição anterior
NueForm-Audio-Format, NueForm-Audio-Encoding, NueForm-Audio-Sample-Rate, NueForm-Audio-ChannelsO áudio de uma transmissão: formato, codificação, taxa de amostragem e canais
X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-ResetAs requisições desta chave neste minuto (veja Limites de taxa)

Listar vozes

GET/api/v1/voice/voices

As 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"

languagestring

Um nome ou código de idioma

genderstring

Por exemplo "female"

qstring

Pesquisar nomes, estilos e rótulos

featuredboolean

true: só as vozes prontas em destaque

Resposta

json
{
  "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

DELETE/api/v1/voice/voices/:id

Exclui 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

json
{
  "data": {
    "id": "nv_9LmQ2xT4aPe7vK3sW",
    "object": "voice",
    "deleted": true,
    "switched": { "forms": 2, "numbers": 1 },
    "forms_to_republish": 1
  }
}

Listar gerações

GET/api/v1/voice/generations

As suas gerações, das mais recentes para as mais antigas. Avance com meta.next_cursor.

Parâmetros de consulta

limitinteger

De 1 a 100 (padrão 20)

cursorstring

next_cursor da página anterior

sourcestring

Só as geradas por "api", "studio", "mcp" ou "app"

Resposta

json
{
  "data": [
    { "id": "gen_2cH4kXyQ9vLmNp3Rs", "object": "voice.generation", "status": "ready", "credits": { "charged": 30 } }
  ],
  "meta": { "next_cursor": null, "has_more": false }
}

Obter uma geração

GET/api/v1/voice/generations/:id

Uma 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

GET/api/v1/voice/generations/:id/audio

O 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

DELETE/api/v1/voice/generations/:id

Exclui 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

GET/api/v1/credits

O 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

balanceinteger

Créditos que você pode gastar agora (10.000 créditos = US$ 1)

approxstring

O saldo em dólares

keyobject

monthly_credit_limit desta chave (null = nenhum), spent_this_month, paused e resets_at (o dia 1º, UTC)

voice_apiobject

credits_per_character (0,4), como arredonda e que as estimativas são gratuitas

rate_cardobject

Todos os preços, por ação

Resposta

json
{
  "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éditosEm dólares
Fala pela API de voz0,4 por caractere falado, em qualquer idiomacerca de US$ 0,04 a cada 1.000 caracteres
Uma estimativa0gratuito
Um clipe reutilizado (reuse)0gratuito
Uma refação0 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:

StatuscodeQuando
402INSUFFICIENT_CREDITSO 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)
403FORBIDDENreason: key_limit_reached, account_gate, scope_not_allowed, cooldown, voice_studio_suspended, wallet_frozen, member_cap_reached, team_payer_unavailable
409CONFLICTreason: quote_exceeds_max_credits, idempotency_conflict, request_in_progress, unit_rendering
413TEXT_TOO_LONGMais de 5.000 caracteres falados (max_characters)
422CONTENT_BLOCKED, VOICE_UNAVAILABLE, LANGUAGE_NOT_SUPPORTED_BY_VOICE, INVALID_SCRIPTO texto ou as vozes não podem ser falados do jeito que foram enviados
429RATE_LIMITED, CONCURRENCY_LIMITRequisições demais (veja Limites de taxa)
503CAPACITY, WARMING_UP, MODERATION_UNAVAILABLE, AI_UNAVAILABLETente de novo depois de Retry-After segundos
Última atualização: 20 de outubro de 2026