Interfejs Live API umożliwia interakcje z użyciem głosu i wideo z Gemini w czasie rzeczywistym i z niewielkimi opóźnieniami. Przetwarza ona ciągłe strumienie audio, wideo lub tekstu, aby dostarczać natychmiastowe odpowiedzi w formie mowy, które brzmią jak ludzkie, zapewniając użytkownikom naturalne wrażenia z rozmowy.
Interfejs API na żywo udostępnia kompleksowy zestaw funkcji, takich jak wykrywanie aktywności głosowej, wywoływanie funkcji i narzędzi, zarządzanie sesjami (do zarządzania długotrwałymi rozmowami) oraz tokeny tymczasowe (do bezpiecznej 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ładowymi aplikacjami, które pokazują, jak używać interfejsu Live API w ramach kompleksowych przypadków użycia:
- Aplikacja do tworzenia transmisji na żywo z dźwiękiem w AI Studio, która korzysta z bibliotek JavaScript do łączenia się z Live API i przesyłania dwukierunkowego dźwięku przez mikrofon i głośniki.
- Książka kucharzy Pythona korzystająca z interfejsu Live API za pomocą biblioteki Pyaudio.
Integracje z partnerami
Jeśli wolisz prostszy proces tworzenia, możesz użyć Daily lub LiveKit. Są to platformy partnerów zewnętrznych, które już zintegrowały interfejs Gemini Live API z protokołem WebRTC, aby usprawnić tworzenie aplikacji do przesyłania dźwięku i obrazu w czasie rzeczywistym.
Zanim zaczniesz kompilować
Zanim zaczniesz tworzyć aplikację za pomocą interfejsu Live API, musisz podjąć 2 ważne decyzje: wybrać model i wybrać podejście do implementacji.
Wybieranie architektury generowania dźwięku
Jeśli tworzysz rozwiązanie wykorzystujące dźwięk, wybrany model określa architekturę generowania dźwięku, która służy do tworzenia odpowiedzi audio:
- Natywna ścieżka audio: ta opcja zapewnia najbardziej naturalnie brzmiącą i realistyczną wymowę oraz lepszą wydajność w przypadku treści w wielu językach.
Umożliwia też stosowanie zaawansowanych funkcji, takich jak dialog emocjonalny (zorientowany na emocje), proaktywny dźwięk (gdzie model może zdecydować, czy zignorować lub odpowiedzieć na określone dane wejściowe) oraz „myślenie”.
Dźwięk natywny jest obsługiwany przez te modele dźwięku natywnego:
gemini-2.5-flash-preview-native-audio-dialog
gemini-2.5-flash-exp-native-audio-thinking-dialog
- Dźwięk w trybie półkaskady: ta opcja wykorzystuje architekturę modelu kaskadowego (natywny wejściowy dźwięk i wyjściowa zamiana tekstu na mowę).
Oferuje ona lepszą wydajność i niezawodność w środowiskach produkcyjnych, zwłaszcza w przypadku korzystania z narzędzia. Dźwięk w trybie półkaskadowym jest obsługiwany przez te modele:
gemini-live-2.5-flash-preview
gemini-2.0-flash-live-001
Wybór metody implementacji
Podczas integracji z interfejsem Live API musisz wybrać jeden z tych podejść do implementacji:
- Serwer do serwera: backend łączy się z interfejsem Live API za pomocą WebSockets. Zwykle klient wysyła dane strumienia (dźwięk, obraz, tekst) na serwer, który przekazuje je do interfejsu Live API.
- Klienta do serwera: kod front-endu łączy się bezpośrednio z interfejsem Live API, używając WebSockets do przesyłania strumieniowego danych, omijając backend.
Rozpocznij
W tym przykładzie odczytujemy plik WAV, wysyłamy go w prawidłowym formacie i zapisujemy otrzymane dane jako plik WAV.
Możesz wysyłać dźwięk, konwertując go na 16-bitowy format PCM 16 kHz mono. Możesz też odbierać dźwięk, ustawiając AUDIO
jako tryb odpowiedzi. Wyjście wykorzystuje 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?
- Zapoznaj się z pełnym przewodnikiem Możliwości interfejsu Live API, aby poznać najważniejsze funkcje i konfiguracje, w tym wykrywanie aktywności głosowej i wbudowane funkcje audio.
- Aby dowiedzieć się, jak zintegrować interfejs Live API z narzędziami i wywoływaniem funkcji, przeczytaj przewodnik Używanie narzędzi.
- Aby dowiedzieć się więcej o zarządzaniu długimi rozmowami, przeczytaj przewodnik Zarządzanie sesjami.
- Zapoznaj się z poradnikiem dotyczącym tokenów tymczasowych, aby zapewnić bezpieczne uwierzytelnianie w aplikacji klient-serwer.
- Więcej informacji o interfejsie WebSockets API znajdziesz w dokumentacji WebSockets API.