Live API capabilities guide

Esta es una guía integral que abarca las capacidades y configuraciones disponibles con la API de Live. Consulta la página Comienza a usar la API de Live para obtener una descripción general y un código de muestra para casos de uso comunes.

Antes de comenzar

  • Familiarízate con los conceptos básicos: Si aún no lo hiciste, primero lee la página Comienza a usar la API de Live . En esta guía, se presentan los principios fundamentales de la API de Live, cómo funciona y los diferentes enfoques de implementación.
  • Prueba la API de Live en AI Studio: Es posible que te resulte útil probar la API de Live en Google AI Studio antes de comenzar a compilar. Para usar la API de Live en Google AI Studio, selecciona Stream.

Comparación de modelos

En la siguiente tabla, se resumen las diferencias clave entre los modelos de Gemini 3.1 Flash Live Preview y Gemini 2.5 Flash Live Preview:

Función Versión preliminar de Gemini 3.1 Flash Live Versión preliminar de Gemini 2.5 Flash Live
Pensamiento Usa thinkingLevel para controlar la profundidad del pensamiento con parámetros de configuración como minimal, low, medium y high. El valor predeterminado es minimal para optimizar la latencia más baja. Consulta Niveles y presupuestos de pensamiento. Usa thinkingBudget para establecer la cantidad de tokens de pensamiento. El pensamiento dinámico está habilitado de forma predeterminada. Establece thinkingBudget en 0 para inhabilitar la opción. Consulta Niveles y presupuestos de pensamiento.
Recepción de la respuesta Un solo evento del servidor puede contener varias partes de contenido de forma simultánea (por ejemplo, inlineData y transcripción). Asegúrate de que tu código procese todas las partes de cada evento para no perder contenido. Cada evento del servidor contiene solo una parte del contenido. Las partes se entregan en eventos separados.
Contenido del cliente send_client_content solo se admite para propagar el historial de contexto inicial (requiere configurar initial_history_in_client_content en la configuración de la sesión). Para enviar actualizaciones de texto durante la conversación, usa send_realtime_input en su lugar. send_client_content se admite durante toda la conversación para enviar actualizaciones de contenido incrementales y establecer contexto.
Cobertura de giros La configuración predeterminada es TURN_INCLUDES_AUDIO_ACTIVITY_AND_ALL_VIDEO. El turno del modelo incluye la actividad de audio detectada y todos los fotogramas de video. La configuración predeterminada es TURN_INCLUDES_ONLY_ACTIVITY. El turno del modelo solo incluye la actividad detectada.
VAD personalizado (activity_start/activity_end) Compatible. Inhabilita la VAD automática y envía mensajes activityStart y activityEnd de forma manual para controlar los límites de los turnos. Compatible. Inhabilita la VAD automática y envía mensajes activityStart y activityEnd de forma manual para controlar los límites de los turnos.
Configuración automática del VAD Compatible. Configura parámetros como start_of_speech_sensitivity, end_of_speech_sensitivity, prefix_padding_ms y silence_duration_ms. Compatible. Configura parámetros como start_of_speech_sensitivity, end_of_speech_sensitivity, prefix_padding_ms y silence_duration_ms.
Llamada a función asíncrona (behavior: NON_BLOCKING) No compatible. La llamada a función solo es secuencial. El modelo no comenzará a responder hasta que envíes la respuesta de la herramienta. Compatible. Establece behavior en NON_BLOCKING en una declaración de función para permitir que el modelo siga interactuando mientras se ejecuta la función. Controla cómo el modelo maneja las respuestas con el parámetro scheduling (INTERRUPT, WHEN_IDLE o SILENT).
Audio proactivo No compatible Compatible. Cuando está habilitado, el modelo puede decidir de forma proactiva no responder si el contenido de entrada no es pertinente. Establece proactive_audio en true en la configuración de proactivity (requiere v1alpha).
Diálogo basado en emociones detectadas No compatible Compatible. El modelo adapta el estilo de su respuesta para que coincida con la expresión y el tono de la entrada. Establece enable_affective_dialog en true en la configuración de la sesión (requiere v1alpha).

Para migrar de Gemini 2.5 Flash Live a Gemini 3.1 Flash Live, consulta la guía de migración.

Cómo establecer una conexión

En el siguiente ejemplo, se muestra cómo crear una conexión con una clave de API:

Python

import asyncio
from google import genai

client = genai.Client()

model = "gemini-3.1-flash-live-preview"
config = {"response_modalities": ["AUDIO"]}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        print("Session started")
        # Send content...

if __name__ == "__main__":
    asyncio.run(main())

JavaScript

import { GoogleGenAI, Modality } from '@google/genai';

const ai = new GoogleGenAI({});
const model = 'gemini-3.1-flash-live-preview';
const config = { responseModalities: [Modality.AUDIO] };

async function main() {

  const session = await ai.live.connect({
    model: model,
    callbacks: {
      onopen: function () {
        console.debug('Opened');
      },
      onmessage: function (message) {
        console.debug(message);
      },
      onerror: function (e) {
        console.debug('Error:', e.message);
      },
      onclose: function (e) {
        console.debug('Close:', e.reason);
      },
    },
    config: config,
  });

  console.debug("Session started");
  // Send content...

  session.close();
}

main();

Modalidades de interacción

En las siguientes secciones, se proporcionan ejemplos y contexto de respaldo para las diferentes modalidades de entrada y salida disponibles en la API de Live.

Cómo enviar audio

El audio debe enviarse como datos PCM sin procesar (audio PCM sin procesar de 16 bits, 16 kHz, little-endian).

Python

# Assuming 'chunk' is your raw PCM audio bytes
await session.send_realtime_input(
    audio=types.Blob(
        data=chunk,
        mime_type="audio/pcm;rate=16000"
    )
)

JavaScript

// Assuming 'chunk' is a Buffer of raw PCM audio
session.sendRealtimeInput({
  audio: {
    data: chunk.toString('base64'),
    mimeType: 'audio/pcm;rate=16000'
  }
});

Formatos de audio

Los datos de audio en la API de Live siempre son PCM sin procesar, little-endian y de 16 bits. La salida de audio siempre usa una frecuencia de muestreo de 24 kHz. El audio de entrada es de 16 kHz de forma nativa, pero la API de Live volverá a muestrear si es necesario, por lo que se puede enviar cualquier frecuencia de muestreo. Para transmitir la frecuencia de muestreo del audio de entrada, establece el tipo MIME de cada Blob que contenga audio en un valor como audio/pcm;rate=16000.

Cómo recibir audio

Las respuestas de audio del modelo se reciben como fragmentos de datos.

Python

async for response in session.receive():
    if response.server_content and response.server_content.model_turn:
        for part in response.server_content.model_turn.parts:
            if part.inline_data:
                audio_data = part.inline_data.data
                # Process or play the audio data

JavaScript

// Inside the onmessage callback
const content = response.serverContent;
if (content?.modelTurn?.parts) {
  for (const part of content.modelTurn.parts) {
    if (part.inlineData) {
      const audioData = part.inlineData.data;
      // Process or play audioData (base64 encoded string)
    }
  }
}

Enviando mensaje de texto

El texto se puede enviar con send_realtime_input (Python) o sendRealtimeInput (JavaScript).

Python

await session.send_realtime_input(text="Hello, how are you?")

JavaScript

session.sendRealtimeInput({
  text: 'Hello, how are you?'
});

Enviando video

Los fotogramas de video se envían como imágenes individuales (p.ej., JPEG o PNG) a una velocidad de fotogramas específica (máximo 1 fotograma por segundo).

Python

# Assuming 'frame' is your JPEG-encoded image bytes
await session.send_realtime_input(
    video=types.Blob(
        data=frame,
        mime_type="image/jpeg"
    )
)

JavaScript

// Assuming 'frame' is a Buffer of JPEG-encoded image data
session.sendRealtimeInput({
  video: {
    data: frame.toString('base64'),
    mimeType: 'image/jpeg'
  }
});

Actualizaciones incrementales de contenido

Usa actualizaciones incrementales para enviar entradas de texto, establecer el contexto de la sesión o restablecer el contexto de la sesión. En el caso de contextos breves, puedes enviar interacciones paso a paso para representar la secuencia exacta de eventos:

Python

turns = [
    {"role": "user", "parts": [{"text": "What is the capital of France?"}]},
    {"role": "model", "parts": [{"text": "Paris"}]},
]

await session.send_client_content(turns=turns, turn_complete=False)

turns = [{"role": "user", "parts": [{"text": "What is the capital of Germany?"}]}]

await session.send_client_content(turns=turns, turn_complete=True)

JavaScript

let inputTurns = [
  { "role": "user", "parts": [{ "text": "What is the capital of France?" }] },
  { "role": "model", "parts": [{ "text": "Paris" }] },
]

session.sendClientContent({ turns: inputTurns, turnComplete: false })

inputTurns = [{ "role": "user", "parts": [{ "text": "What is the capital of Germany?" }] }]

session.sendClientContent({ turns: inputTurns, turnComplete: true })

Para contextos más largos, se recomienda proporcionar un solo resumen del mensaje para liberar la ventana de contexto para las interacciones posteriores. Consulta Reanudación de sesión para conocer otro método para cargar el contexto de la sesión.

Transcripción de audio

Además de la respuesta del modelo, también puedes recibir transcripciones de la entrada y la salida de audio.

Para habilitar la transcripción del audio de salida del modelo, envía output_audio_transcription en la configuración. El idioma de la transcripción se infiere de la respuesta del modelo.

Python

import asyncio
from google import genai
from google.genai import types

client = genai.Client()
model = "gemini-3.1-flash-live-preview"

config = {
    "response_modalities": ["AUDIO"],
    "output_audio_transcription": {}
}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        message = "Hello? Gemini are you there?"

        await session.send_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )

        async for response in session.receive():
            if response.server_content.model_turn:
                print("Model turn:", response.server_content.model_turn)
            if response.server_content.output_transcription:
                print("Transcript:", response.server_content.output_transcription.text)

if __name__ == "__main__":
    asyncio.run(main())

JavaScript

import { GoogleGenAI, Modality } from '@google/genai';

const ai = new GoogleGenAI({});
const model = 'gemini-3.1-flash-live-preview';

const config = {
  responseModalities: [Modality.AUDIO],
  outputAudioTranscription: {}
};

async function live() {
  const responseQueue = [];

  async function waitMessage() {
    let done = false;
    let message = undefined;
    while (!done) {
      message = responseQueue.shift();
      if (message) {
        done = true;
      } else {
        await new Promise((resolve) => setTimeout(resolve, 100));
      }
    }
    return message;
  }

  async function handleTurn() {
    const turns = [];
    let done = false;
    while (!done) {
      const message = await waitMessage();
      turns.push(message);
      if (message.serverContent && message.serverContent.turnComplete) {
        done = true;
      }
    }
    return turns;
  }

  const session = await ai.live.connect({
    model: model,
    callbacks: {
      onopen: function () {
        console.debug('Opened');
      },
      onmessage: function (message) {
        responseQueue.push(message);
      },
      onerror: function (e) {
        console.debug('Error:', e.message);
      },
      onclose: function (e) {
        console.debug('Close:', e.reason);
      },
    },
    config: config,
  });

  const inputTurns = 'Hello how are you?';
  session.sendClientContent({ turns: inputTurns });

  const turns = await handleTurn();

  for (const turn of turns) {
    if (turn.serverContent && turn.serverContent.outputTranscription) {
      console.debug('Received output transcription: %s\n', turn.serverContent.outputTranscription.text);
    }
  }

  session.close();
}

async function main() {
  await live().catch((e) => console.error('got error', e));
}

main();

Para habilitar la transcripción del audio de entrada del modelo, envía input_audio_transcription en la configuración de inicio.

Python

import asyncio
from pathlib import Path
from google import genai
from google.genai import types

client = genai.Client()
model = "gemini-3.1-flash-live-preview"

config = {
    "response_modalities": ["AUDIO"],
    "input_audio_transcription": {},
}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        audio_data = Path("16000.pcm").read_bytes()

        await session.send_realtime_input(
            audio=types.Blob(data=audio_data, mime_type='audio/pcm;rate=16000')
        )

        async for msg in session.receive():
            if msg.server_content.input_transcription:
                print('Transcript:', msg.server_content.input_transcription.text)

if __name__ == "__main__":
    asyncio.run(main())

JavaScript

import { GoogleGenAI, Modality } from '@google/genai';
import * as fs from "node:fs";
import pkg from 'wavefile';
const { WaveFile } = pkg;

const ai = new GoogleGenAI({});
const model = 'gemini-3.1-flash-live-preview';

const config = {
  responseModalities: [Modality.AUDIO],
  inputAudioTranscription: {}
};

async function live() {
  const responseQueue = [];

  async function waitMessage() {
    let done = false;
    let message = undefined;
    while (!done) {
      message = responseQueue.shift();
      if (message) {
        done = true;
      } else {
        await new Promise((resolve) => setTimeout(resolve, 100));
      }
    }
    return message;
  }

  async function handleTurn() {
    const turns = [];
    let done = false;
    while (!done) {
      const message = await waitMessage();
      turns.push(message);
      if (message.serverContent && message.serverContent.turnComplete) {
        done = true;
      }
    }
    return turns;
  }

  const session = await ai.live.connect({
    model: model,
    callbacks: {
      onopen: function () {
        console.debug('Opened');
      },
      onmessage: function (message) {
        responseQueue.push(message);
      },
      onerror: function (e) {
        console.debug('Error:', e.message);
      },
      onclose: function (e) {
        console.debug('Close:', e.reason);
      },
    },
    config: config,
  });

  // Send Audio Chunk
  const fileBuffer = fs.readFileSync("16000.wav");

  // Ensure audio conforms to API requirements (16-bit PCM, 16kHz, mono)
  const wav = new WaveFile();
  wav.fromBuffer(fileBuffer);
  wav.toSampleRate(16000);
  wav.toBitDepth("16");
  const base64Audio = wav.toBase64();

  // If already in correct format, you can use this:
  // const fileBuffer = fs.readFileSync("sample.pcm");
  // const base64Audio = Buffer.from(fileBuffer).toString('base64');

  session.sendRealtimeInput(
    {
      audio: {
        data: base64Audio,
        mimeType: "audio/pcm;rate=16000"
      }
    }
  );

  const turns = await handleTurn();
  for (const turn of turns) {
    if (turn.text) {
      console.debug('Received text: %s\n', turn.text);
    }
    else if (turn.data) {
      console.debug('Received inline data: %s\n', turn.data);
    }
    else if (turn.serverContent && turn.serverContent.inputTranscription) {
      console.debug('Received input transcription: %s\n', turn.serverContent.inputTranscription.text);
    }
  }

  session.close();
}

async function main() {
  await live().catch((e) => console.error('got error', e));
}

main();

Cómo cambiar la voz y el idioma

Los modelos de salida de audio nativa admiten cualquiera de las voces disponibles para nuestros modelos de texto a voz (TTS). Puedes escuchar todas las voces en AI Studio.

Para especificar una voz, configura el nombre de la voz dentro del objeto speechConfig como parte de la configuración de la sesión:

Python

config = {
    "response_modalities": ["AUDIO"],
    "speech_config": {
        "voice_config": {"prebuilt_voice_config": {"voice_name": "Kore"}}
    },
}

JavaScript

const config = {
  responseModalities: [Modality.AUDIO],
  speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } }
};

La API de Live admite varios idiomas. Los modelos de salida de audio nativa eligen automáticamente el idioma adecuado y no admiten la configuración explícita del código de idioma.

Capacidades de audio nativas

Nuestros modelos más recientes incluyen salida de audio nativa, que proporciona un habla natural y realista, y un mejor rendimiento multilingüe.

Pensando

Los modelos de Gemini 3.1 usan thinkingLevel para controlar la profundidad del pensamiento, con parámetros de configuración como minimal, low, medium y high. El valor predeterminado es minimal para optimizar la latencia más baja. Los modelos de Gemini 2.5 usan thinkingBudget para establecer la cantidad de tokens de pensamiento. Para obtener más detalles sobre los niveles y los presupuestos, consulta Cómo pensar en los niveles y los presupuestos.

Python

model = "gemini-3.1-flash-live-preview"

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"]
    thinking_config=types.ThinkingConfig(
        thinking_level="low",
    )
)

async with client.aio.live.connect(model=model, config=config) as session:
    # Send audio input and receive audio

JavaScript

const model = 'gemini-3.1-flash-live-preview';
const config = {
  responseModalities: [Modality.AUDIO],
  thinkingConfig: {
    thinkingLevel: 'low',
  },
};

async function main() {

  const session = await ai.live.connect({
    model: model,
    config: config,
    callbacks: ...,
  });

  // Send audio input and receive audio

  session.close();
}

main();

Además, puedes habilitar los resúmenes de pensamientos si configuras includeThoughts como true en tu configuración. Consulta los resúmenes de pensamientos para obtener más información:

Python

model = "gemini-3.1-flash-live-preview"

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"]
    thinking_config=types.ThinkingConfig(
        thinking_level="low",
        include_thoughts=True
    )
)

