Bidirektionales Streaming mit der Gemini Live API


Der Gemini Live API ermöglicht bidirektionale Text- und Sprachinteraktionen mit niedriger Latenz mit Gemini. Mit dem Live API können Sie Endnutzern natürliche, menschliche Sprachunterhaltungen bieten, bei denen sie die Antworten des Modells per Text- oder Sprachbefehl unterbrechen können. Das Modell kann Text- und Audioeingaben verarbeiten (Videos folgen bald) und Text- und Audioausgaben liefern.

Sie können Prototypen mit Prompts und der Live API in Vertex AI Studio erstellen.

Die Live API ist eine zustandsorientierte API, die eine WebSocket-Verbindung erstellt, um eine Sitzung zwischen dem Client und dem Gemini-Server herzustellen. Weitere Informationen finden Sie in der Live API-Referenzdokumentation.

Hinweis

Nur verfügbar, wenn Vertex AI Gemini API als API-Anbieter verwendet wird.

Sehen Sie sich den Startleitfaden an, in dem beschrieben wird, wie Sie Ihr Firebase-Projekt einrichten, Ihre App mit Firebase verbinden, das SDK hinzufügen, den Backend-Dienst für die Vertex AI Gemini API initialisieren und eine LiveModel-Instanz erstellen.

Modelle, die diese Funktion unterstützen

Live API wird nur von gemini-2.0-flash-live-preview-04-09 (nicht von gemini-2.0-flash) unterstützt.

Standardfunktionen der Live API verwenden

In diesem Abschnitt wird beschrieben, wie Sie die Standardfunktionen der Live API verwenden, insbesondere um verschiedene Arten von Eingaben und Ausgaben zu streamen:

Gestreamten Text aus gestreamter Texteingabe generieren

Bevor Sie dieses Beispiel ausprobieren, müssen Sie den Abschnitt Vorbereitung in diesem Leitfaden durcharbeiten, um Ihr Projekt und Ihre App einzurichten.
In diesem Abschnitt klicken Sie auch auf eine Schaltfläche für den von Ihnen ausgewählten Gemini API Anbieter, damit auf dieser Seite anbieterspezifische Inhalte angezeigt werden.

Sie können gestreamte Texteingaben senden und gestreamte Textausgaben empfangen. Erstellen Sie eine liveModel-Instanz und legen Sie die Antwortmodalität auf Text fest.

Swift

Die Live API wird für Apps auf Apple-Plattformen noch nicht unterstützt. Schauen Sie aber bald wieder vorbei.

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

Die Live API wird für Web-Apps noch nicht unterstützt. Wir arbeiten aber daran, das bald zu ändern.

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 
}

Einheit

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);
    }
  }
}

Weitere Informationen zur Auswahl eines Modells

Gestreamtes Audio aus gestreamten Audioeingaben generieren

Bevor Sie dieses Beispiel ausprobieren, müssen Sie den Abschnitt Vorbereitung in diesem Leitfaden durcharbeiten, um Ihr Projekt und Ihre App einzurichten.
In diesem Abschnitt klicken Sie auch auf eine Schaltfläche für den von Ihnen ausgewählten Gemini API Anbieter, damit auf dieser Seite anbieterspezifische Inhalte angezeigt werden.

Sie können gestreamte Audioeingaben senden und gestreamte Audioausgaben empfangen. Erstellen Sie eine LiveModel-Instanz und legen Sie die Antwortmodalität auf Audio fest.

Weitere Informationen zum Konfigurieren und Anpassen der Antwortstimme finden Sie weiter unten auf dieser Seite.

Swift

Die Live API wird für Apps auf Apple-Plattformen noch nicht unterstützt. Schauen Sie aber bald wieder vorbei.

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

Die Live API wird für Web-Apps noch nicht unterstützt. Wir arbeiten aber daran, das bald zu ändern.

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 
}

Einheit

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++;
  }
}

Weitere Informationen zur Auswahl eines Modells



Mehr Interaktionen und Engagement erzielen

In diesem Abschnitt wird beschrieben, wie Sie ansprechendere oder interaktivere Funktionen der Live API erstellen und verwalten.

Antwortstimme ändern

Der Live API verwendet Chirp 3, um synthetisierte Sprachantworten zu unterstützen. Wenn Sie Firebase AI Logic verwenden, können Sie Audioinhalte in 5 HD-Stimmen und 31 Sprachen senden.

Wenn Sie keine Stimme angeben, wird standardmäßig Puck verwendet. Alternativ können Sie das Modell so konfigurieren, dass es mit einer der folgenden Stimmen antwortet:

Aoede (weiblich)
Charon (männlich)
Fenrir (männlich)
Kore (weiblich)
Puck (männlich)

