Jest to obszerny przewodnik, który zawiera informacje o możliwościach i konfiguracjach dostępnych w ramach interfejsu Live API. Na stronie Pierwsze kroki z interfejsem Live API znajdziesz omówienie i przykładowy kod dla typowych przypadków użycia.
Zanim zaczniesz
- Zapoznaj się z podstawowymi pojęciami: jeśli jeszcze tego nie zrobiono, najpierw przeczytaj stronę Wprowadzenie do interfejsu Live API . Poznasz podstawowe zasady działania interfejsu Live API, jego działanie oraz różnice między poszczególnymi modelami i odpowiadającymi im metodami generowania dźwięku (natywny dźwięk lub półkaskada).
- Wypróbuj interfejs Live API w AI Studio: przed rozpoczęciem tworzenia możesz wypróbować interfejs Live API w Google AI Studio. Aby używać interfejsu Live API w Google AI Studio, wybierz Stream (Strumień).
Nawiązywanie połączenia
Poniższy przykład pokazuje, jak utworzyć połączenie za pomocą klucza interfejsu API:
Python
import asyncio
from google import genai
client = genai.Client()
model = "gemini-live-2.5-flash-preview"
config = {"response_modalities": ["TEXT"]}
async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        print("Session started")
if __name__ == "__main__":
    asyncio.run(main())
JavaScript
import { GoogleGenAI, Modality } from '@google/genai';
const ai = new GoogleGenAI({});
const model = 'gemini-live-2.5-flash-preview';
const config = { responseModalities: [Modality.TEXT] };
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,
  });
  // Send content...
  session.close();
}
main();
Rodzaje interakcji
W kolejnych sekcjach znajdziesz przykłady i kontekst różnych trybów wejścia i wyjścia dostępnych w interfejsie Live API.
Wysyłanie i odbieranie SMS-ów
Oto jak możesz wysyłać i odbierać wiadomości tekstowe:
Python
import asyncio
from google import genai
client = genai.Client()
model = "gemini-live-2.5-flash-preview"
config = {"response_modalities": ["TEXT"]}
async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        message = "Hello, how are you?"
        await session.send_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )
        async for response in session.receive():
            if response.text is not None:
                print(response.text, end="")
if __name__ == "__main__":
    asyncio.run(main())
JavaScript
import { GoogleGenAI, Modality } from '@google/genai';
const ai = new GoogleGenAI({});
const model = 'gemini-live-2.5-flash-preview';
const config = { responseModalities: [Modality.TEXT] };
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.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();
Aktualizacje przyrostowe treści
Używaj aktualizacji przyrostowych, aby wysyłać dane wejściowe w postaci tekstu, ustalać kontekst sesji lub przywracać kontekst sesji. W przypadku krótkich kontekstów możesz wysyłać interakcje krok po kroku, aby odzwierciedlić dokładną sekwencję zdarzeń:
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 })
W przypadku dłuższych kontekstów zalecamy podanie podsumowania pojedynczej wiadomości, aby zwolnić okno kontekstu na potrzeby kolejnych interakcji. Inną metodę wczytywania kontekstu sesji znajdziesz w sekcji Wznawianie sesji.
Wysyłanie i odbieranie dźwięku
Najpopularniejszy przykład audio, czyli audio-to-audio, został omówiony w przewodniku Wprowadzenie.
Oto przykład konwersji dźwięku na tekst, który odczytuje plik WAV, wysyła go w prawidłowym formacie i otrzymuje tekst:
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
from google import genai
from google.genai import types
import soundfile as sf
import librosa
client = genai.Client()
model = "gemini-live-2.5-flash-preview"
config = {"response_modalities": ["TEXT"]}
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")
        )
        async for response in session.receive():
            if response.text is not None:
                print(response.text)
if __name__ == "__main__":
    asyncio.run(main())
