Genera voz con Gemini TTS

Los modelos de texto a voz (TTS) de Gemini convierten el texto en audio de un solo interlocutor o de varios interlocutores. Puedes controlar el estilo, el acento, el ritmo y el tono del audio con metadatos de turno estructurados (speech_metadata) y etiquetas vocales intercaladas.

En esta página, se muestra cómo generar voz con los siguientes modelos usando los métodos generateContent y streamGenerateContent de la API de Gemini Enterprise:

Los modelos de TTS se adaptan para la recitación exacta de texto con un control detallado del estilo y el sonido, como la narración, los audiolibros y las respuestas de los agentes de voz. Para mantener conversaciones interactivas en tiempo real con entrada y salida de audio, usa la API de Gemini Live.

Si usas un modelo de Gemini TTS anterior, como gemini-3.1-flash-tts-preview, consulta la guía de migración.

Para probar la generación de voz de un solo interlocutor sin escribir código, abre Gemini 3.8 Flash TTS en Agent Studio:

Prueba Gemini 3.8 TTS en Agent Studio

Modelos compatibles

Modelo Orador único Varios oradores Transmisión Diseño de voz (versión preliminar) Replicación de voz (versión preliminar)
Gemini 3.8 Flash TTS (gemini-3.8-flash-tts)
Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts)
Versión preliminar de TTS de Gemini 3.1 Flash (gemini-3.1-flash-tts-preview)
TTS de Gemini 2.5 Pro (gemini-2.5-pro-tts)
TTS de Gemini 2.5 Flash (gemini-2.5-flash-tts)

Las muestras y funciones de esta página se aplican a los modelos de Gemini 3.8 TTS. Para los modelos anteriores, consulta Gemini-TTS en la documentación de Text-to-Speech deGoogle Cloud .

Cuándo usar cada modelo

Ambos modelos de Gemini 3.8 TTS comparten el mismo esquema de solicitud y formato de instrucciones, por lo que puedes cambiar entre ellos modificando el ID del modelo:

  • Usa Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) cuando la fidelidad acústica, la actuación con matices y el control expresivo sean la máxima prioridad. Es adecuado para el trabajo creativo de nivel de estudio, diálogos complejos con varios interlocutores, etiquetas frecuentes de ráfagas vocales, pronunciaciones difíciles, dialectos regionales o minoritarios y narraciones de formato largo que necesitan una voz y un tono de sala estables.
  • Usa Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) para cargas de trabajo de producción rápidas y rentables. Es el reemplazo recomendado para gemini-3.1-flash-tts-preview y se adapta a la producción por lotes de gran volumen, las cascadas de agentes de voz conversacionales, las funciones de lectura en voz alta, la replicación de voz y el habla cotidiana de un solo interlocutor en los idiomas principales.

Antes de comenzar

  1. Configura un proyecto y habilita la API de Gemini Enterprise.
  2. Configura las credenciales predeterminadas de la aplicación para tu entorno de desarrollo.
  3. Para usar las muestras de Python, instala la versión 2.33.0 o una posterior del SDK de IA generativa de Google:

    pip install --upgrade "google-genai>=2.33.0"
    

Ubicaciones y extremos regionales disponibles

Los modelos de Gemini 3.8 TTS están disponibles en la ubicación global y en las ubicaciones multirregionales us y eu:

Ubicación Parámetro de ubicación Extremo
Global global https://aiplatform.googleapis.com
Estados Unidos (multirregión) us https://aiplatform.us.rep.googleapis.com
Unión Europea (multirregión) eu https://aiplatform.eu.rep.googleapis.com

Para reducir el tiempo hasta el primer audio (TTFA) en las solicitudes de transmisión, usa el extremo multirregional us o eu en lugar del extremo global. El extremo global enruta las solicitudes entre regiones de todo el mundo, lo que puede aumentar la latencia de la red antes de que llegue el primer fragmento de audio.