Demos dazu, wie diese Stimmen klingen, und eine vollständige Liste der verfügbaren Sprachen finden Sie unter Chirp 3: HD-Stimmen.

Wenn Sie eine Stimme angeben möchten, legen Sie den Sprachnamen im speechConfig-Objekt als Teil der Modellkonfiguration fest:

Swift

Die Live API wird für Apps auf Apple-Plattformen noch nicht unterstützt. Schauen Sie aber bald wieder vorbei.

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

Die Live API wird für Web-Apps noch nicht unterstützt. Wir arbeiten aber daran, das bald zu ändern.

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),
  ),
);

// ...

Einheit

Snippets coming soon!

Wenn Sie das Modell auffordern und anweisen möchten, in einer anderen Sprache als Englisch zu antworten, sollten Sie Folgendes in Ihre Systemanweisungen aufnehmen:

RESPOND IN LANGUAGE. YOU MUST RESPOND UNMISTAKABLY IN LANGUAGE.

Kontext über Sitzungen und Anfragen hinweg beibehalten

Mit einer Chatstruktur können Sie den Kontext über Sitzungen und Anfragen hinweg beibehalten. Hinweis: Dies funktioniert nur für die Texteingabe und Textausgabe.

Dieser Ansatz eignet sich am besten für kurze Kontexte. Sie können Schritt-für-Schritt-Interaktionen senden, um die genaue Abfolge der Ereignisse darzustellen. Bei längeren Kontexten empfehlen wir, eine einzelne Nachrichtenzusammenfassung anzugeben, um das Kontextfenster für nachfolgende Interaktionen freizugeben.

Unterbrechungen bewältigen

Firebase AI Logic unterstützt noch nicht das Beheben von Unterbrechungen. Schauen Sie später noch einmal vorbei!

Funktionsaufrufe verwenden (Tools)

Du kannst Tools wie verfügbare Funktionen für die Live API definieren, genau wie bei den Standardmethoden zur Inhaltsgenerierung. In diesem Abschnitt werden einige Nuancen bei der Verwendung der Live API mit Funktionsaufrufen beschrieben. Eine vollständige Beschreibung und Beispiele für Funktionsaufrufe finden Sie im Leitfaden zu Funktionsaufrufen.

Anhand eines einzelnen Prompts kann das Modell mehrere Funktionsaufrufe und den Code generieren, der zum Verketten der Ausgaben erforderlich ist. Dieser Code wird in einer Sandbox-Umgebung ausgeführt und generiert nachfolgende BidiGenerateContentToolCall-Nachrichten. Die Ausführung wird pausiert, bis die Ergebnisse der einzelnen Funktionsaufrufe verfügbar sind. So wird eine sequenzielle Verarbeitung sichergestellt.

Außerdem ist die Verwendung der Live API mit Funktionsaufrufen besonders leistungsstark, da das Modell vom Nutzer zusätzliche oder erläuternde Informationen anfordern kann. Wenn dem Modell beispielsweise nicht genügend Informationen vorliegen, um einer Funktion, die aufgerufen werden soll, einen Parameterwert zuzuweisen, kann das Modell den Nutzer bitten, weitere oder erläuternde Informationen anzugeben.

Der Client sollte mit BidiGenerateContentToolResponse antworten.



Beschränkungen und Anforderungen

Beachten Sie die folgenden Einschränkungen und Anforderungen der Live API.

Sprache-zu-Text

Firebase AI Logic unterstützt noch nicht die Transkription. Schauen Sie später noch einmal vorbei!

Sprachen

Audioformate

Die Live API unterstützt die folgenden Audioformate:

  • Eingabeaudioformat:Rohes 16-Bit-PCM-Audio mit 16 kHz und Little Endian
  • Audioausgabeformat:Rohes 16-Bit-PCM-Audio mit 24 kHz und Little Endian

Ratenlimits

Es gelten die folgenden Ratenbegrenzungen:

  • 10 gleichzeitige Sitzungen pro Firebase-Projekt
  • 4 Millionen Tokens pro Minute

Sitzungsdauer

Die Standarddauer einer Sitzung beträgt 30 Minuten. Wenn die Sitzungsdauer das Limit überschreitet, wird die Verbindung beendet.

Das Modell ist außerdem durch die Kontextgröße begrenzt. Das Senden großer Eingabeblöcke kann zu einer vorzeitigen Sitzungsbeendigung führen.

Erkennung der Sprachaktivitäten (VAD)

Das Modell führt automatisch eine Sprachaktivitätserkennung (VAD) auf einem kontinuierlichen Audioeingabestream durch. Die VAD-Funktion ist standardmäßig aktiviert.

Tokenzählung

Sie können die CountTokens API nicht mit der Live API verwenden.


Feedback zu Firebase AI Logic geben