Get started with Live API

Interfejs Live API umożliwia interakcje głosowe i wideo z Gemini w czasie rzeczywistym z niewielkimi opóźnieniami. Przetwarza ciągłe strumienie audio, wideo lub tekstu, aby dostarczać natychmiastowe, podobne do ludzkich odpowiedzi głosowe, tworząc naturalne doświadczenie konwersacyjne dla użytkowników.

Omówienie interfejsu Live API

Live API oferuje kompleksowy zestaw funkcji, takich jak wykrywanie aktywności głosowej, korzystanie z narzędzi i wywoływanie funkcji, zarządzanie sesjami (do zarządzania długotrwałymi rozmowami) i tokeny tymczasowe (do bezpiecznego uwierzytelniania po stronie klienta).

Na tej stronie znajdziesz przykłady i podstawowe fragmenty kodu, które pomogą Ci zacząć.

Przykładowe zastosowania

Zapoznaj się z przykładami aplikacji, które pokazują, jak używać interfejsu Live API w przypadkach użycia typu end-to-end:

  • Aplikacja startowa do transmisji audio na żywo w AI Studio, która korzysta z bibliotek JavaScript do łączenia się z interfejsem Live API i przesyłania dwukierunkowego dźwięku przez mikrofon i głośniki.
  • Przepisy na Pythona dotyczące interfejsu Live API, które korzystają z biblioteki PyAudio i łączą się z interfejsem Live API.

Integracje z partnerami

Jeśli wolisz prostszy proces tworzenia, możesz użyć Daily, LiveKit lub Voximplant. Są to platformy partnerów zewnętrznych, które zintegrowały już interfejs Gemini Live API za pomocą protokołu WebRTC, aby usprawnić tworzenie aplikacji audio i wideo działających w czasie rzeczywistym.

Zanim zaczniesz tworzyć

Zanim zaczniesz korzystać z interfejsu Live API, musisz podjąć 2 ważne decyzje: wybrać model i sposób wdrożenia.

Wybieranie architektury generowania dźwięku

Jeśli tworzysz rozwiązanie oparte na dźwięku, wybór modelu określa architekturę generowania dźwięku używaną do tworzenia odpowiedzi audio:

  • Macierzysty dźwięk: ta opcja zapewnia najbardziej naturalny i realistyczny dźwięk mowy oraz lepszą wydajność w wielu językach. Umożliwia też korzystanie z zaawansowanych funkcji, takich jak dialog oparty na emocjach, proaktywny dźwięk (model może ignorować niektóre dane wejściowe lub na nie odpowiadać) i „myślenie”. Natywny dźwięk jest obsługiwany przez te modele natywnego dźwięku:
    • gemini-2.5-flash-preview-native-audio-dialog
    • gemini-2.5-flash-exp-native-audio-thinking-dialog
  • Dźwięk półkaskadowy: ta opcja wykorzystuje architekturę modelu kaskadowego (natywne wejście audio i wyjście zamiany tekstu na mowę). Zapewnia lepszą wydajność i niezawodność w środowiskach produkcyjnych, zwłaszcza w przypadku korzystania z narzędzi. Półkaskadowy dźwięk jest obsługiwany przez te modele:
    • gemini-live-2.5-flash-preview
    • gemini-2.0-flash-live-001

Wybierz metodę implementacji

Podczas integracji z interfejsem Live API musisz wybrać jedną z tych metod implementacji:

  • Serwer-serwer: backend łączy się z interfejsem Live API za pomocą WebSockets. Zwykle klient wysyła dane strumieniowe (audio, wideo, tekst) na serwer, który następnie przekazuje je do interfejsu Live API.
  • Klient-serwer: kod frontendu łączy się bezpośrednio z interfejsem Live API za pomocą WebSockets, aby przesyłać strumieniowo dane z pominięciem backendu.

Rozpocznij

Ten przykład odczytuje plik WAV, wysyła go w odpowiednim formacie i zapisuje otrzymane dane jako plik WAV.

Możesz wysyłać dźwięk, konwertując go na 16-bitowy format PCM, 16 kHz, mono, a także odbierać dźwięk, ustawiając AUDIO jako tryb odpowiedzi. Dane wyjściowe mają częstotliwość próbkowania 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();

Co dalej?

  • Więcej informacji o najważniejszych funkcjach i konfiguracjach interfejsu Live API, w tym o wykrywaniu aktywności głosowej i natywnych funkcjach audio, znajdziesz w pełnym przewodniku po możliwościach tego interfejsu.
  • Przeczytaj przewodnik Korzystanie z narzędzi, aby dowiedzieć się, jak zintegrować interfejs Live API z narzędziami i wywoływaniem funkcji.
  • Więcej informacji o zarządzaniu długimi rozmowami znajdziesz w przewodniku Zarządzanie sesjami.
  • Przeczytaj przewodnik Tokeny tymczasowe, aby dowiedzieć się, jak bezpiecznie uwierzytelniać aplikacje klient-serwer.
  • Więcej informacji o interfejsie WebSockets API znajdziesz w dokumentacji referencyjnej interfejsu WebSockets API.