Gemini Live API memungkinkan interaksi teks dan suara dua arah latensi rendah dengan Gemini. Dengan Live API, Anda dapat memberikan pengalaman percakapan suara alami seperti manusia kepada pengguna akhir, dengan kemampuan untuk mengganggu respons model menggunakan perintah teks atau suara. Model ini dapat memproses input teks dan audio (video akan segera hadir), dan dapat memberikan output teks dan audio.
Anda dapat membuat prototipe dengan perintah dan Live API di Vertex AI Studio.
Live API adalah API stateful yang membuat koneksi WebSocket untuk membuat sesi antara klien dan server Gemini. Untuk mengetahui detailnya, lihat dokumentasi referensi Live API.
Sebelum memulai
Hanya tersedia saat menggunakan Vertex AI Gemini API sebagai penyedia API Anda. |
Jika belum melakukannya, selesaikan panduan memulai, yang menjelaskan cara menyiapkan project Firebase, menghubungkan aplikasi ke Firebase, menambahkan SDK, menginisialisasi layanan backend untuk Vertex AI Gemini API, dan membuat instance LiveModel
.
Model yang mendukung kemampuan ini
Live API hanya didukung oleh gemini-2.0-flash-live-preview-04-09
(bukan gemini-2.0-flash
).
Menggunakan fitur standar Live API
Bagian ini menjelaskan cara menggunakan fitur standar Live API, khususnya untuk melakukan streaming berbagai jenis input dan output:
- Mengirim teks dan menerima teks
- Mengirim audio dan menerima audio
- Mengirim audio dan menerima teks
- Mengirim teks dan menerima audio
Membuat teks yang di-streaming dari input teks yang di-streaming
Sebelum mencoba contoh ini, selesaikan bagian
Sebelum memulai dalam panduan ini
untuk menyiapkan project dan aplikasi. Di bagian tersebut, Anda juga akan mengklik tombol untuk penyedia Gemini API yang dipilih sehingga Anda melihat konten khusus penyedia di halaman ini. |
Anda dapat mengirim input teks yang di-streaming dan menerima output teks yang di-streaming. Pastikan untuk
membuat instance liveModel
dan menetapkan
modalitas respons
ke Text
.
Swift
Live API belum didukung untuk aplikasi platform Apple, tetapi periksa kembali nanti.
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 belum didukung untuk aplikasi Web, tetapi periksa kembali nanti.
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);
}
}
}
Pelajari cara memilih model yang sesuai untuk kasus penggunaan dan aplikasi Anda.
Membuat audio streaming dari input audio streaming
Sebelum mencoba contoh ini, selesaikan bagian
Sebelum memulai dalam panduan ini
untuk menyiapkan project dan aplikasi. Di bagian tersebut, Anda juga akan mengklik tombol untuk penyedia Gemini API yang dipilih sehingga Anda melihat konten khusus penyedia di halaman ini. |
Anda dapat mengirim input audio yang di-streaming dan menerima output audio yang di-streaming. Pastikan
untuk membuat instance LiveModel
dan menetapkan
modalitas respons
ke Audio
.
Pelajari cara mengonfigurasi dan menyesuaikan suara respons (nanti di halaman ini).
Swift
Live API belum didukung untuk aplikasi platform Apple, tetapi periksa kembali nanti.
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 belum didukung untuk aplikasi Web, tetapi periksa kembali nanti.
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++;
}
}
Pelajari cara memilih model yang sesuai untuk kasus penggunaan dan aplikasi Anda.
Membuat pengalaman yang lebih menarik dan interaktif
Bagian ini menjelaskan cara membuat dan mengelola fitur Live API yang lebih menarik atau interaktif.
Mengubah suara respons
Live API menggunakan Chirp 3 untuk mendukung respons ucapan yang disintesis. Saat menggunakan Firebase AI Logic, Anda dapat mengirim audio dalam 5 suara HD dan 31 bahasa.
Jika Anda tidak menentukan suara, defaultnya adalah Puck
. Atau, Anda dapat
mengonfigurasi model untuk merespons dengan salah satu suara berikut:
Aoede (perempuan)Charon (laki-laki) |
Fenrir (laki-laki)Kore (perempuan) |
Puck (laki-laki) |
Untuk demo suara ini dan daftar lengkap bahasa yang tersedia, lihat Chirp 3: Suara HD.
Untuk menentukan suara, tetapkan nama suara dalam objek speechConfig
sebagai bagian
dari
konfigurasi model:
Swift
Live API belum didukung untuk aplikasi platform Apple, tetapi periksa kembali nanti.
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 belum didukung untuk aplikasi Web, tetapi periksa kembali nanti.
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!
Untuk mendapatkan hasil terbaik saat meminta dan mewajibkan model untuk merespons dalam bahasa non-Inggris, sertakan hal berikut sebagai bagian dari petunjuk sistem Anda:
RESPOND IN LANGUAGE. YOU MUST RESPOND UNMISTAKABLY IN LANGUAGE.
Mempertahankan konteks di seluruh sesi dan permintaan
Anda dapat menggunakan struktur chat untuk mempertahankan konteks di seluruh sesi dan permintaan. Perhatikan bahwa ini hanya berfungsi untuk input teks dan output teks.
Pendekatan ini paling cocok untuk konteks singkat; Anda dapat mengirim interaksi belokan demi belokan untuk mewakili urutan peristiwa yang tepat . Untuk konteks yang lebih panjang, sebaiknya berikan satu ringkasan pesan untuk mengosongkan jendela konteks untuk interaksi berikutnya.
Menangani gangguan
Firebase AI Logic belum mendukung penanganan gangguan. Periksa kembali nanti!
Menggunakan panggilan fungsi (alat)
Anda dapat menentukan alat, seperti fungsi yang tersedia, untuk digunakan dengan Live API seperti yang dapat Anda lakukan dengan metode pembuatan konten standar. Bagian ini menjelaskan beberapa nuansa saat menggunakan Live API dengan panggilan fungsi. Untuk deskripsi lengkap dan contoh panggilan fungsi, lihat panduan panggilan fungsi.
Dari satu perintah, model dapat menghasilkan beberapa panggilan fungsi dan
kode yang diperlukan untuk merantai outputnya. Kode ini dijalankan di lingkungan sandbox, yang menghasilkan pesan BidiGenerateContentToolCall
berikutnya. Eksekusi dijeda hingga hasil setiap panggilan fungsi
tersedia, yang memastikan pemrosesan berurutan.
Selain itu, penggunaan Live API dengan panggilan fungsi sangat efektif karena model dapat meminta informasi tindak lanjut atau klarifikasi dari pengguna. Misalnya, jika model tidak memiliki cukup informasi untuk memberikan nilai parameter ke fungsi yang ingin dipanggil, model dapat meminta pengguna untuk memberikan informasi lebih lanjut atau yang menjelaskan.
Klien harus merespons dengan
BidiGenerateContentToolResponse
.
Batasan dan persyaratan
Perhatikan batasan dan persyaratan Live API berikut.
Transkripsi
Firebase AI Logic belum mendukung transkripsi. Periksa kembali nanti!
Languages
- Bahasa input: Lihat daftar lengkap bahasa input yang didukung untuk model Gemini
- Bahasa output: Lihat daftar lengkap bahasa output yang tersedia di Chirp 3: Suara HD
Format audio
Live API mendukung format audio berikut:
- Format audio input: Audio PCM mentah 16 bit pada 16 kHz little-endian
- Format audio output: Audio PCM mentah 16 bit pada 24 kHz little-endian
Batas kapasitas
Batas kapasitas berikut berlaku:
- 10 sesi serentak per project Firebase
- 4 juta token per menit
Durasi sesi
Durasi default untuk sesi adalah 30 menit. Jika durasi sesi melebihi batas, koneksi akan dihentikan.
Model juga dibatasi oleh ukuran konteks. Mengirim potongan input yang besar dapat mengakibatkan penghentian sesi lebih awal.
Deteksi aktivitas suara (VAD)
Model ini secara otomatis melakukan deteksi aktivitas suara (VAD) pada streaming input audio yang berkelanjutan. VAD diaktifkan secara default.
Penghitungan token
Anda tidak dapat menggunakan CountTokens
API dengan Live API.
Berikan masukan tentang pengalaman Anda dengan Firebase AI Logic