JavaScript
// Test file: https://storage.googleapis.com/generativeai-downloads/data/16000.wav
// Install helpers for converting files: npm install wavefile
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-live-2.5-flash-preview';
const config = { responseModalities: [Modality.TEXT] };
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();
  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();
A oto przykład tekstu na audio.
Możesz otrzymywać dźwięk, ustawiając AUDIO jako tryb odpowiedzi. W tym przykładzie
otrzymane dane są zapisywane jako plik WAV:
Python
import asyncio
import wave
from google import genai
client = genai.Client()
model = "gemini-live-2.5-flash-preview"
config = {"response_modalities": ["AUDIO"]}
async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        wf = wave.open("audio.wav", "wb")
        wf.setnchannels(1)
        wf.setsampwidth(2)
        wf.setframerate(24000)
        message = "Hello how are you?"
        await session.send_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )
        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
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-live-2.5-flash-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,
  });
  const inputTurns = 'Hello how are you?';
  session.sendClientContent({ turns: inputTurns });
  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);
  fs.writeFileSync('output.wav', wf.toBuffer());
  session.close();
}
async function main() {
  await live().catch((e) => console.error('got error', e));
}
main();
Formaty audio
Dane audio w interfejsie Live API są zawsze w formacie surowym, little-endian, 16-bitowym PCM. Wyjście audio zawsze korzysta z częstotliwości próbkowania 24 kHz. Dźwięk wejściowy ma natywną częstotliwość próbkowania 16 kHz, ale interfejs Live API w razie potrzeby zmieni częstotliwość próbkowania, więc można wysłać dowolną częstotliwość próbkowania. Aby przekazać częstotliwość próbkowania dźwięku wejściowego, ustaw typ MIME każdego obiektu Blob zawierającego dźwięk na wartość taką jak audio/pcm;rate=16000.
Zapisy tekstowe
Możesz włączyć transkrypcję wyjścia audio modelu, wysyłając w konfiguracji ustawień wartość output_audio_transcription. Język transkrypcji jest wywnioskowany z odpowiedzi modelu.
Python
import asyncio
from google import genai
from google.genai import types
client = genai.Client()
model = "gemini-live-2.5-flash-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-live-2.5-flash-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();
Transkrypcję danych wejściowych audio możesz włączyć, wysyłając input_audio_transcription w konfiguracji.
Python
import asyncio
from pathlib import Path
from google import genai
from google.genai import types
client = genai.Client()
model = "gemini-live-2.5-flash-preview"
config = {
    "response_modalities": ["TEXT"],
    "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-live-2.5-flash-preview';
const config = {
  responseModalities: [Modality.TEXT],
  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.serverContent && turn.serverContent.outputTranscription) {
      console.log("Transcription")
      console.log(turn.serverContent.outputTranscription.text);
    }
  }
  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();
Przesyłanie strumieniowe audio i wideo
Zmienianie głosu i języka
Każdy model interfejsu Live API obsługuje inny zestaw głosów. Półkaskadowe wsparcie obejmuje Puck, Charon, Kore, Fenrir, Aoede, Leda, Orus i Zephyr. Natywne audio obsługuje znacznie dłuższą listę (identyczną z listą modeli TTS). Wszystkie głosy możesz odsłuchać w AI Studio.
Aby określić głos, ustaw nazwę głosu w obiekcie speechConfig w ramach konfiguracji sesji:
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" } } }
};
Interfejs Live API obsługuje wiele języków.
Aby zmienić język, ustaw kod języka w obiekcie speechConfig w ramach konfiguracji sesji:
Python
config = {
    "response_modalities": ["AUDIO"],
    "speech_config": {
        "language_code": "de-DE"
    }
}
JavaScript
const config = {
  responseModalities: [Modality.AUDIO],
  speechConfig: { languageCode: "de-DE" }
};
Funkcje natywnego dźwięku
Poniższe funkcje są dostępne tylko w przypadku natywnego dźwięku. Więcej informacji o natywnym dźwięku znajdziesz w artykule Wybieranie modelu i generowanie dźwięku.
Jak korzystać z natywnego wyjścia audio
Aby używać natywnego wyjścia audio, skonfiguruj jeden z natywnych modeli audio i ustaw response_modalities na AUDIO.
Pełny przykład znajdziesz w artykule Wysyłanie i odbieranie dźwięku.
Python
model = "gemini-2.5-flash-native-audio-preview-09-2025"
config = types.LiveConnectConfig(response_modalities=["AUDIO"])
async with client.aio.live.connect(model=model, config=config) as session:
    # Send audio input and receive audio
