Get started with Live API

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

Live API – Übersicht

Die Live API bietet eine umfassende Palette von Funktionen für die Entwicklung von Echtzeit-KI-Anwendungen, darunter:

Auf dieser Seite finden Sie Codebeispiele für die Audio-zu-Audio-Umwandlung und Beispielanwendungen für funktionierende Prototypen. Weitere Informationen finden Sie im umfassenden Leitfaden zu Funktionen.

Beispielanwendungen

In den folgenden Beispielanwendungen wird veranschaulicht, wie die Live API für End-to-End-Anwendungsfälle verwendet wird:

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

Einbindung in Partnerlösungen

Alternativ kannst du auch Drittanbieterplattformen verwenden, die die Gemini Live API bereits integriert haben. Diese Partner arbeiten über das WebRTC-Protokoll und können die Entwicklung von Echtzeit-Sprach- und Videoanwendungen vereinfachen.

Sie können Folgendes verwenden:

Informationen zu Partnerintegrationen finden Sie in der jeweiligen Entwicklerdokumentation.

Bevor Sie mit dem Erstellen beginnen

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

Modell auswählen

Wenn Sie einen audiobasierten Anwendungsfall entwickeln, bestimmt Ihre Modellauswahl die Architektur zur Audiogenerierung, die für die Erstellung der Audioantwort verwendet wird:

  • Native Audio mit Gemini 2.5 Flash: Mit dieser Option erhalten Sie die natürlichste und realistischste Sprache sowie eine bessere mehrsprachige Leistung. Außerdem ermöglicht es erweiterte Funktionen wie affektive (empathiefähige) Dialoge, proaktive Audioausgabe (bei der das Modell entscheiden kann, bestimmte Eingaben zu ignorieren oder darauf zu reagieren) und „Denken“. Native Audio wird von den folgenden Modellen für native Audioinhalte unterstützt:
    • gemini-2.5-flash-preview-native-audio-dialog
    • gemini-2.5-flash-exp-native-audio-thinking-dialog
  • Halbkaskaden-Audio mit Gemini 2.0 Flash: Bei dieser Option, die mit dem Modell gemini-2.0-flash-live-001 verfügbar ist, wird eine kaskadierte Modellarchitektur (nativer Audioeingang und Text-zu-Sprache-Ausgabe) verwendet. Sie bietet eine bessere Leistung und Zuverlässigkeit in Produktionsumgebungen, insbesondere bei der Verwendung von Tools.

Implementierungsansatz auswählen

Bei der Einbindung in die Live API musst du einen der folgenden Implementierungsansätze auswählen:

  • Server-zu-Server: Dein Backend stellt über WebSockets eine Verbindung zur Live API her. Normalerweise sendet dein Client Streamdaten (Audio, Video, Text) an deinen Server, der sie dann an die Live API weiterleitet.
  • Client-zu-Server: Dein Frontend-Code stellt über WebSockets eine direkte Verbindung zur Live API her, um Daten zu streamen, ohne dein Backend zu nutzen.

Jetzt starten

Die folgenden Beispiele enthalten vollständigen Code für gängige Anwendungsfälle. Sie zeigen, wie Sie eine Verbindung mit einem API-Schlüssel herstellen und das Verhalten des Modells mithilfe von Systemanweisungen steuern.

Im Leitfaden zu den Live API-Funktionen finden Sie eine umfassende Liste der verfügbaren Funktionen und Konfigurationen.

Audio senden und empfangen

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 Monoformat 16-Bit PCM, 16 kHz umwandeln. 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(api_key="GEMINI_API_KEY")

# Half cascade model:
# model = "gemini-2.0-flash-live-001"

# 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({ apiKey: "GEMINI_API_KEY" });

// Half cascade model:
// const model = "gemini-2.0-flash-live-001"

// 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