Para dirigir las solicitudes a un extremo regional, configura location="us" (o location="eu") cuando inicialices el cliente en el SDK o envía solicitudes al nombre de host multirregional correspondiente (https://aiplatform.us.rep.googleapis.com o https://aiplatform.eu.rep.googleapis.com) con la ruta de acceso de ubicación coincidente en la URL de REST:

Python

from google import genai

# Set location to 'us' or 'eu' for multi-region routing (or 'global' for global)
client = genai.Client(
    enterprise=True,
    project="PROJECT_ID",
    location="us",
)

response = client.models.generate_content(
    model="gemini-3.8-flash-tts",
    contents=[{
        "role": "user",
        "parts": [{
            "text": "Have a wonderful day!",
            "speech_metadata": {"style": "cheerful and friendly"},
        }],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {"voice_config": {"voice": "Kore"}},
    },
)

with open("out.wav", "wb") as f:
    f.write(response.candidates[0].content.parts[0].inline_data.data)

REST

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://aiplatform.us.rep.googleapis.com/v1/projects/PROJECT_ID/locations/us/publishers/google/models/gemini-3.8-flash-tts:generateContent \
  -d '{
    "contents": [{
      "role": "user",
      "parts": [{
        "text": "Have a wonderful day!",
        "speechMetadata": {"style": "cheerful and friendly"}
      }]
    }],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "voiceConfig": {"voice": "Kore"}
      }
    }
  }' | jq -r '.candidates[0].content.parts[0].inlineData.data' | base64 --decode > out.wav

TTS de un solo interlocutor

Para convertir texto en audio de un solo interlocutor, pasa la transcripción literal en parts[].text, agrega un estilo opcional a nivel de turno en parts[].speech_metadata y establece la voz en speechConfig.voiceConfig.voice. El campo voice acepta el nombre de una voz precompilada, un ID de voz de la biblioteca de voces extendida o el ID (voice_...) de una voz diseñada o replicada (o una clave voicekey_... sin estado opcional).

De forma predeterminada, las solicitudes unarias devuelven un archivo WAV completo (PCM de 16 bits, 24 kHz, mono), por lo que puedes escribir los bytes de audio directamente en un archivo .wav. En cambio, las solicitudes de transmisión devuelven fragmentos de PCM sin procesar. Para obtener detalles y otras codificaciones, consulta Formatos de salida de audio.

Console

  1. Abre Gemini 3.8 Flash TTS o Gemini 3.8 Flash-Lite TTS en Agent Studio.
  2. En el panel de configuración, elige una Voz precompilada, un Idioma (o mantén Detección automática) y una descripción opcional de Estilo (por ejemplo, cheerful and friendly).
  3. Ingresa la transcripción que se dirá en el cuadro de instrucción y envíala para generar, reproducir o descargar el audio WAV. Haz clic en Obtener código para exportar la solicitud como Python, JavaScript o curl.

Python

from google import genai

client = genai.Client(enterprise=True, project="PROJECT_ID", location="global")

response = client.models.generate_content(
    model="gemini-3.8-flash-tts",
    contents=[{
        "role": "user",
        "parts": [{
            "text": "Have a wonderful day!",
            "speech_metadata": {"style": "cheerful and friendly"},
        }],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {"voice_config": {"voice": "Kore"}},
    },
)

# The SDK has already decoded the base64 audio, so inline_data.data is a
# complete WAV file by default.
with open("out.wav", "wb") as f:
    f.write(response.candidates[0].content.parts[0].inline_data.data)

REST

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.8-flash-tts:generateContent \
  -d '{
    "contents": [{
      "role": "user",
      "parts": [{
        "text": "Have a wonderful day!",
        "speechMetadata": {"style": "cheerful and friendly"}
      }]
    }],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "voiceConfig": {"voice": "Kore"}
      }
    }
  }' | jq -r '.candidates[0].content.parts[0].inlineData.data' | base64 --decode > out.wav

TTS de transmisión de un solo interlocutor

Para recibir audio mientras el modelo aún lo sintetiza, usa el método streamGenerateContent. Las respuestas de transmisión devuelven fragmentos de PCM sin procesar de 16 bits sin encabezado (24 kHz, mono), por lo que puedes pasar cada fragmento a un reproductor, un socket o otra canalización de audio a medida que llega. En el siguiente ejemplo de Python, la función emit_audio representa ese destino.

Para reducir el TTFA, envía solicitudes de transmisión al extremo multirregional us o eu en lugar del extremo global (a menos que tu solicitud use una voz personalizada, que requiere global).

Python

from google import genai

# Use 'us' or 'eu' for lower TTFA on streaming requests (or 'global' for custom voices)
client = genai.Client(enterprise=True, project="PROJECT_ID", location="us")

def emit_audio(pcm: bytes) -> None:
    """Sends a chunk of raw 16-bit PCM audio (24 kHz, mono) downstream."""
    # Replace with your audio destination, such as a player, a WebSocket,
    # or a telephony stream.
    print(f"Received {len(pcm)} bytes of audio")

response_stream = client.models.generate_content_stream(
    model="gemini-3.8-flash-lite-tts",
    contents=[{
        "role": "user",
        "parts": [{
            "text": "Have a wonderful day!",
            "speech_metadata": {"style": "cheerful and friendly"},
        }],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {"voice_config": {"voice": "Kore"}},
    },
)

for chunk in response_stream:
    if not chunk.candidates or not chunk.candidates[0].content:
        continue
    for part in chunk.candidates[0].content.parts or []:
        if part.inline_data and part.inline_data.data:
            emit_audio(part.inline_data.data)

REST

curl -N -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://aiplatform.us.rep.googleapis.com/v1/projects/PROJECT_ID/locations/us/publishers/google/models/gemini-3.8-flash-lite-tts:streamGenerateContent?alt=sse" \
  -d '{
    "contents": [{
      "role": "user",
      "parts": [{
        "text": "Have a wonderful day!",
        "speechMetadata": {"style": "cheerful and friendly"}
      }]
    }],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "voiceConfig": {"voice": "Kore"}
      }
    }
  }' | sed -n 's/^data: //p' \
    | jq -r '.candidates[0].content.parts[0].inlineData.data // empty' \
    | while read -r chunk; do echo "$chunk" | base64 --decode; done > streamed.pcm

El archivo streamed.pcm contiene audio PCM sin procesar de 16 bits a 24 kHz, mono.

TTS con varios interlocutores

Para el diálogo entre dos interlocutores, configura ambos en speechConfig.multiSpeakerVoiceConfig.speakerVoiceConfigs. Luego, pasa cada turno como un part independiente, establece speech_metadata.speaker en cada turno en uno de los nombres de interlocutor configurados y agrega un style opcional a nivel del turno.

Las solicitudes de varios interlocutores requieren exactamente dos interlocutores.

Python

from google import genai

client = genai.Client(enterprise=True, project="PROJECT_ID", location="global")

response = client.models.generate_content(
    model="gemini-3.8-flash-tts",
    contents=[{
        "role": "user",
        "parts": [
            {
                "text": "How's it going today, Jane?",
                "speech_metadata": {"speaker": "Joe", "style": "cheerful and friendly"},
            },
            {
                "text": "Not too bad, how about you? Ready to test these new voices?",
                "speech_metadata": {"speaker": "Jane", "style": "calm and relaxed"},
            },
        ],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {
            "multi_speaker_voice_config": {
                "speaker_voice_configs": [
                    {"speaker": "Joe", "voice_config": {"voice": "Puck"}},
                    {"speaker": "Jane", "voice_config": {"voice": "Kore"}},
                ]
            }
        },
    },
)

with open("dialogue.wav", "wb") as f:
    f.write(response.candidates[0].content.parts[0].inline_data.data)

REST

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.8-flash-tts:generateContent \
  -d '{
    "contents": [{
      "role": "user",
      "parts": [
        {
          "text": "How'\''s it going today, Jane?",
          "speechMetadata": {"speaker": "Joe", "style": "cheerful and friendly"}
        },
        {
          "text": "Not too bad, how about you? Ready to test these new voices?",
          "speechMetadata": {"speaker": "Jane", "style": "calm and relaxed"}
        }
      ]
    }],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "multiSpeakerVoiceConfig": {
          "speakerVoiceConfigs": [
            {"speaker": "Joe", "voiceConfig": {"voice": "Puck"}},
            {"speaker": "Jane", "voiceConfig": {"voice": "Kore"}}
          ]
        }
      }
    }
  }' | jq -r '.candidates[0].content.parts[0].inlineData.data' | base64 --decode > dialogue.wav

TTS de transmisión con varios interlocutores

Las solicitudes de varios interlocutores también admiten la transmisión. Usa la misma solicitud que en TTS de varios interlocutores con el método streamGenerateContent y usa el extremo multirregional us o eu para obtener un TTFA más bajo.

Python

from google import genai

# Use 'us' or 'eu' for lower TTFA on streaming requests
client = genai.Client(enterprise=True, project="PROJECT_ID", location="us")

def emit_audio(pcm: bytes) -> None:
    """Sends a chunk of raw 16-bit PCM audio (24 kHz, mono) downstream."""
    # Replace with your audio destination, such as a player, a WebSocket,
    # or a telephony stream.
    print(f"Received {len(pcm)} bytes of audio")

response_stream = client.models.generate_content_stream(
    model="gemini-3.8-flash-tts",
    contents=[{
        "role": "user",
        "parts": [
            {
                "text": "How's it going today, Jane?",
                "speech_metadata": {"speaker": "Joe", "style": "cheerful and friendly"},
            },
            {
                "text": "Not too bad, how about you? Ready to test these new voices?",
                "speech_metadata": {"speaker": "Jane", "style": "calm and relaxed"},
            },
        ],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {
            "multi_speaker_voice_config": {
                "speaker_voice_configs": [
                    {"speaker": "Joe", "voice_config": {"voice": "Puck"}},
                    {"speaker": "Jane", "voice_config": {"voice": "Kore"}},
                ]
            }
        },
    },
)

for chunk in response_stream:
    if not chunk.candidates or not chunk.candidates[0].content:
        continue
    for part in chunk.candidates[0].content.parts or []:
        if part.inline_data and part.inline_data.data:
            emit_audio(part.inline_data.data)

REST

curl -N -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://aiplatform.us.rep.googleapis.com/v1/projects/PROJECT_ID/locations/us/publishers/google/models/gemini-3.8-flash-tts:streamGenerateContent?alt=sse" \
  -d '{
    "contents": [{
      "role": "user",
      "parts": [
        {
          "text": "How'\''s it going today, Jane?",
          "speechMetadata": {"speaker": "Joe", "style": "cheerful and friendly"}
        },
        {
          "text": "Not too bad, how about you? Ready to test these new voices?",
          "speechMetadata": {"speaker": "Jane", "style": "calm and relaxed"}
        }
      ]
    }],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "multiSpeakerVoiceConfig": {
          "speakerVoiceConfigs": [
            {"speaker": "Joe", "voiceConfig": {"voice": "Puck"}},
            {"speaker": "Jane", "voiceConfig": {"voice": "Kore"}}
          ]
        }
      }
    }
  }' | sed -n 's/^data: //p' \
    | jq -r '.candidates[0].content.parts[0].inlineData.data // empty' \
    | while read -r chunk; do echo "$chunk" | base64 --decode; done > dialogue_streamed.pcm

El archivo dialogue_streamed.pcm contiene audio PCM sin procesar de 16 bits a 24 kHz, mono.

Controla el estilo de voz con metadatos y etiquetas

Los modelos de Gemini 3.8 TTS tratan el campo text como una transcripción literal. Es posible que se lean en voz alta las instrucciones escritas en el texto, como "Say cheerfully: Hello!" o "Speaker 1: Hello!". Para controlar la entrega, divide tus instrucciones por alcance:

  • Presentación sostenida a nivel de turno (speech_metadata.style): Agrega emoción, estilo de presentación, prosodia, ritmo y volumen que se apliquen a un turno completo en speech_metadata.style. Por ejemplo, "style": "whispered urgently", "style": "out of breath" o "style": "warm and enthusiastic".
  • Eventos puntuales (etiquetas intercaladas): Coloca sonidos vocales momentáneos que no sean de voz y pausas dentro de la transcripción entre corchetes angulares. Por ejemplo, "Wait... <short pause> did you hear that? <sigh>" o "Excuse me <cough> as I was saying...".

Para obtener más orientación, consulta la guía de instrucciones.

Opciones de voz

Los modelos de Gemini 3.8 TTS admiten cuatro formas de seleccionar o crear voces:

  1. Voces prediseñadas: 30 voces seleccionadas.
  2. Biblioteca de voces extendida: Más de 2,000 voces predeterminadas seleccionadas en varios idiomas, acentos regionales y personalidades de personajes.
  3. Diseño de voz (versión preliminar): Crea una voz personalizada a partir de una descripción en lenguaje natural con el método create de la API de Voices (client.voices.create() en el SDK de IA generativa de Google o POST https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/global/voices). Establece type en VOICE_TYPE_PROMPTED y store en true. La respuesta devuelve un ID de voice_... almacenado y una muestra de la voz.
  4. Replicación de voz (versión preliminar): Replica la voz de un interlocutor a partir del audio de referencia y de consentimiento con el mismo método create. Establece type como VOICE_TYPE_REPLICATED. Con store: true, la respuesta devuelve un ID de voice_... almacenado. Con store: false, devuelve una clave voicekey_... sin estado.

Límites y TTL de la voz personalizada

Tipo de voz Modo de almacenamiento Administración Vencimiento
Voces almacenadas (voice_..., diseñadas o replicadas) store: true Métodos list, get y delete de la API de Voices 1 año después del último uso
Claves de replicación de voz (voicekey_...) store: false Administrado por tu aplicación. Google no conserva la clave. 7 días después de la creación

Generar voz con una voz almacenada reinicia su período de retención de un año, por lo que una voz que usas con regularidad no vence. Las solicitudes de creación de voces están sujetas a una cuota por proyecto y por minuto. Si lo superas, el método create devolverá un error RESOURCE_EXHAUSTED. Para obtener más información, consulta Cuotas y límites del sistema.

Almacenamiento y retención de datos

Google almacena las entradas que proporcionas cuando creas una voz almacenada, junto con los artefactos de voz derivados de ellas, en asociación con el proyecto deGoogle Cloud que creó la voz.

Cuando creas una voz replicada a partir de la grabación de un interlocutor, se almacena lo siguiente:

  • Audio de referencia: Es la muestra del interlocutor cuya voz se replica.
  • Audio de consentimiento: Es el interlocutor que lee la declaración de consentimiento obligatoria.

Cuando creas una voz diseñada con una descripción de texto de una voz en una instrucción, se almacena lo siguiente:

  • La instrucción de texto que escribiste para describir la voz.
  • El audio de voz generado a partir de esa instrucción, que el modelo usa como referencia para la voz.

Una voz diseñada no tiene audio de consentimiento, ya que se genera a partir de una descripción y no de una grabación de una persona.

Las entradas de voz se almacenan para que tu voz siga funcionando en las actualizaciones del modelo. Los artefactos de voz se vuelven a generar a partir de las entradas almacenadas cuando se actualiza el modelo subyacente. Si no se encuentran entradas almacenadas para una voz, no se pueden volver a generar sus artefactos y la voz deja de funcionar después de una actualización del modelo. Luego, debes volver a crear la voz.

Las entradas almacenadas se usan solo para volver a generar la voz cuando se actualizan los modelos. Se encriptan en reposo y se aíslan en el proyecto que creó la voz.

Período de retención

