Streaming dua arah menggunakan Gemini Live API


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:

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

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