Gemini Live API, Gemini ile düşük gecikmeli çift yönlü metin ve ses etkileşimlerine olanak tanır. Live API kullanarak son kullanıcılara, metin veya sesli komutlarla modelin yanıtlarını kesme olanağı sunan doğal ve insan benzeri sesli sohbet deneyimi sağlayabilirsiniz. Model, metin ve ses girişini işleyebilir (video desteği yakında!) ve metin ve ses çıkışı sağlayabilir.
Google AI Studio veya Vertex AI Studio içinde istemler ve Live API ile prototip oluşturabilirsiniz.
Live API, istemci ile Gemini sunucusu arasında oturum oluşturmak için WebSocket bağlantısı oluşturan durum bilgisi olan bir API'dir. Ayrıntılar için Live API referans belgelerine (Gemini Developer API | Vertex AI Gemini API) bakın.
Başlamadan önce
Bu sayfada sağlayıcıya özel içerikleri ve kodu görüntülemek için Gemini API sağlayıcınızı tıklayın. |
Henüz yapmadıysanız Firebase projenizi ayarlama, uygulamanızı Firebase'e bağlama, SDK'yı ekleme, seçtiğiniz Gemini API sağlayıcısı için arka uç hizmetini başlatma ve LiveModel
örneği oluşturma işlemlerinin nasıl yapılacağını açıklayan başlangıç kılavuzunu tamamlayın.
Bu özelliği destekleyen modeller
Live API özelliğini destekleyen modeller, seçtiğiniz Gemini API sağlayıcıya bağlıdır.
API sağlayıcıdan bağımsız olarak gemini-2.0-flash
ve gemini-2.5-flash
modellerinin Live API'yi desteklemediğini unutmayın.
Gemini Developer API
gemini-live-2.5-flash
(özel GA*)gemini-live-2.5-flash-preview
gemini-2.0-flash-live-001
gemini-2.0-flash-live-preview-04-09
Vertex AI Gemini API
gemini-live-2.5-flash
(özel GA*)gemini-2.0-flash-live-preview-04-09
(yalnızcaus-central1
'da erişilebilir)
Live API için 2,5 model adında live
segmentinin gemini
segmentini hemen takip ettiğini unutmayın.
* Erişim isteğinde bulunmak için Google Cloud hesap ekibinizdeki temsilciyle iletişime geçin.
Live API uygulamasının standart özelliklerini kullanma
Bu bölümde, Live API'nın standart özelliklerinin nasıl kullanılacağı açıklanmaktadır. Özellikle çeşitli giriş ve çıkış türlerini yayınlamak için:
- Kısa mesaj gönderme ve alma
- Ses gönderme ve ses alma
- Ses gönderme ve metin alma
- Metin gönderme ve ses alma
Yayınlanan metin girişinden yayınlanan metin oluşturma
Bu örneği denemeden önce projenizi ve uygulamanızı ayarlamak için bu kılavuzun Başlamadan önce bölümünü tamamlayın.Bu bölümde, seçtiğiniz Gemini API sağlayıcı için bir düğmeyi de tıklayarak bu sayfada sağlayıcıya özel içerikleri görebilirsiniz. |
Yayınlanan metin girişini gönderebilir ve yayınlanan metin çıkışını alabilirsiniz. liveModel
örneği oluşturduğunuzdan ve yanıt biçimini Text
olarak ayarladığınızdan emin olun.
Swift
Live API henüz Apple platformu uygulamalarında desteklenmemektedir. Ancak yakında desteklenecektir.
Kotlin
// Initialize the Gemini Developer API backend service
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).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.turnComplete) {
// 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 Gemini Developer API backend service
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
LiveGenerativeModel lm = FirebaseAI.getInstance(GenerativeBackend.googleAI()).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 henüz web uygulamalarında desteklenmemektedir ancak yakında desteklenecektir.
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 Gemini Developer API backend service
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
final model = FirebaseAI.googleAI().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 Gemini Developer API backend service
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).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);
}
}
}
Akış girişinden akışlı ses oluşturma
Bu örneği denemeden önce projenizi ve uygulamanızı ayarlamak için bu kılavuzun Başlamadan önce bölümünü tamamlayın.Bu bölümde, seçtiğiniz Gemini API sağlayıcı için bir düğmeyi de tıklayarak bu sayfada sağlayıcıya özel içerikleri görebilirsiniz. |
Yayınlanan ses girişini gönderebilir ve yayınlanan ses çıkışını alabilirsiniz. LiveModel
Örnek oluşturduğunuzdan ve yanıt biçimini Audio
olarak ayarladığınızdan emin olun.
Bu sayfanın ilerleyen bölümlerinde yanıt sesini nasıl yapılandıracağınızı ve özelleştireceğinizi öğrenebilirsiniz.
Swift
Live API henüz Apple platformu uygulamalarında desteklenmemektedir. Ancak yakında desteklenecektir.
Kotlin
// Initialize the Gemini Developer API backend service
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).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 Gemini Developer API backend service
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
LiveGenerativeModel lm = FirebaseAI.getInstance(GenerativeBackend.googleAI()).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 henüz web uygulamalarında desteklenmemektedir ancak yakında desteklenecektir.
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 Gemini Developer API backend service
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
final model = FirebaseAI.googleAI().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 Gemini Developer API backend service
// Create a `LiveModel` instance with the flash-live model (only model that supports the Live API)
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).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++;
}
}
Daha ilgi çekici ve etkileşimli deneyimler oluşturma
Bu bölümde, Live API'nın daha ilgi çekici veya etkileşimli özelliklerinin nasıl oluşturulacağı ve yönetileceği açıklanmaktadır.
Yanıt sesini değiştirme
Live API, sentezlenmiş konuşma yanıtlarını desteklemek için Chirp 3'ü kullanır. Firebase AI Logic kullanırken çeşitli HD seslerde ses gönderebilirsiniz. Her bir sesin nasıl duyulduğunun tam listesi ve demoları için Chirp 3: HD sesler başlıklı makaleyi inceleyin.
Bir ses belirtmek için speechConfig
nesnesindeki ses adını model yapılandırmasının bir parçası olarak ayarlayın.
Ses belirtmezseniz varsayılan olarak Puck
kullanılır.
Bu örneği denemeden önce projenizi ve uygulamanızı ayarlamak için bu kılavuzun Başlamadan önce bölümünü tamamlayın.Bu bölümde, seçtiğiniz Gemini API sağlayıcı için bir düğmeyi de tıklayarak bu sayfada sağlayıcıya özel içerikleri görebilirsiniz. |
Swift
Live API henüz Apple platformu uygulamalarında desteklenmemektedir. Ancak yakında desteklenecektir.
Kotlin
// ...
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).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 = Voice("VOICE_NAME"))
}
)
// ...
Java
// ...
LiveModel model = FirebaseAI.getInstance(GenerativeBackend.googleAI()).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(new Voice("VOICE_NAME")))
.build()
);
// ...
Web
Live API henüz web uygulamalarında desteklenmemektedir ancak yakında desteklenecektir.
Dart
// ...
final model = FirebaseAI.googleAI().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: 'VOICE_NAME'),
),
);
// ...
Unity
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).GetLiveModel(
modelName: "gemini-2.0-flash-live-preview-04-09",
liveGenerationConfig: new LiveGenerationConfig(
responseModalities: new[] { ResponseModality.Audio },
speechConfig: SpeechConfig.UsePrebuiltVoice("VOICE_NAME"))
);
Modelden istem yaparken ve modelin İngilizce olmayan bir dilde yanıt vermesini isterken en iyi sonuçları elde etmek için sistem talimatlarınıza aşağıdakileri ekleyin:
RESPOND IN LANGUAGE. YOU MUST RESPOND UNMISTAKABLY IN LANGUAGE.
Oturumlar ve istekler arasında bağlamı koruma
Oturumlar ve istekler arasında bağlamı korumak için sohbet yapısı kullanabilirsiniz. Bu özelliğin yalnızca metin girişi ve metin çıkışı için çalıştığını unutmayın.
Bu yaklaşım, kısa bağlamlar için en iyisidir. Etkinliklerin tam sırasını temsil etmek için adım adım etkileşimler gönderebilirsiniz. Daha uzun bağlamlar için, sonraki etkileşimlerde bağlam penceresini boşaltmak amacıyla tek bir mesaj özeti sağlamanızı öneririz.
Kesintileri ele alma
Firebase AI Logic henüz kesintileri işlemeyi desteklemiyor. Bir süre sonra tekrar kontrol edin.
İşlev çağrısını (araçlar) kullanma
Standart içerik oluşturma yöntemlerinde olduğu gibi, Live API ile kullanmak için mevcut işlevler gibi araçlar tanımlayabilirsiniz. Bu bölümde, Live API'yi işlev çağrısıyla kullanırken dikkat edilmesi gereken bazı noktalar açıklanmaktadır. İşlev çağırma ile ilgili eksiksiz açıklama ve örnekler için işlev çağırma kılavuzuna bakın.
Model, tek bir istemden birden fazla işlev çağrısı ve bunların çıkışlarını zincirlemek için gereken kodu oluşturabilir. Bu kod, sonraki BidiGenerateContentToolCall
mesajlarını oluşturarak bir korumalı alan ortamında yürütülür. Yürütme, her işlev çağrısının sonuçları kullanılabilir olana kadar duraklatılır. Bu sayede sıralı işleme sağlanır.
Ayrıca, Live API'nin işlev çağrısıyla birlikte kullanılması özellikle güçlüdür. Çünkü model, kullanıcıdan takip veya açıklama bilgisi isteyebilir. Örneğin, modelin çağırmak istediği bir işleve parametre değeri sağlamak için yeterli bilgisi yoksa model, kullanıcıdan daha fazla veya açıklayıcı bilgi vermesini isteyebilir.
Müşteri, BidiGenerateContentToolResponse
ile yanıt vermelidir.
Sınırlamalar ve şartlar
Live API ile ilgili aşağıdaki sınırlamaları ve şartları göz önünde bulundurun.
Çeviri yazı
Firebase AI Logic henüz transkriptleri desteklemiyor. Bir süre sonra tekrar kontrol edin.
Diller
- Giriş dilleri: Gemini modelleri için desteklenen giriş dillerinin tam listesini inceleyin.
- Çıkış dilleri: Kullanılabilir çıkış dillerinin tam listesini Chirp 3: HD sesler bölümünde bulabilirsiniz.
Ses biçimleri
Live API aşağıdaki ses biçimlerini destekler:
- Giriş ses biçimi: 16 kHz little-endian ham 16 bit PCM ses
- Çıkış ses biçimi: 24 kHz little-endian ham 16 bit PCM ses
Hız sınırları
Live API, Firebase projesi başına eşzamanlı oturumlar ve dakikadaki jeton sayısı (TPM) için hız sınırlarına sahiptir.
Gemini Developer API:
- Sınırlar, projenizin Gemini Developer API"kullanım katmanına" göre değişir (hız sınırı belgelerine bakın).
Vertex AI Gemini API:
- Firebase projesi başına 5.000 eşzamanlı oturum
- Dakikada 4 milyon jeton
Oturum süresi
Varsayılan oturum süresi 10 dakikadır. Oturum süresi sınırı aştığında bağlantı sonlandırılır.
Model, bağlam boyutuyla da sınırlıdır. Büyük giriş parçaları göndermek, oturumun daha erken sonlandırılmasına neden olabilir.
Ses etkinliği algılama (VAD)
Model, sürekli bir ses girişi akışında otomatik olarak ses etkinliği algılama (VAD) gerçekleştirir. VAD varsayılan olarak etkindir.
Jeton sayma
CountTokens
API'yi Live API ile kullanamazsınız.
Firebase AI Logic ile ilgili deneyiminiz hakkında geri bildirim verme