Las voces y todos los datos almacenados asociados se conservan durante un máximo de un año (365 días) desde la última vez que usaste la voz para sintetizar la voz. El período comienza cuando creas la voz y se restablece cada vez que envías una solicitud de síntesis que usa la voz. Si no se usa una voz durante 365 días, se borrarán la voz, sus entradas almacenadas y sus artefactos derivados.

Borrado por el cliente

Puedes borrar una voz en cualquier momento con el método delete de la API de Voices. Si se borra una voz, se borran sus entradas almacenadas y sus artefactos derivados. Si borras el proyecto de Google Cloud propietario de una voz, también se borrarán las voces, según el proceso estándar de eliminación de proyectos.

Voces prediseñadas

En la siguiente lista, se muestra cada nombre de voz precompilada y su característica:

  • Achernar: Suave
  • Achird: Amigable
  • Algenib: Voz ronca
  • Algieba: Suave
  • Alnilam: Firme
  • Aoede: Breezy
  • Autonoe: Brillante
  • Callirrhoe: Voz tranquila
  • Charon: Informativa
  • Despina: Suave
  • Enceladus: Voz entrecortada
  • Erinome: Borrar
  • Fenrir: Entusiasta
  • Gacrux: Adulta
  • Iapetus: Voz clara
  • Kore: Firme
  • Laomedeia: Alegre
  • Leda: Juvenil
  • Orus: Firme
  • Puck: Alegre
  • Pulcherrima: Voz decidida
  • Rasalgethi: Informativo
  • Sadachbia: Animada
  • Sadaltager: Voz experta
  • Schedar: Par
  • Sulafat: Cálida
  • Umbriel: Despreocupada
  • Vindemiatrix: Voz amable
  • Zephyr: Alegre
  • Zubenelgenubi: Casual

Biblioteca de voces extendida

Además de las 30 voces precompiladas, la biblioteca de voces extendida proporciona más de 2,000 voces predeterminadas seleccionadas en varios idiomas, acentos regionales, personajes y casos de uso, como audiolibros, agentes conversacionales y noticias. Para usar una voz de la biblioteca, pasa su ID en speechConfig.voiceConfig.voice, de la misma manera que pasas un nombre de voz precompilado.

Para explorar la biblioteca, llama al método list de la API de Voices (ListVoices). Se devolverán las voces personalizadas almacenadas en tu proyecto, seguidas de las voces precompiladas y de la biblioteca de voces extendida. Cada voz de la biblioteca incluye su id y metadatos, como language_code, accent, gender, pitch, persona y description. Para limitar los resultados, usa los siguientes filtros:

  • type: Es la fuente de la voz: prebuilt para las voces prediseñadas y de la biblioteca, prompted para las voces diseñadas o replicated para las voces replicadas. Si pasas más de un valor, el método devuelve las voces que coinciden con cualquiera de ellos.
  • search: Es el texto que se debe hacer coincidir, sin distinguir mayúsculas de minúsculas, con el nombre visible y la descripción de cada voz.

En el siguiente ejemplo, se busca en la biblioteca voces de narrador:

Python

from google import genai

client = genai.Client(enterprise=True, project="PROJECT_ID", location="global")

response = client.voices.list(type_=["prebuilt"], search="narrator", page_size=50)
for voice in response.voices or []:
    print(voice.id, voice.language_code, voice.gender, voice.description)

REST

curl -G \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/global/voices \
  --data-urlencode "type=prebuilt" \
  --data-urlencode "search=narrator" \
  --data-urlencode "pageSize=50"

El método list devuelve hasta 50 voces por página. Para obtener la página siguiente, pasa el valor next_page_token de la respuesta como el parámetro page_token.

Formatos de salida de audio

La codificación de audio predeterminada depende del método:

  • Las solicitudes unarias (generateContent) devuelven un archivo WAV completo (audio/wav) con un encabezado RIFF: PCM de 16 bits, 24 kHz, mono.
  • Las solicitudes de transmisión (streamGenerateContent) devuelven fragmentos de PCM sin encabezado de 16 bits little-endian con firma (audio/l16) a 24 kHz, mono.

