Pular para o conteúdo principal

O Gemini 3.8 Flash TTS transforma um roteiro em um WAV mono de 24 kHz em uma de 30 vozes, ou em duas vozes para um diálogo. Marcações entre colchetes como [whispering], [sighs] ou [laughing] são interpretadas em vez de lidas em voz alta.

A partir de $0.00032/s

Playground

Enviar uma requisição

Início rápido

Os exemplos usam as definições públicas de parâmetros do endpoint selecionado. Troque a chave de API e as mídias de exemplo e envie a requisição a partir do seu servidor.

SDKs e integrações
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Autenticação da API

Guarde a chave de API na variável de ambiente do servidor SPICY_API_KEY. Use autenticação Bearer e Content-Type: application/json nas requisições JSON.

Authorization: Bearer $SPICY_API_KEY
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  -d '{
  "model": "google/gemini-3.8-flash-tts/text-to-speech",
  "input": {
    "text": "Welcome back. Your files finished rendering a minute ago and are ready to download.",
    "voice_id": "Kore"
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Gerado a partir do schema de entrada deste modelo — o mesmo que a API usa para validar cada requisição.

Parâmetros de entrada

Coloque estes campos no objeto input do corpo da requisição. Nomes e tipos são os mesmos da API. Quando nenhum valor padrão estiver indicado, não presuma que exista um.

Este modelo tem dependências entre campos. Os campos marcados como obrigatórios sob condição dependem de outras entradas; as regras completas estão no JSON Schema abaixo.

temperaturenumberOpcional

Variação entre as tomadas, de 0 a 2: valores mais altos deixam a interpretação menos previsível. Se você não definir, vale o padrão do modelo. Não altera o preço por segundo.

Valor padrão
Não especificado
Restrições
minimum:0
maximum:2
scenestringOpcional

Onde e para quem as palavras são ditas, por exemplo “um quarto de hotel silencioso depois da meia-noite”. Molda a interpretação e não é lido em voz alta. Até 500 caracteres. Não altera o preço por segundo.

Valor padrão
Não especificado
Restrições
maxLength:500
instructionsstringOpcional

Instrução livre sobre como ler: ritmo, clima, distância do microfone, ouvinte. Molda a interpretação e não é falada. Até 1.000 caracteres.

Valor padrão
Não especificado
Restrições
maxLength:1000
accentstringOpcional

Sotaque do inglês usado na leitura. Se você não definir, vale o sotaque próprio da voz. Em dialogue, vale para as entradas que não definirem o seu.

Valor padrão
Não especificado
Valores permitidos
"neutral""american_general""american_valley""american_south""british_rp""british_brixton""transatlantic""australian"
pacestringOpcional

Ritmo da leitura: natural, rapid_fire (rápido e seco), the_drift (lento e arrastado) ou staccato (frases curtas e separadas). Se você não definir, a voz mantém o próprio ritmo; em dialogue, vale para as entradas que não definirem o seu. Um ritmo mais lento gera mais segundos de áudio, que é o que você paga.

Valor padrão
Não especificado
Valores permitidos
"natural""rapid_fire""the_drift""staccato"
stylestringOpcional

Jeito geral da leitura. Deixe vazio para usar o jeito padrão da voz. Em dialogue, vale para as entradas que não definirem o seu.

Valor padrão
Não especificado
Valores permitidos
"whisper""empathetic""vocal_smile""newscaster""promo_hype""deadpan"
voice_idstringOpcional

Uma das 30 vozes prontas, cada uma com um caráter fixo. O padrão é Kore. É a voz de text; em dialogue cada entrada define o próprio voice_id.

Valor padrão
"Kore"
Valores permitidos
"Achernar""Achird""Algenib""Algieba""Alnilam""Aoede""Autonoe""Callirrhoe""Charon""Despina""Enceladus""Erinome""Fenrir""Gacrux""Iapetus""Kore""Laomedeia""Leda""Orus""Puck""Pulcherrima""Rasalgethi""Sadachbia""Sadaltager""Schedar""Sulafat""Umbriel""Vindemiatrix""Zephyr""Zubenelgenubi"
speakersarray<object>Obrigatório sob condição

O elenco de dialogue: uma ou duas entradas, cada uma com um name ao qual as falas se referem, um voice_id e, opcionalmente, accent, style, pace e profile (uma descrição curta de quem fala, que não é lida em voz alta). O que uma entrada não definir vem de accent, style e pace do nível superior. Não altera o preço por segundo.

Valor padrão
Não especificado
Restrições
minItems:1
maxItems:2
dialoguearray<object>Obrigatório sob condição

Uma conversa roteirizada para até duas vozes, usada no lugar de text: até 20 falas, cada uma com speaker (um nome de speakers) e text de até 250 caracteres. As falas são interpretadas em ordem. Cobrado por segundo de áudio retornado, como text.

Valor padrão
Não especificado
Restrições
minItems:1
maxItems:20
textstringObrigatório sob condição

As palavras a serem faladas, exatamente como escritas. Indicações entre colchetes como [whispering] ou [sighs] são interpretadas, não lidas. Até 5.000 caracteres. Para uma conversa entre duas vozes, use dialogue.

Valor padrão
Não especificado
Restrições
minLength:1
maxLength:5000

Acompanhar tarefa

HTTP 202 quer dizer que a tarefa foi aceita, não que terminou. Guarde o taskId devolvido e consulte essa tarefa. Não crie outra enquanto espera o resultado.

Requisição aceita
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

A resposta de aceitação já traz a estimativa, para que o seu aplicativo mostre o mesmo valor no histórico de tarefas e na cobrança.

Consultar a tarefa
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Comece consultando a cada 2 segundos, mais ou menos, e vá espaçando. Pare em um estado final. Se a conexão cair, consulte o taskId original. Só recrie a tarefa com a chave de idempotência e o corpo originais.

Ou receba o resultado por callback
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

Passe callBackUrl ao criar a tarefa e o registro concluído chega até você via POST — sem nenhum laço de polling. Toda entrega traz X-Webhook-Timestamp, X-Webhook-Signature e X-Webhook-Payload-Version. A assinatura é um HMAC-SHA256 em base64 sobre taskId.timestamp.sha256(body), então confira contra os bytes brutos: se você analisar o JSON e serializar de novo, os bytes mudam e a verificação falha. Entregas com erro são repetidas, ou seja, o mesmo taskId pode chegar duas vezes — deixe seu handler idempotente. Responda 2xx primeiro e faça o trabalho depois; um handler lento conta como entrega falha.

Ler resultado

Só consuma output quando state for succeeded. Em caso de falha, use errorCode, errorMessage e request_id para investigar. Os custos e estados de exemplo não representam uma cobrança real.

Exemplo de resposta concluída
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "google/gemini-3.8-flash-tts/text-to-speech",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.mp3",
          "mime": "audio/mpeg",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp3?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

Para cada arquivo disponível, abra ou baixe assets[].url direto, sem o cabeçalho Authorization da API. O link assinado expira em expiresAt: consulte a tarefa de novo para renovar enquanto o arquivo estiver dentro do prazo de retenção. Arquivo pendente ou indisponível não tem URL. Trate os links assinados como dado privado.

SDKs e integrações

Use a SpicyAPI no seu app, terminal, assistente de IA ou fluxo visual. Escolha um guia de configuração.

Use no ComfyUI

Instale os nós da SpicyAPI pelo ComfyUI Manager ou com o comando abaixo e procure por Gemini 3.8 Flash TTS · Text to Speech no canvas. O nó tem as mesmas opções desta página e mostra o preço antes da execução.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi