Get started with Live API

La API de Live permite interacciones de voz y video en tiempo real y de baja latencia con Gemini. Procesa flujos continuos de audio, video o texto para brindar respuestas habladas inmediatas y similares a las humanas, lo que crea una experiencia conversacional natural para tus usuarios.

Descripción general de la API de Live

La API de Live ofrece un conjunto integral de funciones, como la detección de actividad de voz, el uso de herramientas y la llamada a funciones, la administración de sesiones (para administrar conversaciones de larga duración) y los tokens efímeros (para la autenticación segura del lado del cliente).

En esta página, se incluyen ejemplos y muestras de código básicos para que comiences a usar la API.

Aplicaciones de ejemplo

Consulta los siguientes ejemplos de aplicaciones que ilustran cómo usar la API de Live para casos de uso de extremo a extremo:

  • App de inicio de audio en vivo en AI Studio, que usa bibliotecas de JavaScript para conectarse a la API de Live y transmitir audio bidireccional a través del micrófono y los parlantes.
  • Recetario de Python de la API de Live que usa Pyaudio y se conecta a la API de Live

Integraciones a socios

Si prefieres un proceso de desarrollo más simple, puedes usar Daily, LiveKit o Voximplant. Estas son plataformas de socios externos que ya integraron la API de Gemini Live a través del protocolo WebRTC para optimizar el desarrollo de aplicaciones de audio y video en tiempo real.

Antes de comenzar a construir

Antes de comenzar a compilar con la API de Live, debes tomar dos decisiones importantes: elegir un modelo y elegir un enfoque de implementación.

Elige una arquitectura de generación de audio

Si desarrollas un caso de uso basado en audio, tu elección de modelo determinará la arquitectura de generación de audio que se usará para crear la respuesta de audio:

  • Audio nativo: Esta opción proporciona la voz con el sonido más natural y realista, y un mejor rendimiento multilingüe. También habilita funciones avanzadas, como el diálogo afectivo (que reconoce las emociones), el audio proactivo (en el que el modelo puede decidir ignorar o responder a ciertas entradas) y la "reflexión". Los siguientes modelos de audio nativo admiten el audio nativo:
    • gemini-2.5-flash-preview-native-audio-dialog
    • gemini-2.5-flash-exp-native-audio-thinking-dialog
  • Audio de media cascada: Esta opción usa una arquitectura de modelo en cascada (entrada de audio nativa y salida de texto a voz). Ofrece mejor rendimiento y confiabilidad en entornos de producción, en especial con el uso de herramientas. Los siguientes modelos admiten el audio semicascadeado:
    • gemini-live-2.5-flash-preview
    • gemini-2.0-flash-live-001

Elige un enfoque de implementación

Cuando realices la integración con la API de Live, deberás elegir uno de los siguientes enfoques de implementación:

  • De servidor a servidor: Tu backend se conecta a la API de Live con WebSockets. Por lo general, tu cliente envía datos de transmisión (audio, video, texto) a tu servidor, que luego los reenvía a la API de Live.
  • Cliente a servidor: Tu código de frontend se conecta directamente a la API de Live con WebSockets para transmitir datos, lo que omite tu backend.

Comenzar

En este ejemplo, se lee un archivo WAV, se envía en el formato correcto y se guardan los datos recibidos como un archivo WAV.

Puedes enviar audio convirtiéndolo al formato PCM de 16 bits, 16 kHz y mono, y puedes recibir audio configurando AUDIO como modalidad de respuesta. El resultado usa una frecuencia de muestreo de 24 kHz.

Python

# Test file: https://storage.googleapis.com/generativeai-downloads/data/16000.wav
# Install helpers for converting files: pip install librosa soundfile
import asyncio
import io
from pathlib import Path
import wave
from google import genai
from google.genai import types
import soundfile as sf
import librosa

client = genai.Client()

# Half cascade model:
# model = "gemini-live-2.5-flash-preview"

# Native audio output model:
model = "gemini-2.5-flash-preview-native-audio-dialog"

config = {
  "response_modalities": ["AUDIO"],
  "system_instruction": "You are a helpful assistant and answer in a friendly tone.",
}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:

        buffer = io.BytesIO()
        y, sr = librosa.load("sample.wav", sr=16000)
        sf.write(buffer, y, sr, format='RAW', subtype='PCM_16')
        buffer.seek(0)
        audio_bytes = buffer.read()

        # If already in correct format, you can use this:
        # audio_bytes = Path("sample.pcm").read_bytes()

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

        wf = wave.open("audio.wav", "wb")
        wf.setnchannels(1)
        wf.setsampwidth(2)
        wf.setframerate(24000)  # Output is 24kHz

        async for response in session.receive():
            if response.data is not None:
                wf.writeframes(response.data)

            # Un-comment this code to print audio data info
            # if response.server_content.model_turn is not None:
            #      print(response.server_content.model_turn.parts[0].inline_data.mime_type)

        wf.close()

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

JavaScript

// Test file: https://storage.googleapis.com/generativeai-downloads/data/16000.wav
import { GoogleGenAI, Modality } from '@google/genai';
import * as fs from "node:fs";
import pkg from 'wavefile';  // npm install wavefile
const { WaveFile } = pkg;

const ai = new GoogleGenAI({});
// WARNING: Do not use API keys in client-side (browser based) applications
// Consider using Ephemeral Tokens instead
// More information at: https://ai.google.dev/gemini-api/docs/ephemeral-tokens

// Half cascade model:
// const model = "gemini-live-2.5-flash-preview"

// Native audio output model:
const model = "gemini-2.5-flash-preview-native-audio-dialog"

const config = {
  responseModalities: [Modality.AUDIO], 
  systemInstruction: "You are a helpful assistant and answer in a friendly tone."
};

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.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();

    // Combine audio data strings and save as wave file
    const combinedAudio = turns.reduce((acc, turn) => {
        if (turn.data) {
            const buffer = Buffer.from(turn.data, 'base64');
            const intArray = new Int16Array(buffer.buffer, buffer.byteOffset, buffer.byteLength / Int16Array.BYTES_PER_ELEMENT);
            return acc.concat(Array.from(intArray));
        }
        return acc;
    }, []);

    const audioBuffer = new Int16Array(combinedAudio);

    const wf = new WaveFile();
    wf.fromScratch(1, 24000, '16', audioBuffer);  // output is 24kHz
    fs.writeFileSync('audio.wav', wf.toBuffer());

    session.close();
}

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

main();

¿Qué sigue?

  • Lee la guía completa de Capacidades de la API de Live para conocer las capacidades y configuraciones clave, incluidas la detección de actividad de voz y las funciones de audio nativas.
  • Lee la guía de Uso de herramientas para aprender a integrar la API en vivo con herramientas y llamadas a funciones.
  • Lee la guía de Administración de sesiones para administrar conversaciones de larga duración.
  • Lee la guía sobre tokens efímeros para la autenticación segura en aplicaciones cliente-servidor.
  • Para obtener más información sobre la API de WebSockets subyacente, consulta la referencia de la API de WebSockets.