ה-Gemini Live API מאפשר אינטראקציות דו-כיווניות עם Gemini בטקסט ובקול עם זמן אחזור נמוך. בעזרת Live API, תוכלו לספק למשתמשי הקצה חוויה של שיחות קוליות טבעיות דמויות-אנושיות, עם היכולת להפריע לתשובות של המודל באמצעות פקודות טקסט או קוליות. המודל יכול לעבד קלט של טקסט ואודיו (סרטון בקרוב!), ויכול לספק פלט של טקסט ואודיו.
אפשר ליצור אב טיפוס באמצעות הנחיות והאפשרות Live API בקטע Vertex AI Studio.
Live API הוא ממשק API עם מצב שמייצר חיבור WebSocket כדי ליצור סשן בין הלקוח לבין שרת Gemini. פרטים נוספים זמינים במאמרי העזרה של Live API.
לפני שמתחילים
האפשרות הזו זמינה רק כשמשתמשים ב-Vertex AI Gemini API בתור ספק ה-API. |
אם עדיין לא עשיתם זאת, כדאי לעיין במדריך למתחילים, שבו מוסבר איך מגדירים את פרויקט Firebase, מחברים את האפליקציה ל-Firebase, מוסיפים את ה-SDK, מאתחלים את שירות הקצה העורפי של Vertex AI Gemini API ויוצרים מכונה של LiveModel
.
מודלים שתומכים ביכולת הזו
רק gemini-2.0-flash-live-preview-04-09
תומך ב-Live API (לא gemini-2.0-flash
).
שימוש בתכונות הסטנדרטיות של Live API
בקטע הזה מוסבר איך להשתמש בתכונות הסטנדרטיות של Live API, במיוחד כדי להעביר סטרימינג של סוגים שונים של קלט ופלט:
- איך שולחים ומקבלים הודעות טקסט
- שליחת אודיו וקבלת אודיו
- איך שולחים אודיו ומקבלים טקסט
- איך שולחים הודעות טקסט ומקבלים הודעות אודיו
יצירת טקסט בסטרימינג מקלט טקסט בסטרימינג
לפני שמנסים את הדוגמה הזו, צריך להשלים את הקטע לפני שמתחילים במדריך הזה כדי להגדיר את הפרויקט והאפליקציה. בקטע הזה צריך גם ללחוץ על הלחצן של ספק ה-Gemini API שבחרתם כדי להציג תוכן ספציפי לספק בדף הזה. |
אפשר לשלוח קלט של טקסט בסטרימינג ולקבל פלט של טקסט בסטרימינג. חשוב ליצור מכונה של liveModel
ולהגדיר את response modality לערך Text
.
Swift
עדיין אין תמיכה ב-Live API באפליקציות בפלטפורמת Apple, אבל כדאי לבדוק שוב בקרוב.
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 באפליקציות אינטרנט, אבל כדאי לבדוק שוב בקרוב.
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);
}
}
}
איך בוחרים מודל שמתאים לתרחיש לדוגמה ולסוג האפליקציה שלכם
יצירת אודיו בסטרימינג מקלט אודיו בסטרימינג
לפני שמנסים את הדוגמה הזו, צריך להשלים את הקטע לפני שמתחילים במדריך הזה כדי להגדיר את הפרויקט והאפליקציה. בקטע הזה צריך גם ללחוץ על הלחצן של ספק ה-Gemini API שבחרתם כדי להציג תוכן ספציפי לספק בדף הזה. |
אפשר לשלוח קלט אודיו בסטרימינג ולקבל פלט אודיו בסטרימינג. חשוב ליצור מכונה של LiveModel
ולהגדיר את modality התגובה ל-Audio
.
בהמשך הדף מוסבר איך להגדיר ולהתאים אישית את הקול של התשובה.
Swift
עדיין אין תמיכה ב-Live API באפליקציות בפלטפורמת Apple, אבל כדאי לבדוק שוב בקרוב.
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 באפליקציות אינטרנט, אבל כדאי לבדוק שוב בקרוב.
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++;
}
}
איך בוחרים מודל שמתאים לתרחיש לדוגמה ולסוג האפליקציה שלכם
יצירת חוויות אינטראקטיביות ומעניינות יותר
בקטע הזה נסביר איך ליצור ולנהל תכונות אינטראקטיביות או תכונות שמעוררות יותר עניין ב-Live API.
שינוי הקול של התשובה
ב-Live API נעשה שימוש ב-Chirp 3 כדי לתמוך בתשובות דיבור מסונתזות. כשמשתמשים ב-Firebase AI Logic, אפשר לשלוח אודיו ב-5 קולות HD וב-31 שפות.
אם לא מציינים קול, ברירת המחדל היא Puck
. לחלופין, אפשר להגדיר את המודל להשיב בכל אחד מהקולות הבאים:
Aoede (נקבה)Charon (זכר) |
Fenrir (זכר)Kore (נקבה) |
Puck (זכר) |
כדי לשמוע דמואים של הקולות האלה ולראות את הרשימה המלאה של השפות הזמינות, אפשר לעיין במאמר Chirp 3: קולות HD.
כדי לציין קול, מגדירים את שם הקול באובייקט speechConfig
כחלק מהגדרת המודל:
Swift
עדיין אין תמיכה ב-Live API באפליקציות בפלטפורמת Apple, אבל כדאי לבדוק שוב בקרוב.
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 באפליקציות אינטרנט, אבל כדאי לבדוק שוב בקרוב.
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!
כדי לקבל את התוצאות הטובות ביותר כשאתם מבקשים מהמודל להגיב בשפה שאינה אנגלית, כדאי לכלול את הפרטים הבאים בהוראות המערכת:
RESPOND IN LANGUAGE. YOU MUST RESPOND UNMISTAKABLY IN LANGUAGE.
שמירה על ההקשר בין סשנים ובקשות
אתם יכולים להשתמש במבנה צ'אט כדי לשמור על ההקשר בין סשנים ובקשות. חשוב לדעת: האפשרות הזו פועלת רק עם קלט טקסט ופלט טקסט.
הגישה הזו מתאימה במיוחד להקשרים קצרים. אפשר לשלוח אינטראקציות מפורטות כדי לייצג את רצף האירועים המדויק. בהקשרים ארוכים יותר, מומלץ לספק סיכום של ההודעה כדי לפנות מקום בחלון ההקשר לאינטראקציות הבאות.
טיפול בהפרעות
Firebase AI Logic עדיין לא תומך בטיפול בהפרעות. בדוק שוב בקרוב!
שימוש בקריאה לפונקציות (כלים)
אפשר להגדיר כלים, כמו פונקציות זמינות, לשימוש עם Live API בדיוק כמו שאפשר לעשות עם שיטות היצירה הסטנדרטיות של תוכן. בקטע הזה מתוארים כמה ניואנסים לגבי השימוש ב-Live API עם קריאה לפונקציות. תיאור מלא ודוגמאות לקריאה לפונקציות זמינים במדריך לקריאה לפונקציות.
מהנחיה אחת, המודל יכול ליצור מספר קריאות לפונקציות ואת הקוד הנדרש כדי לשרשר את הפלט שלהן. הקוד הזה מופעל בסביבת חול, ויוצר הודעות BidiGenerateContentToolCall
. הביצועים מושהים עד שהתוצאות של כל קריאה לפונקציה יהיו זמינות, וכך מובטח עיבוד רציף.
בנוסף, השימוש ב-Live API עם קריאה לפונקציה יעיל במיוחד כי המודל יכול לבקש מהמשתמש מידע נוסף או מידע להבהרה. לדוגמה, אם למודל אין מספיק מידע כדי לספק ערך פרמטר לפונקציה שהוא רוצה להפעיל, המודל יכול לבקש מהמשתמש לספק מידע נוסף או מידע מבהיר.
הלקוח צריך להשיב עם BidiGenerateContentToolResponse
.
מגבלות ודרישות
חשוב לזכור את המגבלות והדרישות הבאות של Live API.
תעתיק
Firebase AI Logic עדיין לא תומך בתמלילים. בדוק שוב בקרוב!
שפות
- שפות קלט: כאן מפורטת הרשימה המלאה של שפות הקלט הנתמכות במודלים מסוג Gemini.
- שפות פלט: הרשימה המלאה של שפות הפלט הזמינות מופיעה במאמר Chirp 3: קולות HD
פורמטים של אודיו
הפונקציה Live API תומכת בפורמטים הבאים של קובצי אודיו:
- פורמט קלט האודיו: אודיו PCM גולמי של 16 ביט ב-16kHz little-endian
- פורמט אודיו בפלט: אודיו PCM גולמי של 16 ביט בקצב 24kHz ב-little-endian
הגבלות קצב
חלות עליך מגבלות הקצב הבאות:
- 10 סשנים בו-זמניים לכל פרויקט Firebase
- 4 מיליון טוקנים לדקה
משך הסשן
אורך הסשן שמוגדר כברירת מחדל הוא 30 דקות. כשמשך הסשן חורג מהמגבלה, החיבור מסתיים.
המודל מוגבל גם על ידי גודל ההקשר. שליחת קטעי קלט גדולים עלולה לגרום לסיום מוקדם יותר של הסשן.
זיהוי פעילות קול (VAD)
המודל מבצע זיהוי פעילות קולית (VAD) באופן אוטומטי על מקור קלט אודיו רציף. VAD מופעל כברירת מחדל.
ספירת טוקנים
אי אפשר להשתמש ב-CountTokens
API עם Live API.
שליחת משוב על חוויית השימוש ב-Firebase AI Logic