JavaScript

const model = 'gemini-3.1-flash-live-preview';
const config = {
  responseModalities: [Modality.AUDIO],
  thinkingConfig: {
    thinkingLevel: 'low',
    includeThoughts: true,
  },
};

Diálogo basado en emociones detectadas

Esta función permite que Gemini adapte el estilo de su respuesta al tono y la expresión de entrada.

Para usar el diálogo afectivo, establece la versión de la API en v1alpha y configura enable_affective_dialog en true en el mensaje de configuración:

Python

client = genai.Client(http_options={"api_version": "v1alpha"})

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    enable_affective_dialog=True
)

JavaScript

const ai = new GoogleGenAI({ httpOptions: {"apiVersion": "v1alpha"} });

const config = {
  responseModalities: [Modality.AUDIO],
  enableAffectiveDialog: true
};

Audio proactivo

Cuando esta función está habilitada, Gemini puede decidir de forma proactiva no responder si el contenido no es pertinente.

Para usarla, configura la versión de la API como v1alpha, configura el campo proactivity en el mensaje de configuración y establece proactive_audio como true:

Python

client = genai.Client(http_options={"api_version": "v1alpha"})

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    proactivity={'proactive_audio': True}
)

JavaScript

const ai = new GoogleGenAI({ httpOptions: {"apiVersion": "v1alpha"} });

const config = {
  responseModalities: [Modality.AUDIO],
  proactivity: { proactiveAudio: true }
}

Detección de actividad de voz (VAD)

La detección de actividad de voz (VAD) permite que el modelo reconozca cuando una persona está hablando. Esto es fundamental para crear conversaciones naturales, ya que permite que el usuario interrumpa el modelo en cualquier momento.

Cuando el VAD detecta una interrupción, se cancela y descarta la generación en curso. En el historial de la sesión, solo se conserva la información que ya se envió al cliente. Luego, el servidor envía un mensaje BidiGenerateContentServerContent para informar la interrupción.

Luego, el servidor de Gemini descarta cualquier llamada a función pendiente y envía un mensaje BidiGenerateContentServerContent con los IDs de las llamadas canceladas.

Python

async for response in session.receive():
    if response.server_content.interrupted is True:
        # The generation was interrupted

        # If realtime playback is implemented in your application,
        # you should stop playing audio and clear queued playback here.

JavaScript

const turns = await handleTurn();

for (const turn of turns) {
  if (turn.serverContent && turn.serverContent.interrupted) {
    // The generation was interrupted

    // If realtime playback is implemented in your application,
    // you should stop playing audio and clear queued playback here.
  }
}

VAD automático

De forma predeterminada, el modelo realiza la detección de actividad de voz automáticamente en un flujo de entrada de audio continuo. El VAD se puede configurar con el campo realtimeInputConfig.automaticActivityDetection de la configuración de la instalación.

Cuando el flujo de audio se pausa durante más de un segundo (por ejemplo, porque el usuario apagó el micrófono), se debe enviar un evento audioStreamEnd para vaciar el audio almacenado en caché. El cliente puede reanudar el envío de datos de audio en cualquier momento.

Python

# example audio file to try:
# URL = "https://storage.googleapis.com/generativeai-downloads/data/hello_are_you_there.pcm"
# !wget -q $URL -O sample.pcm
import asyncio
from pathlib import Path
from google import genai
from google.genai import types

client = genai.Client()
model = "gemini-3.1-flash-live-preview"

config = {"response_modalities": ["AUDIO"]}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        audio_bytes = Path("sample.pcm").read_bytes()

        await session.send_realtime_input(
            audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
        )

        # if stream gets paused, send:
        # await session.send_realtime_input(audio_stream_end=True)

        async for response in session.receive():
            if response.text is not None:
                print(response.text)

if __name__ == "__main__":
    asyncio.run(main())

JavaScript

// example audio file to try:
// URL = "https://storage.googleapis.com/generativeai-downloads/data/hello_are_you_there.pcm"
// !wget -q $URL -O sample.pcm
import { GoogleGenAI, Modality } from '@google/genai';
import * as fs from "node:fs";

const ai = new GoogleGenAI({});
const model = 'gemini-3.1-flash-live-preview';
const config = { responseModalities: [Modality.AUDIO] };