Para solicitar una codificación diferente, configura generationConfig.responseFormat en un formato de audio. Los modelos de Gemini 3.8 TTS admiten los siguientes valores de mimeType:

Valor mimeType Formato Descripción
AUDIO_WAV (unario predeterminado) WAV (audio/wav) Es un archivo WAV completo con un encabezado RIFF (PCM de 16 bits, 24 kHz, mono).
AUDIO_L16 (predeterminado para la transmisión) PCM lineal (audio/l16) PCM sin encabezado, sin procesar, de 16 bits, con signo y con formato little-endian. Se usa para la transmisión, las canalizaciones de audio personalizadas o la concatenación de clips de varios turnos.
AUDIO_MULAW Ley μ (audio/mulaw) Audio comprimido con la ley μ de G.711 (8 kHz, mono), que se usa de uso frecuente en la telefonía de Norteamérica y Japón.
AUDIO_ALAW Ley A (audio/alaw) Audio comprimido con la ley A de G.711 (8 kHz, mono), que se usa comúnmente en la telefonía europea e internacional.

Los modelos ignoran el campo sampleRate. La salida de PCM lineal y WAV es de 24 kHz, y la salida de μ-law y A-law es de 8 kHz, independientemente de la tasa en la respuesta mimeType. Vuelve a muestrear el resultado en el cliente si tu canalización requiere una tasa de muestreo diferente.

En el siguiente ejemplo, se solicita un resultado de ley μ para una canalización de telefonía. El SDK de IA generativa de Google para Python no expone responseFormat en GenerateContentConfig, por lo que el ejemplo de Python lo pasa en el cuerpo de la solicitud con http_options.extra_body.

Python

from google import genai

client = genai.Client(enterprise=True, project="PROJECT_ID", location="global")

response = client.models.generate_content(
    model="gemini-3.8-flash-tts",
    contents=[{"role": "user", "parts": [{"text": "Have a wonderful day!"}]}],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {"voice_config": {"voice": "Kore"}},
        "http_options": {
            "extra_body": {
                "generationConfig": {
                    "responseFormat": [{"audio": {"mimeType": "AUDIO_MULAW"}}]
                }
            }
        },
    },
)

# The response is headerless μ-law audio at 8 kHz, mono.
with open("out.mulaw", "wb") as f:
    f.write(response.candidates[0].content.parts[0].inline_data.data)

REST

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.8-flash-tts:generateContent \
  -d '{
    "contents": [{"role": "user", "parts": [{"text": "Have a wonderful day!"}]}],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "responseFormat": [{"audio": {"mimeType": "AUDIO_MULAW"}}],
      "speechConfig": {
        "voiceConfig": {"voice": "Kore"}
      }
    }
  }' | jq -r '.candidates[0].content.parts[0].inlineData.data' | base64 --decode > out.mulaw

Lenguajes compatibles

Los modelos de Gemini 3.8 TTS detectan el idioma de entrada automáticamente. Gemini 3.8 Flash TTS admite 130 idiomas y Gemini 3.8 Flash-Lite TTS admite 101 idiomas:

Limitaciones

  • Los modelos de TTS aceptan entradas solo de texto y devuelven salidas solo de audio.
  • Las solicitudes de varios interlocutores requieren exactamente dos interlocutores. Para combinar voces diseñadas (voice_...) o replicadas (voice_... o voicekey_...) en diálogos de varios personajes, o para usar más de dos interlocutores, sintetiza el turno de cada interlocutor de forma individual y concatena el audio. Solicita un resultado AUDIO_L16 para cada turno o quita el encabezado WAV de cada clip antes de concatenarlos.
  • Los modelos están disponibles en las ubicaciones global, us y eu.
  • Las voces personalizadas que pertenecen al usuario (voces creadas con diseño de voz o replicación de voz) solo están disponibles en la ubicación global.
  • No se admiten las instrucciones del sistema.
  • No puedes establecer la tasa de muestreo de salida. No se admiten los resultados en MP3 ni Ogg Opus.

¿Qué sigue?