Gemini Live API umożliwia dwukierunkowe interakcje z użyciem tekstu i głosu z urządzeniem Gemini z niewielkim opóźnieniem. Dzięki Live API możesz zapewnić użytkownikom naturalne, ludzkie rozmowy z możliwością przerywania odpowiedzi modelu za pomocą poleceń tekstowych lub głosowych. Model może przetwarzać tekst i dźwięk (wkrótce udostępnimy też opcję wideo) oraz generować tekst i dźwięk.
Prototypy z promptami i polem Live API możesz tworzyć w sekcji Vertex AI Studio.
Interfejs Live API to interfejs API ze stanem, który tworzy połączenie WebSocket, aby ustanowić sesję między klientem a serwerem Gemini. Szczegółowe informacje znajdziesz w dokumentacji referencyjnej Live API.
Zanim zaczniesz
Dostępne tylko wtedy, gdy używasz interfejsu API od firmy Vertex AI Gemini API. |
Jeśli jeszcze tego nie zrobiono, przeczytaj przewodnik dla początkujących, w którym znajdziesz informacje o konfigurowaniu projektu Firebase, łączeniu aplikacji z Firebase, dodawaniu pakietu SDK, inicjowaniu usługi backendowej dla Vertex AI Gemini API oraz tworzeniu instancji LiveModel
.
Modele, które obsługują tę funkcję
Funkcja Live API jest obsługiwana tylko przez gemini-2.0-flash-live-preview-04-09
(nie przez gemini-2.0-flash
).
Korzystanie ze standardowych funkcji usługi Live API
Z tej sekcji dowiesz się, 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 strumieniowego tekstu na podstawie strumieniowego tekstu wejściowego
Zanim użyjesz tego szablonu, zapoznaj się z sekcją Zanim zaczniesz tego przewodnika, aby skonfigurować projekt i aplikację. W tej sekcji kliknij też przycisk wybranegoGemini API dostawcy, aby wyświetlić na tej stronie treści związane z tym dostawcą. |
Możesz wysyłać strumieniowe dane wejściowe tekstowe i otrzymywać strumieniowe dane wyjściowe tekstowe. Utwórz instancję liveModel
i ustaw tryb odpowiedzi na Text
.
Swift
Live API nie jest jeszcze obsługiwany w przypadku aplikacji na platformę Apple, ale wkrótce się to zmieni.
Kotlin
// Initialize the Vertex AI Gemini API backend service
// Create a `LiveModel` instance with the model that supports the Live API
val model = Firebase.vertexAI.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
// Create a `LiveModel` instance with the model that supports the Live API
LiveGenerativeModel lm = FirebaseAI.getInstance(GenerativeBackend.vertexAI()).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 się to zmieni.
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
// Create a `LiveModel` instance with the model that supports the Live API
final model = FirebaseAI.vertexAI().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
// Create a `LiveModel` instance with the model that supports the Live API
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.VertexAI()).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);
}
}
}
Dowiedz się, jak wybrać model odpowiedni do Twojego przypadku użycia i aplikacji.
Generowanie strumieniowego dźwięku z strumieniowego wejścia audio
Zanim użyjesz tego szablonu, zapoznaj się z sekcją Zanim zaczniesz tego przewodnika, aby skonfigurować projekt i aplikację. W tej sekcji kliknij też przycisk wybranegoGemini API dostawcy, aby wyświetlić na tej stronie treści związane z tym dostawcą. |
Możesz wysyłać strumieniowe dane wejściowe audio i odbierać strumieniowe dane wyjściowe audio. Utwórz instancję LiveModel
i ustaw tryb odpowiedzi na Audio
.
Dowiedz się, jak skonfigurować i dostosowywać głos odpowiedzi (poniżej).
Swift
Live API nie jest jeszcze obsługiwany w przypadku aplikacji na platformę Apple, ale wkrótce się to zmieni.
Kotlin
// Initialize the Vertex AI Gemini API backend service
// Create a `LiveModel` instance with the model that supports the Live API
val model = Firebase.vertexAI.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
// Create a `LiveModel` instance with the model that supports the Live API
LiveGenerativeModel lm = FirebaseAI.getInstance(GenerativeBackend.vertexAI()).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 się to zmieni.
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
// Create a `LiveModel` instance with the model that supports the Live API
final model = FirebaseAI.vertexAI().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
// Create a `LiveModel` instance with the model that supports the Live API
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.VertexAI()).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++;
}
}
Dowiedz się, jak wybrać model odpowiedni do Twojego przypadku użycia i aplikacji.
Twórz bardziej angażujące i interaktywne treści
Z tej sekcji dowiesz się, jak tworzyć bardziej angażujące lub interaktywne funkcje Live API i nimi zarządzać.
Zmiana głosu w odpowiedzi
Live API korzysta z Chirp 3 do obsługi odpowiedzi głosowych. Korzystając z Firebase AI Logic, możesz wysyłać dźwięk w 5 głosach HD i 31 językach.
Jeśli nie określisz głosu, zostanie użyty domyślny głos Puck
. Możesz też skonfigurować model tak, aby odpowiadał jednym z tych głosów:
Aoede (kobieta)Charon (mężczyzna) |
Fenrir (mężczyzna)Kore (kobieta) |
Puck (mężczyzna) |
Demo tych głosów i pełną listę dostępnych języków znajdziesz w artykule Chirp 3: Głosy HD.
Aby określić głos, ustaw nazwę głosu w obiekcie speechConfig
w ramach konfiguracji modelu:
Swift
Live API nie jest jeszcze obsługiwany w przypadku aplikacji na platformę Apple, ale wkrótce się to zmieni.
Kotlin
// ...
val model = Firebase.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 = Firebase.getVertexAI().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 się to zmieni.
Dart
// ...
final model = FirebaseVertexAI.instance.liveModel(
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(voice: Voice.fenrir),
),
);
// ...
Unity
Snippets coming soon!
Aby uzyskać najlepsze wyniki, gdy chcesz, aby model odpowiadał w języku innym niż angielski, w ramach instrukcji systemowych podaj te informacje:
RESPOND IN LANGUAGE. YOU MUST RESPOND UNMISTAKABLY IN LANGUAGE.
Zachowanie kontekstu w przypadku sesji i żądań
Strukturę czatu możesz wykorzystać do zachowania kontekstu w różnych sesjach i żądaniach. Pamiętaj, że działa to tylko w przypadku danych wejściowych i wyjściowych tekstowych.
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 podsumowanie w jednym komunikacie, aby zwolnić miejsce w oknie kontekstu na kolejne interakcje.
Zarządzanie powiadomieniami
Firebase AI Logic nie obsługuje jeszcze obsługiwania przerw. Sprawdź jeszcze raz za jakiś czas.
Korzystanie z funkcji dzwonienia (narzędzia)
Podobnie jak w przypadku standardowych metod generowania treści, możesz definiować narzędzia, takie jak dostępne funkcje, do korzystania z interfejsu Live API. W tej sekcji opisano pewne niuanse korzystania z interfejsu Live API do wywoływania funkcji. Pełny opis i przykłady wywoływania funkcji znajdziesz w przewodniku po wywoływaniu funkcji.
Na podstawie jednego prompta model może wygenerować wiele wywołań funkcji i kodu niezbędnego do połączenia ich danych wyjściowych. Ten kod jest wykonywany w środowisku piaskownicy i generuje kolejne wiadomości BidiGenerateContentToolCall
. Wykonanie zostaje wstrzymane do czasu, aż będą dostępne wyniki każdego wywołania funkcji, co zapewnia przetwarzanie sekwencyjne.
Korzystanie z interfejsu Live API z wywołaniem funkcji jest też szczególnie przydatne, ponieważ model może poprosić użytkownika o dodatkowe informacje lub o ich wyjaśnienie. Jeśli na przykład model nie ma wystarczającej ilości informacji, aby podać wartość parametru funkcji, którą chce wywołać, może poprosić użytkownika o dodatkowe informacje lub o ich wyjaśnienie.
Klient powinien odpowiedzieć:
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 w przypadku modeli Gemini.
- Języki wyjściowe:pełną listę dostępnych języków wyjściowych znajdziesz w artykule Chirp 3: głosy w jakości HD.
Formaty audio
Live API obsługuje te formaty audio:
- Format audio wejściowego: surowy 16-bitowy PCM z częstotliwością 16 kHz w formacie little-endian.
- Format wyjściowy dźwięku: surowy 16-bitowy dźwięk PCM z częstotliwością 24 kHz w formacie little-endian
Ograniczenia liczby żądań
Obowiązują te limity szybkości:
- 10 jednoczesnych sesji 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 zakończone.
Model jest też ograniczony rozmiarem kontekstu. Wysyłanie dużych fragmentów danych może spowodować wcześniejsze zakończenie sesji.
wykrywanie aktywności głosowej (VAD);
Model automatycznie wykrywa aktywność głosową (VAD) w ciągłym strumieniu danych wejściowych audio. Domyślnie funkcja VAD jest włączona.
Liczenie tokenów
Nie możesz używać interfejsu API CountTokens
z interfejsem Live API.
Prześlij opinię o swoich wrażeniach związanych z usługą Firebase AI Logic