async function live() {
  const responseQueue = [];

  async function waitMessage() {
    let done = false;
    let message = undefined;
    while (!done) {
      message = responseQueue.shift();
      if (message) {
        done = true;
      } else {
        await new Promise((resolve) => setTimeout(resolve, 100));
      }
    }
    return message;
  }

  async function handleTurn() {
    const turns = [];
    let done = false;
    while (!done) {
      const message = await waitMessage();
      turns.push(message);
      if (message.serverContent && message.serverContent.turnComplete) {
        done = true;
      }
    }
    return turns;
  }

  const session = await ai.live.connect({
    model: model,
    callbacks: {
      onopen: function () {
        console.debug('Opened');
      },
      onmessage: function (message) {
        responseQueue.push(message);
      },
      onerror: function (e) {
        console.debug('Error:', e.message);
      },
      onclose: function (e) {
        console.debug('Close:', e.reason);
      },
    },
    config: config,
  });

  // Send Audio Chunk
  const fileBuffer = fs.readFileSync("sample.pcm");
  const base64Audio = Buffer.from(fileBuffer).toString('base64');

  session.sendRealtimeInput(
    {
      audio: {
        data: base64Audio,
        mimeType: "audio/pcm;rate=16000"
      }
    }

  );

  // if stream gets paused, send:
  // session.sendRealtimeInput({ audioStreamEnd: true })

  const turns = await handleTurn();
  for (const turn of turns) {
    if (turn.text) {
      console.debug('Received text: %s\n', turn.text);
    }
    else if (turn.data) {
      console.debug('Received inline data: %s\n', turn.data);
    }
  }

  session.close();
}

async function main() {
  await live().catch((e) => console.error('got error', e));
}

main();

Con send_realtime_input, la API responderá al audio automáticamente según el VAD. Si bien send_client_content agrega mensajes al contexto del modelo en orden, send_realtime_input se optimiza para la capacidad de respuesta a expensas del orden determinístico.

Configuración automática del VAD

Para tener más control sobre la actividad del VAD, puedes configurar los siguientes parámetros. Consulta la referencia de la API para obtener más información.

Python

from google.genai import types

config = {
    "response_modalities": ["AUDIO"],
    "realtime_input_config": {
        "automatic_activity_detection": {
            "disabled": False, # default
            "start_of_speech_sensitivity": types.StartSensitivity.START_SENSITIVITY_LOW,
            "end_of_speech_sensitivity": types.EndSensitivity.END_SENSITIVITY_LOW,
            "prefix_padding_ms": 20,
            "silence_duration_ms": 100,
        }
    }
}

JavaScript

import { GoogleGenAI, Modality, StartSensitivity, EndSensitivity } from '@google/genai';

const config = {
  responseModalities: [Modality.AUDIO],
  realtimeInputConfig: {
    automaticActivityDetection: {
      disabled: false, // default
      startOfSpeechSensitivity: StartSensitivity.START_SENSITIVITY_LOW,
      endOfSpeechSensitivity: EndSensitivity.END_SENSITIVITY_LOW,
      prefixPaddingMs: 20,
      silenceDurationMs: 100,
    }
  }
};

Inhabilita la VAD automática

Como alternativa, puedes inhabilitar el VAD automático configurando realtimeInputConfig.automaticActivityDetection.disabled en true en el mensaje de configuración. En esta configuración, el cliente es responsable de detectar el habla del usuario y enviar mensajes de activityStart y activityEnd en los momentos adecuados. No se envía un audioStreamEnd en esta configuración. En cambio, cualquier interrupción de la transmisión se marca con un mensaje activityEnd.

Python

config = {
    "response_modalities": ["AUDIO"],
    "realtime_input_config": {"automatic_activity_detection": {"disabled": True}},
}

async with client.aio.live.connect(model=model, config=config) as session:
    # ...
    await session.send_realtime_input(activity_start=types.ActivityStart())
    await session.send_realtime_input(
        audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
    )
    await session.send_realtime_input(activity_end=types.ActivityEnd())
    # ...

JavaScript

const config = {
  responseModalities: [Modality.AUDIO],
  realtimeInputConfig: {
    automaticActivityDetection: {
      disabled: true,
    }
  }
};

session.sendRealtimeInput({ activityStart: {} })

session.sendRealtimeInput(
  {
    audio: {
      data: base64Audio,
      mimeType: "audio/pcm;rate=16000"
    }
  }

);

session.sendRealtimeInput({ activityEnd: {} })

Recuento de tokens

Puedes encontrar la cantidad total de tokens consumidos en el campo usageMetadata del mensaje del servidor devuelto.

Python

async for message in session.receive():
    # The server will periodically send messages that include UsageMetadata.
    if message.usage_metadata:
        usage = message.usage_metadata
        print(
            f"Used {usage.total_token_count} tokens in total. Response token breakdown:"
        )
        for detail in usage.response_tokens_details:
            match detail:
                case types.ModalityTokenCount(modality=modality, token_count=count):
                    print(f"{modality}: {count}")

JavaScript

const turns = await handleTurn();

for (const turn of turns) {
  if (turn.usageMetadata) {
    console.debug('Used %s tokens in total. Response token breakdown:\n', turn.usageMetadata.totalTokenCount);

    for (const detail of turn.usageMetadata.responseTokensDetails) {
      console.debug('%s\n', detail);
    }
  }
}

Resolución de medios

Puedes especificar la resolución de los medios de entrada configurando el campo mediaResolution como parte de la configuración de la sesión:

Python

from google.genai import types

config = {
    "response_modalities": ["AUDIO"],
    "media_resolution": types.MediaResolution.MEDIA_RESOLUTION_LOW,
}

JavaScript

import { GoogleGenAI, Modality, MediaResolution } from '@google/genai';

const config = {
    responseModalities: [Modality.AUDIO],
    mediaResolution: MediaResolution.MEDIA_RESOLUTION_LOW,
};

Limitaciones

Ten en cuenta las siguientes limitaciones de la API de Live cuando planifiques tu proyecto.

Modalidades de respuesta

Los modelos de audio nativos solo admiten la modalidad de respuesta `AUDIO`. Si necesitas la respuesta del modelo como texto, usa la función transcripción de audio de salida.

Autenticación de clientes

De forma predeterminada, la API de Live solo proporciona autenticación de servidor a servidor. Si implementas tu aplicación de la API de Live con un enfoque de cliente a servidor, debes usar tokens efímeros para mitigar los riesgos de seguridad.

Duración de la sesión

Las sesiones solo de audio se limitan a 15 minutos, y las sesiones de audio y video se limitan a 2 minutos. Sin embargo, puedes configurar diferentes técnicas de administración de sesiones para extensiones ilimitadas en la duración de la sesión.

Ventana de contexto

Una sesión tiene un límite de ventana de contexto de lo siguiente:

  • 128 000 tokens para los modelos de salida de audio nativa
  • 32,000 tokens para otros modelos de la API de Live

Idiomas admitidos

La API de Live admite los siguientes 97 idiomas.

Idioma Código BCP-47 Idioma Código BCP-47
Afrikaans af Letón lv
Akan ak Lituano lt
Albanés sq Macedonio mk
Amárico am Malayo ms
Árabe ar Malayalam ml
Armenio hy Maltés mt
Asamés as Maorí mi
Azerí az Marathi mr
Vasco eu Mongol mn
Bielorruso be Nepalí ne
Bengalí bn Noruego no
Bosnio bs Oriya or
Búlgaro bg Oromo om
Birmano my Pastún ps
Catalán ca Persa fa
Cebuano ceb Polaco pl
Chino zh Portugués pt
Croata hr Punyabí pa
Checo cs Quechua qu
Danés da Rumano ro
Holandés nl Romanche rm
Inglés en Ruso ru
Estonio et Serbio sr
Feroés fo Sindhi sd
Filipino fil Cingalés si
Finlandés fi Eslovaco sk
Francés fr Esloveno sl
Gallego gl Somalí so
Georgiano ka Sesoto meridional st
Alemán de Español es
Griego el Suajili sw
Gujarati gu Sueco sv
Hausa ha Tayiko tg
Hebreo iw Tamil ta
Hindi hi Telugu te
Húngaro hu Tailandés th
Islandés is Setsuana tn
Indonesio id Turco tr
Irlandés ga Turkmeno tk
Italiano it Ucraniano uk
Japonés ja Urdu ur
Canarés kn Uzbeko uz
Kazajo kk Vietnamita vi
Jemer km Galés cy
Kiñarwanda rw Frisón occidental fy
Coreano ko Wólof wo
Kurdo ku Yoruba yo
Kirguís ky Zulú zu
Laosiano lo

¿Qué sigue?