Gemini Live API umożliwia dwukierunkowe interakcje z użyciem tekstu i głosu z niewielkimi opóźnieniami dzięki Gemini. Za pomocą Live API możesz zapewnić użytkownikom końcowym naturalne, przypominające rozmowę z człowiekiem konwersacje głosowe z możliwością przerywania odpowiedzi modelu za pomocą poleceń tekstowych lub głosowych. Model może przetwarzać dane wejściowe w postaci tekstu i dźwięku (wideo będzie dostępne wkrótce) oraz generować dane wyjściowe w postaci tekstu i dźwięku.
Możesz tworzyć prototypy za pomocą promptów i Live API w Vertex AI Studio.
Live API to interfejs API z zachowywaniem stanu, który tworzy połączenie WebSocket, aby nawiązać sesję między klientem a serwerem Gemini. Szczegółowe informacje znajdziesz w Live API dokumentacji referencyjnej.
Zanim zaczniesz
Dostępne tylko wtedy, gdy jako dostawcę interfejsu API używasz Vertex AI Gemini API. |
Jeśli jeszcze tego nie zrobisz, zapoznaj się z przewodnikiem dla początkujących, w którym opisujemy, jak skonfigurować projekt Firebase, połączyć aplikację z Firebase, dodać pakiet SDK, zainicjować usługę backendu dla Vertex AI Gemini API i utworzyć instancję LiveModel
.
Modele obsługujące tę funkcję
Wartość Live API jest obsługiwana tylko przez gemini-2.0-flash-live-preview-04-09
(nie przez gemini-2.0-flash
).
Pamiętaj też, że gemini-2.0-flash-live-preview-04-09
jest obsługiwana tylko w us-central1
.
Korzystaj ze standardowych funkcji Live API
W tej sekcji opisujemy, jak korzystać ze standardowych funkcji Live API, w szczególności do przesyłania strumieniowego różnych typów danych wejściowych i wyjściowych:
- Wysyłanie i odbieranie SMS-ów
- Wysyłanie i odbieranie dźwięku
- Wysyłanie dźwięku i odbieranie tekstu
- Wysyłanie tekstu i odbieranie dźwięku
Generowanie przesyłanego strumieniowo tekstu na podstawie przesyłanego strumieniowo tekstu wejściowego
Zanim wypróbujesz ten przykład, zapoznaj się z sekcją Zanim zaczniesz w tym przewodniku, aby skonfigurować projekt i aplikację. W tej sekcji klikniesz też przycisk wybranego dostawcyGemini API, aby na tej stronie wyświetlały się treści dotyczące tego dostawcy. |
Możesz wysyłać strumieniowe dane wejściowe w postaci tekstu i otrzymywać strumieniowe dane wyjściowe w postaci tekstu. Utwórz instancję liveModel
i ustaw rodzaj odpowiedzi na Text
.
Swift
Live API nie jest jeszcze obsługiwany w przypadku aplikacji na platformę Apple. Zajrzyj tu za jakiś czas.
Kotlin
// Initialize the Vertex AI Gemini API backend service
// Set the location to `us-central1` (the flash-live model is only supported in that location)
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
val model = Firebase.ai(backend = GenerativeBackend.vertexAI(location = "us-central1")).liveModel(
modelName = "gemini-2.0-flash-live-preview-04-09",
// Configure the model to respond with text
generationConfig = liveGenerationConfig {
responseModality = ResponseModality.TEXT
}
)
val session = model.connect()
// Provide a text prompt
val text = "tell a short story"
session.send(text)
var outputText = ""
session.receive().collect {
if(it.status == Status.TURN_COMPLETE) {
// Optional: if you don't require to send more requests.
session.stopReceiving();
}
outputText = outputText + it.text
}
// Output received from the server.
println(outputText)
Java
ExecutorService executor = Executors.newFixedThreadPool(1);
// Initialize the Vertex AI Gemini API backend service
// Set the location to `us-central1` (the flash-live model is only supported in that location)
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
LiveGenerativeModel lm = FirebaseAI.getInstance(GenerativeBackend.vertexAI("us-central1")).liveModel(
"gemini-2.0-flash-live-preview-04-09",
// Configure the model to respond with text
new LiveGenerationConfig.Builder()
.setResponseModalities(ResponseModality.TEXT)
.build()
);
LiveModelFutures model = LiveModelFutures.from(lm);
ListenableFuture<LiveSession> sessionFuture = model.connect();
class LiveContentResponseSubscriber implements Subscriber<LiveContentResponse> {
@Override
public void onSubscribe(Subscription s) {
s.request(Long.MAX_VALUE); // Request an unlimited number of items
}
@Override
public void onNext(LiveContentResponse liveContentResponse) {
// Handle the response from the server.
System.out.println(liveContentResponse.getText());
}
@Override
public void onError(Throwable t) {
System.err.println("Error: " + t.getMessage());
}
@Override
public void onComplete() {
System.out.println("Done receiving messages!");
}
}
Futures.addCallback(sessionFuture, new FutureCallback<LiveSession>() {
@Override
public void onSuccess(LiveSession ses) {
LiveSessionFutures session = LiveSessionFutures.from(ses);
// Provide a text prompt
String text = "tell me a short story?";
session.send(text);
Publisher<LiveContentResponse> publisher = session.receive();
publisher.subscribe(new LiveContentResponseSubscriber());
}
@Override
public void onFailure(Throwable t) {
// Handle exceptions
}
}, executor);
Web
Live API nie jest jeszcze obsługiwany w przypadku aplikacji internetowych, ale wkrótce będzie.
Dart
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
late LiveModelSession _session;
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
// Initialize the Vertex AI Gemini API backend service
// Set the location to `us-central1` (the flash-live model is only supported in that location)
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
final model = FirebaseAI.vertexAI(location: 'us-central1').liveModel(
model: 'gemini-2.0-flash-live-preview-04-09',
// Configure the model to respond with text
config: LiveGenerationConfig(responseModalities: [ResponseModality.text]),
);
_session = await model.connect();
// Provide a text prompt
final prompt = Content.text('tell a short story');
await _session.send(input: prompt, turnComplete: true);
// In a separate thread, receive the response
await for (final message in _session.receive()) {
// Process the received message
}
Unity
using Firebase;
using Firebase.AI;
async Task SendTextReceiveText() {
// Initialize the Vertex AI Gemini API backend service
// Set the location to `us-central1` (the flash-live model is only supported in that location)
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.VertexAI(location: "us-central1")).GetLiveModel(
modelName: "gemini-2.0-flash-live-preview-04-09",
// Configure the model to respond with text
liveGenerationConfig: new LiveGenerationConfig(
responseModalities: new[] { ResponseModality.Text })
);
LiveSession session = await model.ConnectAsync();
// Provide a text prompt
var prompt = ModelContent.Text("tell a short story");
await session.SendAsync(content: prompt, turnComplete: true);
// Receive the response
await foreach (var message in session.ReceiveAsync()) {
// Process the received message
if (!string.IsNullOrEmpty(message.Text)) {
UnityEngine.Debug.Log("Received message: " + message.Text);
}
}
}
Generowanie strumieniowanego dźwięku ze strumieniowanych danych wejściowych audio
Zanim wypróbujesz ten przykład, zapoznaj się z sekcją Zanim zaczniesz w tym przewodniku, aby skonfigurować projekt i aplikację. W tej sekcji klikniesz też przycisk wybranego dostawcyGemini API, aby na tej stronie wyświetlały się treści dotyczące tego dostawcy. |
Możesz wysyłać strumieniowane dane wejściowe audio i odbierać strumieniowane dane wyjściowe audio. Pamiętaj, aby utworzyć instancję LiveModel
i ustawić rodzaj odpowiedzi na Audio
.
Dowiedz się, jak skonfigurować i dostosować głos odpowiedzi (poniżej).
Swift
Live API nie jest jeszcze obsługiwany w przypadku aplikacji na platformę Apple. Zajrzyj tu za jakiś czas.
Kotlin
// Initialize the Vertex AI Gemini API backend service
// Set the location to `us-central1` (the flash-live model is only supported in that location)
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
val model = Firebase.ai(backend = GenerativeBackend.vertexAI(location = "us-central1")).liveModel(
modelName = "gemini-2.0-flash-live-preview-04-09",
// Configure the model to respond with text
generationConfig = liveGenerationConfig {
responseModality = ResponseModality.AUDIO
}
)
val session = model.connect()
// This is the recommended way.
// However, you can create your own recorder and handle the stream.
session.startAudioConversation()
Java
ExecutorService executor = Executors.newFixedThreadPool(1);
// Initialize the Vertex AI Gemini API backend service
// Set the location to `us-central1` (the flash-live model is only supported in that location)
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
LiveGenerativeModel lm = FirebaseAI.getInstance(GenerativeBackend.vertexAI("us-central1")).liveModel(
"gemini-2.0-flash-live-preview-04-09",
// Configure the model to respond with text
new LiveGenerationConfig.Builder()
.setResponseModalities(ResponseModality.TEXT)
.build()
);
LiveModelFutures model = LiveModelFutures.from(lm);
ListenableFuture<LiveSession> sessionFuture = model.connect();
Futures.addCallback(sessionFuture, new FutureCallback<LiveSession>() {
@Override
public void onSuccess(LiveSession ses) {
LiveSessionFutures session = LiveSessionFutures.from(ses);
session.startAudioConversation();
}
@Override
public void onFailure(Throwable t) {
// Handle exceptions
}
}, executor);
Web
Live API nie jest jeszcze obsługiwany w przypadku aplikacji internetowych, ale wkrótce będzie.
Dart
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
import 'package:your_audio_recorder_package/your_audio_recorder_package.dart';
late LiveModelSession _session;
final _audioRecorder = YourAudioRecorder();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
// Initialize the Vertex AI Gemini API backend service
// Set the location to `us-central1` (the flash-live model is only supported in that location)
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
final model = FirebaseAI.vertexAI(location: 'us-central1').liveModel(
model: 'gemini-2.0-flash-live-preview-04-09',
// Configure the model to respond with audio
config: LiveGenerationConfig(responseModalities: [ResponseModality.audio]),
);
_session = await model.connect();
final audioRecordStream = _audioRecorder.startRecordingStream();
// Map the Uint8List stream to InlineDataPart stream
final mediaChunkStream = audioRecordStream.map((data) {
return InlineDataPart('audio/pcm', data);
});
await _session.startMediaStream(mediaChunkStream);
// In a separate thread, receive the audio response from the model
await for (final message in _session.receive()) {
// Process the received message
}
Unity
using Firebase;
using Firebase.AI;
async Task SendTextReceiveAudio() {
// Initialize the Vertex AI Gemini API backend service
// Set the location to `us-central1` (the flash-live model is only supported in that location)
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.VertexAI(location: "us-central1")).GetLiveModel(
modelName: "gemini-2.0-flash-live-preview-04-09",
// Configure the model to respond with audio
liveGenerationConfig: new LiveGenerationConfig(
responseModalities: new[] { ResponseModality.Audio })
);
LiveSession session = await model.ConnectAsync();
// Start a coroutine to send audio from the Microphone
var recordingCoroutine = StartCoroutine(SendAudio(session));
// Start receiving the response
await ReceiveAudio(session);
}
IEnumerator SendAudio(LiveSession liveSession) {
string microphoneDeviceName = null;
int recordingFrequency = 16000;
int recordingBufferSeconds = 2;
var recordingClip = Microphone.Start(microphoneDeviceName, true,
recordingBufferSeconds, recordingFrequency);
int lastSamplePosition = 0;
while (true) {
if (!Microphone.IsRecording(microphoneDeviceName)) {
yield break;
}
int currentSamplePosition = Microphone.GetPosition(microphoneDeviceName);
if (currentSamplePosition != lastSamplePosition) {
// The Microphone uses a circular buffer, so we need to check if the
// current position wrapped around to the beginning, and handle it
// accordingly.
int sampleCount;
if (currentSamplePosition > lastSamplePosition) {
sampleCount = currentSamplePosition - lastSamplePosition;
} else {
sampleCount = recordingClip.samples - lastSamplePosition + currentSamplePosition;
}
if (sampleCount > 0) {
// Get the audio chunk
float[] samples = new float[sampleCount];
recordingClip.GetData(samples, lastSamplePosition);
// Send the data, discarding the resulting Task to avoid the warning
_ = liveSession.SendAudioAsync(samples);
lastSamplePosition = currentSamplePosition;
}
}
// Wait for a short delay before reading the next sample from the Microphone
const float MicrophoneReadDelay = 0.5f;
yield return new WaitForSeconds(MicrophoneReadDelay);
}
}
Queue audioBuffer = new();
async Task ReceiveAudio(LiveSession liveSession) {
int sampleRate = 24000;
int channelCount = 1;
// Create a looping AudioClip to fill with the received audio data
int bufferSamples = (int)(sampleRate * channelCount);
AudioClip clip = AudioClip.Create("StreamingPCM", bufferSamples, channelCount,
sampleRate, true, OnAudioRead);
// Attach the clip to an AudioSource and start playing it
AudioSource audioSource = GetComponent();
audioSource.clip = clip;
audioSource.loop = true;
audioSource.Play();
// Start receiving the response
await foreach (var message in liveSession.ReceiveAsync()) {
// Process the received message
foreach (float[] pcmData in message.AudioAsFloat) {
lock (audioBuffer) {
foreach (float sample in pcmData) {
audioBuffer.Enqueue(sample);
}
}
}
}
}
// This method is called by the AudioClip to load audio data.
private void OnAudioRead(float[] data) {
int samplesToProvide = data.Length;
int samplesProvided = 0;
lock(audioBuffer) {
while (samplesProvided < samplesToProvide && audioBuffer.Count > 0) {
data[samplesProvided] = audioBuffer.Dequeue();
samplesProvided++;
}
}
while (samplesProvided < samplesToProvide) {
data[samplesProvided] = 0.0f;
samplesProvided++;
}
}
Tworzenie bardziej angażujących i interaktywnych treści
W tej sekcji opisujemy, jak tworzyć bardziej angażujące lub interaktywne funkcje Live API i nimi zarządzać.
Zmiana głosu odpowiedzi
Live API korzysta z Chirp 3, aby obsługiwać odpowiedzi w postaci mowy syntetyzowanej. Gdy korzystasz z Firebase AI Logic, możesz wysyłać dźwięk w różnych językach w jakości HD. Pełną listę i próbki brzmienia poszczególnych głosów znajdziesz w artykule Chirp 3: głosy HD.
W przypadku Androida obecnie obsługiwanych jest tylko 5 głosów:Aoede
, Charon
, Fenrir
, Kore
i Puck
.
Aby określić głos, ustaw nazwę głosu w obiekcie speechConfig
w ramach konfiguracji modelu.
Jeśli nie określisz głosu, domyślnie używany jest głos Puck
.
Swift
Live API nie jest jeszcze obsługiwany w przypadku aplikacji na platformę Apple. Zajrzyj tu za jakiś czas.
Kotlin
// ...
val model = Firebase.ai(backend = GenerativeBackend.vertexAI()).liveModel(
modelName = "gemini-2.0-flash-live-preview-04-09",
// Configure the model to use a specific voice for its audio response
generationConfig = liveGenerationConfig {
responseModality = ResponseModality.AUDIO
speechConfig = SpeechConfig(voice = Voices.FENRIR)
}
)
// ...
Java
// ...
LiveModel model = FirebaseAI.getInstance(GenerativeBackend.vertexAI()).liveModel(
"gemini-2.0-flash-live-preview-04-09",
// Configure the model to use a specific voice for its audio response
new LiveGenerationConfig.Builder()
.setResponseModalities(ResponseModality.AUDIO)
.setSpeechConfig(new SpeechConfig(Voices.FENRIR))
.build()
);
// ...
Web
Live API nie jest jeszcze obsługiwany w przypadku aplikacji internetowych, ale wkrótce będzie.
Dart
// ...
final model = FirebaseAI.vertexAI().liveGenerativeModel(
model: 'gemini-2.0-flash-live-preview-04-09',
// Configure the model to use a specific voice for its audio response
config: LiveGenerationConfig(
responseModality: ResponseModality.audio,
speechConfig: SpeechConfig(voiceName: 'Fenrir'),
),
);
// ...
Unity
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.VertexAI()).GetLiveModel(
modelName: "gemini-2.0-flash-live-preview-04-09",
liveGenerationConfig: new LiveGenerationConfig(
responseModalities: new[] { ResponseModality.Audio },
speechConfig: SpeechConfig.UsePrebuiltVoice("Fenrir"),
);
Aby uzyskać najlepsze wyniki podczas tworzenia promptów i wymagania od modelu odpowiedzi w języku innym niż angielski, w instrukcjach systemowych uwzględnij te informacje:
RESPOND IN LANGUAGE. YOU MUST RESPOND UNMISTAKABLY IN LANGUAGE.
Zachowywanie kontekstu w sesjach i zapytaniach
Możesz użyć struktury czatu, aby zachować kontekst w sesjach i żądaniach. Pamiętaj, że działa to tylko w przypadku danych wejściowych i wyjściowych w formie tekstu.
To podejście najlepiej sprawdza się w przypadku krótkich kontekstów. Możesz wysyłać interakcje krok po kroku, aby odzwierciedlić dokładną sekwencję zdarzeń. W przypadku dłuższych kontekstów zalecamy podanie podsumowania pojedynczej wiadomości, aby zwolnić okno kontekstu na potrzeby kolejnych interakcji.
Radzenie sobie z przerwami
Firebase AI Logic nie obsługuje jeszcze przerw. Sprawdź jeszcze raz za jakiś czas.
Korzystanie z wywoływania funkcji (narzędzi)
Możesz zdefiniować narzędzia, takie jak dostępne funkcje, do użycia z interfejsem Live API, tak samo jak w przypadku standardowych metod generowania treści. W tej sekcji opisujemy niektóre niuanse związane z używaniem interfejsu Live API z wywoływaniem funkcji. Pełny opis i przykłady wywoływania funkcji znajdziesz w przewodniku po wywoływaniu funkcji.
Na podstawie jednego promptu model może wygenerować wiele wywołań funkcji i kod niezbędny do połączenia ich danych wyjściowych. Ten kod jest wykonywany w środowisku piaskownicy, generując kolejne wiadomości BidiGenerateContentToolCall
. Wykonanie jest wstrzymywane do momentu, gdy dostępne są wyniki każdego wywołania funkcji, co zapewnia sekwencyjne przetwarzanie.
Korzystanie z interfejsu Live API z wywoływaniem funkcji jest szczególnie przydatne, ponieważ model może prosić użytkownika o dodatkowe lub wyjaśniające informacje. Jeśli na przykład model nie ma wystarczających informacji, aby podać wartość parametru funkcji, którą chce wywołać, może poprosić użytkownika o podanie dodatkowych lub wyjaśniających informacji.
Klient powinien odpowiedzieć, wysyłając BidiGenerateContentToolResponse
.
Ograniczenia i wymagania
Pamiętaj o tych ograniczeniach i wymaganiach dotyczących Live API.
Transkrypcja
Firebase AI Logic nie obsługuje jeszcze transkrypcji. Sprawdź jeszcze raz za jakiś czas.
Języki
- Języki wprowadzania: zobacz pełną listę obsługiwanych języków wprowadzania dla modeli Gemini
- Języki wyjściowe: pełną listę dostępnych języków wyjściowych znajdziesz w artykule Chirp 3: głosy HD.
Formaty audio
Live API obsługuje te formaty audio:
- Format dźwięku wejściowego: surowy 16-bitowy dźwięk PCM o częstotliwości 16 kHz w formacie little-endian
- Format wyjściowy dźwięku: surowy 16-bitowy dźwięk PCM o częstotliwości 24 kHz w formacie little-endian
Ograniczenia liczby żądań
Obowiązują te limity:
- 10 sesji równoczesnych na projekt Firebase
- 4 mln tokenów na minutę
Długość sesji
Domyślny czas trwania sesji to 30 minut. Gdy czas trwania sesji przekroczy limit, połączenie zostanie przerwane.
Model jest też ograniczony rozmiarem kontekstu. Wysyłanie dużych porcji danych wejściowych może spowodować wcześniejsze zakończenie sesji.
Wykrywanie aktywności głosowej (VAD)
Model automatycznie przeprowadza wykrywanie aktywności głosowej (VAD) w przypadku ciągłego strumienia wejściowego audio. VAD jest domyślnie włączona.
Liczba tokenów
Nie możesz używać interfejsu CountTokens
API z Live API.
Prześlij opinię o korzystaniu z usługi Firebase AI Logic