Ir al contenido principal

Gemini 3.8 Flash-Lite TTS es el modelo text-to-speech más rápido y económico de Google: elige una de 30 voces y recibe un WAV mono de 24 kHz, normalmente en segundos. El diálogo admite hasta dos voces y la puntuación da forma a la entonación.

Desde $0.00021/s

Playground

Enviar una solicitud

Inicio rápido

Los ejemplos usan las definiciones públicas de parámetros del endpoint seleccionado. Sustituye la clave de API y los medios de ejemplo, y envía la solicitud desde tu servidor.

SDK e integraciones
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Autenticación de API

Guarda la clave de API en la variable de entorno del servidor SPICY_API_KEY. Usa autenticación Bearer y Content-Type: application/json en las solicitudes 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-lite-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"

Generado a partir del esquema de entrada de este modelo: el mismo con el que la API valida cada solicitud.

Parámetros de entrada

Incluye estos campos en el objeto input del cuerpo de la solicitud. Los nombres y tipos coinciden con la API. No supongas un valor predeterminado si no está indicado.

Este modelo tiene dependencias entre campos. Los marcados como obligatorios según condición dependen de otras entradas; abajo, en el JSON Schema completo, están las reglas.

temperaturenumberOpcional

Variación entre tomas, de 0 a 2: los valores más altos hacen la interpretación menos predecible. Si no lo defines, se usa el valor predeterminado del modelo. No cambia el precio por segundo.

Valor predeterminado
Sin especificar
Restricciones
minimum:0
maximum:2
scenestringOpcional

Dónde y a quién se dicen las palabras, por ejemplo “una habitación de hotel en silencio pasada la medianoche”. Da forma a la interpretación y no se lee en voz alta. Hasta 500 caracteres. No cambia el precio por segundo.

Valor predeterminado
Sin especificar
Restricciones
maxLength:500
instructionsstringOpcional

Indicación libre sobre cómo leer: ritmo, ánimo, distancia al micrófono y oyente. Da forma a la interpretación y no se pronuncia. Hasta 1000 caracteres.

Valor predeterminado
Sin especificar
Restricciones
maxLength:1000
accentstringOpcional

Acento del inglés para la lectura. Si no lo defines, se usa el acento propio de la voz. En dialogue se aplica a las entradas que no fijan el suyo.

Valor predeterminado
Sin especificar
Valores permitidos
"neutral""american_general""american_valley""american_south""british_rp""british_brixton""transatlantic""australian"
pacestringOpcional

Ritmo de la lectura: natural, rapid_fire (rápido y cortante), the_drift (lento y pausado) o staccato (frases cortas y separadas). Si no lo defines, se mantiene el ritmo propio de la voz; en dialogue se aplica a las entradas que no fijan el suyo. Un ritmo más lento produce más segundos de audio, que es lo que se cobra.

Valor predeterminado
Sin especificar
Valores permitidos
"natural""rapid_fire""the_drift""staccato"
stylestringOpcional

Manera general de la lectura. Déjalo vacío para usar la manera predeterminada de la voz. En dialogue se aplica a las entradas que no fijan el suyo.

Valor predeterminado
Sin especificar
Valores permitidos
"whisper""empathetic""vocal_smile""newscaster""promo_hype""deadpan"
voice_idstringOpcional

Una de 30 voces prediseñadas, cada una con un carácter fijo. Por defecto es Kore. Es la voz de text; en dialogue cada entrada fija su propio voice_id.

Valor predeterminado
"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>Obligatorio según condición

El reparto de dialogue: una o dos entradas, cada una con un name al que se refieren las líneas, un voice_id y, de forma opcional, accent, style, pace y profile (una breve descripción de quién habla, que no se lee en voz alta). Lo que una entrada no defina se toma de accent, style y pace del nivel superior. No cambia el precio por segundo.

Valor predeterminado
Sin especificar
Restricciones
minItems:1
maxItems:2
dialoguearray<object>Obligatorio según condición

Una conversación con guion para hasta dos voces, en lugar de text: hasta 20 líneas, cada una con speaker (un nombre de speakers) y text de hasta 250 caracteres. Las líneas se interpretan en orden. Se cobra por segundo de audio devuelto, igual que text.

Valor predeterminado
Sin especificar
Restricciones
minItems:1
maxItems:20
textstringObligatorio según condición

Las palabras que se deben pronunciar, exactamente como están escritas. Las indicaciones entre corchetes como [sighs] no se interpretan de forma confiable y pueden leerse en voz alta; escribe los sonidos tal cual en su lugar. Hasta 5.000 caracteres. Para una conversación entre dos voces, usa dialogue en su lugar.

Valor predeterminado
Sin especificar
Restricciones
minLength:1
maxLength:5000

Seguir la tarea

HTTP 202 significa que la tarea se aceptó, no que haya terminado. Guarda el taskId devuelto y consulta esa tarea. No crees otra mientras esperas el resultado.

Solicitud aceptada
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"
  }
}

La respuesta de aceptación incluye la estimación para que tu aplicación pueda mostrar el mismo importe en el historial de tareas y en la facturación.

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

Empieza consultando cada 2 segundos aproximadamente y ve espaciando los intentos. Párate en un estado final. Si se cae la conexión, consulta el taskId original. Vuelve a crear la tarea solo con la clave de idempotencia y el cuerpo originales.

O recibe el 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);
});

Pasa callBackUrl al crear la tarea y recibirás el registro terminado por POST, sin un bucle de consultas de estado. Cada entrega lleva X-Webhook-Timestamp, X-Webhook-Signature y X-Webhook-Payload-Version. La firma es un HMAC-SHA256 en base64 sobre taskId.timestamp.sha256(body), así que debes verificarla con los bytes originales: si analizas el JSON y vuelves a serializarlo, los bytes cambian y la verificación falla. Las entregas fallidas se reintentan, de modo que el mismo taskId puede llegar dos veces; haz que tu manejador sea idempotente. Responde 2xx primero y haz el trabajo después: un manejador lento se trata como una entrega fallida.

Leer el resultado

Procesa output solo cuando state sea succeeded. Si falla, consulta errorCode, errorMessage y request_id. Los costos y estados de ejemplo no representan una factura real.

Ejemplo de respuesta completada
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "google/gemini-3.8-flash-lite-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 archivo disponible, abre o descarga assets[].url directamente, sin la cabecera Authorization de la API. El enlace firmado expira en expiresAt: vuelve a consultar la tarea para renovarlo mientras el archivo siga dentro del periodo de conservación. Un archivo pendiente o no disponible no trae URL. Trata los enlaces firmados como datos privados.

SDK e integraciones

Usa SpicyAPI en tu app, terminal, asistente de IA o flujo visual. Elige una guía de configuración.

Úsalo en ComfyUI

Instala los nodos de SpicyAPI desde ComfyUI Manager o con el comando de abajo y busca Gemini 3.8 Flash-Lite TTS · Text to Speech en el lienzo. El nodo tiene las mismas opciones que esta página y muestra su precio antes de ejecutarse.

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