Get started with Live API

Die Live API ermöglicht latenzarme Sprach- und Videointeraktionen in Echtzeit mit Gemini. Es verarbeitet kontinuierliche Audio-, Video- oder Textstreams, um sofortige, menschenähnliche gesprochene Antworten zu liefern und so eine natürliche Konversationsumgebung für Ihre Nutzer zu schaffen.

Live API – Übersicht

Die Live API bietet eine umfassende Reihe von Funktionen wie Voice Activity Detection (Erkennung von Sprachaktivität), Tool-Nutzung und Funktionsaufrufe, Sitzungsverwaltung (zur Verwaltung von langen Unterhaltungen) und ephemere Tokens (zur sicheren clientseitigen Authentifizierung).

Auf dieser Seite finden Sie Beispiele und grundlegende Codebeispiele, mit denen Sie schnell loslegen können.

Beispielanwendungen

Die folgenden Beispielanwendungen veranschaulichen die Verwendung der Live API für End-to-End-Anwendungsfälle:

  • Starter-App für Live-Audio in AI Studio, in der JavaScript-Bibliotheken verwendet werden, um eine Verbindung zur Live API herzustellen und bidirektionales Audio über Ihr Mikrofon und Ihre Lautsprecher zu streamen.
  • Python-Kochbuch für die Live API mit Pyaudio, das eine Verbindung zur Live API herstellt.

Einbindung in Partnerlösungen

Wenn Sie einen einfacheren Entwicklungsprozess bevorzugen, können Sie Daily, LiveKit oder Voximplant verwenden. Dies sind Partnerplattformen von Drittanbietern, die die Gemini Live API bereits über das WebRTC-Protokoll integriert haben, um die Entwicklung von Audio- und Videoanwendungen in Echtzeit zu optimieren.

Vorbereitung

Bevor Sie mit der Entwicklung mit der Live API beginnen, müssen Sie zwei wichtige Entscheidungen treffen: die Auswahl eines Modells und die Auswahl eines Implementierungsansatzes.

Architektur für die Audiogenerierung auswählen

Wenn Sie einen audiobasierten Anwendungsfall entwickeln, bestimmt die Wahl des Modells die Architektur für die Audiogenerierung, die zum Erstellen der Audioantwort verwendet wird:

  • Native Audio:Diese Option bietet die natürlichste und realistischste Sprachausgabe und eine bessere mehrsprachige Leistung. Außerdem werden erweiterte Funktionen wie affektiver (emotionsbewusster) Dialog, proaktive Audioausgabe (bei der das Modell entscheiden kann, bestimmte Eingaben zu ignorieren oder darauf zu reagieren) und „Denken“ ermöglicht. Die folgenden Modelle für natives Audio unterstützen natives Audio:
    • gemini-2.5-flash-preview-native-audio-dialog
    • gemini-2.5-flash-exp-native-audio-thinking-dialog
  • Halbkaskaden-Audio: Bei dieser Option wird eine kaskadierte Modellarchitektur verwendet (native Audioeingabe und Sprachausgabe). Sie bietet eine bessere Leistung und Zuverlässigkeit in Produktionsumgebungen, insbesondere bei der Tool-Nutzung. Die folgenden Modelle unterstützen die halbkaskadierte Audioausgabe:
    • gemini-live-2.5-flash-preview
    • gemini-2.0-flash-live-001

Einrichtungsansatz auswählen

Bei der Integration mit der Live API müssen Sie einen der folgenden Implementierungsansätze auswählen:

  • Server-zu-Server: Ihr Backend stellt über WebSockets eine Verbindung zur Live API her. Normalerweise sendet Ihr Client Streamdaten (Audio, Video, Text) an Ihren Server, der sie dann an die Live API weiterleitet.
  • Client-zu-Server: Ihr Frontend-Code stellt über WebSockets eine direkte Verbindung zur Live API her, um Daten zu streamen. Ihr Backend wird dabei umgangen.

Jetzt starten

In diesem Beispiel wird eine WAV-Datei gelesen, im richtigen Format gesendet und die empfangenen Daten als WAV-Datei gespeichert.

Sie können Audio senden, indem Sie es in das 16-Bit-PCM-Format (16 kHz, Mono) konvertieren. Sie können Audio empfangen, indem Sie AUDIO als Antwortmodalität festlegen. Die Ausgabe verwendet eine Abtastrate von 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();

Nächste Schritte

  • Im vollständigen Leitfaden zu den Funktionen der Live API findest du wichtige Funktionen und Konfigurationen, darunter die Spracherkennung und native Audiofunktionen.
  • Im Leitfaden zur Tool-Nutzung erfahren Sie, wie Sie die Live API in Tools und Funktionsaufrufe einbinden.
  • Informationen zum Verwalten von Unterhaltungen mit langer Ausführungszeit finden Sie im Leitfaden Sitzungsverwaltung.
  • Lesen Sie den Leitfaden zu Einmal-Tokens für die sichere Authentifizierung in Client-zu-Server-Anwendungen.
  • Weitere Informationen zur zugrunde liegenden WebSockets API finden Sie in der WebSockets API-Referenz.