JavaScript
const model = 'gemini-2.5-flash-native-audio-preview-09-2025';
const config = { responseModalities: [Modality.AUDIO] };
async function main() {
  const session = await ai.live.connect({
    model: model,
    config: config,
    callbacks: ...,
  });
  // Send audio input and receive audio
  session.close();
}
main();
Afektywny dialog
Ta funkcja umożliwia Gemini dostosowywanie stylu odpowiedzi do ekspresji i tonu rozmówcy.
Aby używać dialogu afektywnego, ustaw wersję interfejsu API na v1alpha i w wiadomości konfiguracyjnej ustaw enable_affective_dialog na true:
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
};
Pamiętaj, że dialog afektywny jest obecnie obsługiwany tylko przez modele wyjściowe dźwięku natywnego.
Proaktywny dźwięk
Gdy ta funkcja jest włączona, Gemini może z wyprzedzeniem zdecydować, że nie będzie odpowiadać, jeśli treść nie jest istotna.
Aby go użyć, ustaw wersję interfejsu API na v1alpha i skonfiguruj pole proactivity w wiadomości konfiguracyjnej oraz ustaw proactive_audio na 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 }
}
Pamiętaj, że proaktywny dźwięk jest obecnie obsługiwany tylko przez modele natywnego wyjścia audio.
Myślenie
Najnowszy model natywnego wyjścia audio gemini-2.5-flash-native-audio-preview-09-2025
obsługuje funkcje myślenia, a dynamiczne myślenie jest domyślnie włączone.
Parametr thinkingBudget określa liczbę tokenów myślenia, których model ma użyć podczas generowania odpowiedzi. Możesz wyłączyć myślenie, ustawiając parametr
thinkingBudget na 0. Więcej informacji o szczegółach konfiguracji thinkingBudget modelu znajdziesz w dokumentacji budżetów na myślenie.
Python
model = "gemini-2.5-flash-native-audio-preview-09-2025"
config = types.LiveConnectConfig(
    response_modalities=["AUDIO"]
    thinking_config=types.ThinkingConfig(
        thinking_budget=1024,
    )
)
async with client.aio.live.connect(model=model, config=config) as session:
    # Send audio input and receive audio
