Vai al contenuto principale

Gemini 3.8 Flash TTS trasforma un testo in un WAV mono a 24 kHz con una di 30 voci, o due voci per un dialogo. Le indicazioni tra parentesi come [whispering], [sighs] o [laughing] vengono recitate e non lette ad alta voce.

Da $0.00032/s

Playground

Invia una richiesta

Guida rapida

Gli esempi usano le definizioni pubbliche dei parametri dell’endpoint selezionato. Sostituisci la chiave API e i media di esempio, poi invia la richiesta dal tuo server.

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

Autenticazione dell’API

Tieni la chiave API nella variabile d’ambiente del server SPICY_API_KEY. Per le richieste JSON usa l’autenticazione Bearer e Content-Type: application/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"

Generato dallo schema di input di questo modello, lo stesso su cui l’API valida ogni richiesta.

Parametri di input

Metti questi campi dentro l’oggetto input del corpo della richiesta. Nomi e tipi corrispondono all’API. Quando un valore predefinito non è indicato, non darlo per scontato.

Questo modello ha dipendenze tra i campi. I campi segnati come obbligatori a certe condizioni dipendono da altri input; le regole sono nel JSON Schema completo qui sotto.

temperaturenumberFacoltativo

Variazione tra le prove, da 0 a 2: valori più alti rendono l'interpretazione meno prevedibile. Se non lo imposti, si usa il valore predefinito del modello. Non cambia il prezzo al secondo.

Predefinito
Non specificato
Vincoli
minimum:0
maximum:2
scenestringFacoltativo

Dove e a chi vengono dette le parole, per esempio “una stanza d'albergo silenziosa dopo mezzanotte”. Orienta l'interpretazione e non viene letto. Fino a 500 caratteri. Non cambia il prezzo al secondo.

Predefinito
Non specificato
Vincoli
maxLength:500
instructionsstringFacoltativo

Indicazione libera su come leggere: ritmo, stato d'animo, distanza dal microfono, ascoltatore. Plasma l'interpretazione e non viene pronunciata. Fino a 1.000 caratteri.

Predefinito
Non specificato
Vincoli
maxLength:1000
accentstringFacoltativo

Accento inglese usato per la lettura. Se non lo imposti, si usa l'accento naturale della voce. In dialogue vale per le voci che non ne impostano uno.

Predefinito
Non specificato
Valori ammessi
"neutral""american_general""american_valley""american_south""british_rp""british_brixton""transatlantic""australian"
pacestringFacoltativo

Ritmo della lettura: natural, rapid_fire (veloce e secco), the_drift (lento e disteso) o staccato (frasi brevi e staccate). Se non lo imposti, la voce mantiene il suo ritmo; in dialogue vale per le voci che non ne impostano uno. Un ritmo più lento produce più secondi di audio, ed è quello che paghi.

Predefinito
Non specificato
Valori ammessi
"natural""rapid_fire""the_drift""staccato"
stylestringFacoltativo

Modo generale della lettura. Lascialo vuoto per usare il modo predefinito della voce. In dialogue vale per le voci che non ne impostano uno.

Predefinito
Non specificato
Valori ammessi
"whisper""empathetic""vocal_smile""newscaster""promo_hype""deadpan"
voice_idstringFacoltativo

Una delle 30 voci predefinite, ciascuna con un carattere fisso. Il valore predefinito è Kore. È la voce di text; in dialogue ogni voce imposta il proprio voice_id.

Predefinito
"Kore"
Valori ammessi
"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>Obbligatorio a certe condizioni

Il cast di dialogue: una o due voci, ognuna con un name a cui fanno riferimento le battute, un voice_id e, facoltativi, accent, style, pace e profile (una breve descrizione di chi parla, che non viene letta). Ciò che una voce non imposta viene preso da accent, style e pace di primo livello. Non cambia il prezzo al secondo.

Predefinito
Non specificato
Vincoli
minItems:1
maxItems:2
dialoguearray<object>Obbligatorio a certe condizioni

Un dialogo con copione per un massimo di due voci, al posto di text: fino a 20 battute, ognuna con speaker (un nome preso da speakers) e un text di massimo 250 caratteri. Le battute vengono recitate in ordine. Si paga per secondo di audio restituito, come per text.

Predefinito
Non specificato
Vincoli
minItems:1
maxItems:20
textstringObbligatorio a certe condizioni

Le parole da pronunciare, esattamente come scritte. Le indicazioni tra parentesi quadre come [whispering] o [sighs] vengono interpretate, non lette. Fino a 5.000 caratteri. Per una conversazione tra due voci, usa invece dialogue.

Predefinito
Non specificato
Vincoli
minLength:1
maxLength:5000

Segui l’attività

HTTP 202 significa che l’attività è stata accettata, non che sia finita. Salva il taskId restituito e interroga quell’attività. Non crearne un’altra mentre aspetti il risultato.

Risposta di accettazione
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 risposta di accettazione include la stima, così la tua applicazione può mostrare lo stesso importo nella cronologia delle attività e nella fatturazione.

Leggi l’attività
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Comincia a interrogare ogni 2 secondi circa e allunga l’intervallo man mano. Fermati a uno stato terminale. Dopo una caduta di connessione, interroga il taskId originale. Ripeti la creazione solo con la chiave di idempotenza e il corpo originali.

Oppure lascia che sia la callback a trovarti
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);
});

Passa callBackUrl quando crei l’attività e il record finito ti arriva via POST: nessun ciclo di polling. Ogni consegna porta X-Webhook-Timestamp, X-Webhook-Signature e X-Webhook-Payload-Version. La firma è un HMAC-SHA256 in base64 su taskId.timestamp.sha256(body), quindi va verificata sui byte grezzi: se analizzi il JSON e lo riserializzi i byte cambiano e la verifica fallisce. Le consegne fallite vengono ritentate, quindi lo stesso taskId può arrivare due volte: rendi idempotente il gestore. Rispondi prima con un 2xx e fai il lavoro dopo; un gestore lento viene trattato come una consegna fallita.

Leggi il risultato

Usa l’output solo quando lo stato è succeeded. In caso di fallimento, indaga con errorCode, errorMessage e request_id. Costi e stati degli esempi non rappresentano un addebito reale.

Esempio di risposta completata
{
  "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"
  }
}

Per ogni asset disponibile, apri o scarica assets[].url direttamente, senza l’header Authorization dell’API. L’URL firmato scade a expiresAt; interroga di nuovo l’attività per rinnovarlo finché l’asset resta entro il periodo di conservazione. Un asset in attesa o non disponibile non ha URL. Tratta gli URL firmati come privati.

SDK e integrazioni

Usa SpicyAPI nella tua app, nel terminale, con un assistente IA o in un workflow visivo. Scegli una guida di configurazione.

Usalo in ComfyUI

Installa i nodi SpicyAPI da ComfyUI Manager o con il comando qui sotto, poi cerca Gemini 3.8 Flash TTS · Text to Speech sulla tela. Il nodo ha le stesse opzioni di questa pagina e mostra il prezzo prima dell’esecuzione.

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