JavaScript
const model = 'gemini-2.5-flash-native-audio-preview-09-2025';
const config = {
  responseModalities: [Modality.AUDIO],
  thinkingConfig: {
    thinkingBudget: 1024,
  },
};
async function main() {
  const session = await ai.live.connect({
    model: model,
    config: config,
    callbacks: ...,
  });
  // Send audio input and receive audio
  session.close();
}
main();
Możesz też włączyć podsumowania myśli, ustawiając w konfiguracji wartość includeThoughts na true. Więcej informacji znajdziesz w sekcji podsumowania myśli:
Python
model = "gemini-2.5-flash-native-audio-preview-09-2025"
config = types.LiveConnectConfig(
    response_modalities=["AUDIO"]
    thinking_config=types.ThinkingConfig(
        thinking_budget=1024,
        include_thoughts=True
    )
)
JavaScript
const model = 'gemini-2.5-flash-native-audio-preview-09-2025';
const config = {
  responseModalities: [Modality.AUDIO],
  thinkingConfig: {
    thinkingBudget: 1024,
    includeThoughts: true,
  },
};
Wykrywanie aktywności głosowej (VAD)
Wykrywanie aktywności głosowej (VAD) umożliwia modelowi rozpoznawanie, kiedy ktoś mówi. Jest to niezbędne do prowadzenia naturalnych rozmów, ponieważ umożliwia użytkownikowi przerwanie modelu w dowolnym momencie.
Gdy VAD wykryje przerwę, bieżące generowanie jest anulowane i odrzucane. W historii sesji zachowywane są tylko informacje, które zostały już wysłane do klienta. Serwer wysyła wtedy wiadomość BidiGenerateContentServerContent, aby zgłosić przerwę.
Serwer Gemini odrzuca następnie wszystkie oczekujące wywołania funkcji i wysyła wiadomość BidiGenerateContentServerContent z identyfikatorami anulowanych wywołań.
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.
  }
}
Automatyczne wykrywanie głosu
Domyślnie model automatycznie wykonuje VAD na ciągłym strumieniu wejściowym audio. VAD można skonfigurować za pomocą pola realtimeInputConfig.automaticActivityDetection w konfiguracji.
Gdy strumień audio zostanie wstrzymany na dłużej niż sekundę (np. z powodu wyłączenia mikrofonu przez użytkownika), należy wysłać zdarzenie audioStreamEnd, aby wyczyścić pamięć podręczną dźwięku. Klient może w dowolnym momencie wznowić wysyłanie danych audio.
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-live-2.5-flash-preview"
config = {"response_modalities": ["TEXT"]}
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-live-2.5-flash-preview';
const config = { responseModalities: [Modality.TEXT] };
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();
W przypadku send_realtime_input interfejs API będzie automatycznie odpowiadać na dźwięk na podstawie VAD. Funkcja send_client_content dodaje wiadomości do kontekstu modelu w określonej kolejności, a send_realtime_input jest zoptymalizowana pod kątem szybkości reakcji kosztem deterministycznej kolejności.
Automatyczna konfiguracja VAD
Aby mieć większą kontrolę nad aktywnością VAD, możesz skonfigurować te parametry: Więcej informacji znajdziesz w dokumentacji interfejsu API.
Python
from google.genai import types
config = {
    "response_modalities": ["TEXT"],
    "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.TEXT],
  realtimeInputConfig: {
    automaticActivityDetection: {
      disabled: false, // default
      startOfSpeechSensitivity: StartSensitivity.START_SENSITIVITY_LOW,
      endOfSpeechSensitivity: EndSensitivity.END_SENSITIVITY_LOW,
      prefixPaddingMs: 20,
      silenceDurationMs: 100,
    }
  }
};
Wyłączanie automatycznego wykrywania aktywności głosowej
Automatyczne wykrywanie głosu można też wyłączyć, ustawiając wartość realtimeInputConfig.automaticActivityDetection.disabled na true w wiadomości konfiguracyjnej. W tej konfiguracji klient odpowiada za wykrywanie mowy użytkownika i wysyłanie wiadomości activityStart i activityEnd we właściwym czasie. W tej konfiguracji nie jest wysyłany audioStreamEnd. Zamiast tego każda przerwa w strumieniu jest oznaczana komunikatem activityEnd.
Python
config = {
    "response_modalities": ["TEXT"],
    "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.TEXT],
  realtimeInputConfig: {
    automaticActivityDetection: {
      disabled: true,
    }
  }
};
session.sendRealtimeInput({ activityStart: {} })
session.sendRealtimeInput(
  {
    audio: {
      data: base64Audio,
      mimeType: "audio/pcm;rate=16000"
    }
  }
);
session.sendRealtimeInput({ activityEnd: {} })
Liczba tokenów
Łączną liczbę wykorzystanych tokenów znajdziesz w polu usageMetadata zwróconej wiadomości serwera.
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);
    }
  }
}
Rozdzielczość multimediów
Możesz określić rozdzielczość multimediów wejściowych, ustawiając pole mediaResolution w ramach konfiguracji sesji:
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.TEXT],
    mediaResolution: MediaResolution.MEDIA_RESOLUTION_LOW,
};
Ograniczenia
Podczas planowania projektu weź pod uwagę te ograniczenia interfejsu Live API:
Rodzaje odpowiedzi
W konfiguracji sesji możesz ustawić tylko 1 rodzaj odpowiedzi (TEXT lub AUDIO) na sesję. Ustawienie obu tych wartości spowoduje wyświetlenie komunikatu o błędzie konfiguracji. Oznacza to, że możesz skonfigurować model tak, aby odpowiadał tekstem lub dźwiękiem, ale nie w obu tych formach w ramach tej samej sesji.
Uwierzytelnianie klienta
Interfejs Live API domyślnie zapewnia tylko uwierzytelnianie serwer-serwer. Jeśli implementujesz aplikację Live API, korzystając z podejścia klient-serwer, musisz używać tokenów tymczasowych, aby ograniczyć ryzyko związane z bezpieczeństwem.
Czas trwania sesji
Sesje tylko audio są ograniczone do 15 minut, a sesje audio i wideo – do 2 minut. Możesz jednak skonfigurować różne techniki zarządzania sesją, aby nieograniczenie wydłużać czas trwania sesji.
Okno kontekstu
Sesja ma limit okna kontekstu wynoszący:
- 128 tys. tokenów w przypadku modeli natywnego wyjścia audio
- 32 tys. tokenów w przypadku innych modeli Live API
Obsługiwane języki
Interfejs Live API obsługuje te języki:
| Język | Kod BCP-47 | Język | Kod BCP-47 | 
|---|---|---|---|
| niemiecki (Niemcy) | de-DE | angielski (Australia)*, | en-AU | 
| angielski (Wielka Brytania)*, | en-GB | angielski (Indie) | en-IN | 
| angielski (USA) | en-US | hiszpański (USA) | es-US | 
| francuski (Francja) | fr-FR | hindi (Indie) | hi-IN | 
| portugalski (Brazylia) | pt-BR | arabski (ogólny) | ar-XA | 
| hiszpański (Hiszpania)*, | es-ES | francuski (Kanada)*, | fr-CA | 
| indonezyjski (Indonezja) | id-ID | włoski (Włochy) | it-IT | 
| japoński (Japonia) | ja-JP | turecki (Turcja) | tr-TR | 
| wietnamski (Wietnam) | vi-VN | bengalski (Indie) | bn-IN | 
| gudżarati (Indie)*, | gu-IN | kannada (Indie)*, | kn-IN | 
| marathi (Indie) | mr-IN | malajalam (Indie)*, | ml-IN | 
| tamilski (Indie) | ta-IN | telugu (Indie) | te-IN | 
| niderlandzki (Holandia) | nl-NL | koreański (Korea Południowa) | ko-KR | 
| chiński mandaryński (Chiny)*, | cmn-CN | polski (Polska) | pl-PL | 
| rosyjski (Rosja) | ru-RU | tajski (Tajlandia) | th-TH | 
Języki oznaczone gwiazdką (*) nie są dostępne w przypadku natywnego dźwięku.
Co dalej?
- Przeczytaj przewodniki Korzystanie z narzędzi i Zarządzanie sesjami, aby uzyskać najważniejsze informacje o skutecznym korzystaniu z interfejsu Live API.
- Wypróbuj interfejs Live API w Google AI Studio.
- Więcej informacji o modelach Live API znajdziesz na stronie Modele w sekcjach Gemini 2.0 Flash Live i Gemini 2.5 Flash Native Audio.
- Więcej przykładów znajdziesz w książce kucharskiej Live API, książce kucharskiej narzędzi Live API i skrypcie Live API Get Started.