Pierwsze kroki z interfejsem Gemini Live API za pomocą Firebase AI Logic


Gemini Live API umożliwia dwukierunkowe interakcje głosowe i wideo w czasie rzeczywistym z modelem Gemini przy niewielkich opóźnieniach.

Live API i specjalna rodzina modeli mogą przetwarzać ciągłe strumienie dźwięku, obrazu lub tekstu, aby dostarczać natychmiastowe, podobne do ludzkich odpowiedzi głosowe, co zapewnia użytkownikom naturalny tryb konwersacyjny.

Na tej stronie opisujemy, jak zacząć korzystać z najpopularniejszej funkcji – strumieniowego przesyłania wejściowego i wyjściowego sygnału audio. Live API obsługuje jednak wiele różnych funkcji i opcji konfiguracji.

Live API to stanowy interfejs API, który tworzy połączenie WebSocket w celu ustanowienia sesji między klientem a serwerem Gemini. Szczegółowe informacje znajdziesz w dokumentacji Live API (Gemini Developer API | Agent Platform Gemini API (formerly Vertex AI)).

Przejdź do przykładowego kodu

Przydatne materiały

Zanim zaczniesz

Jeśli jeszcze nie korzystasz z Firebase, zapoznaj się z przewodnikiem dla początkujących, który opisuje, jak skonfigurować projekt w Firebase, połączyć aplikację z Firebase, dodać pakiet SDK, zainicjować usługę backendu dla wybranego dostawcy Gemini API i utworzyć instancję LiveModel.

Możesz tworzyć prototypy za pomocą promptów i Live API w Google AI Studio lub Agent  Studio.

Modele obsługujące tę funkcję

  • Modele 3.x

    • Gemini Developer API

      • gemini-3.1-flash-live-preview

      Mimo że jest to model w wersji testowej, jest on dostępny w ramach „poziomu bezpłatnego” Gemini Developer API.

    • Agent Platform Gemini API (formerly Vertex AI)

      Brak obsługi modeli Gemini Live 3.x

  • Modele 2.5

    Nawet jeśli model ma różne nazwy w zależności od dostawcy interfejsu API Gemini, jego funkcje są takie same.

    • Gemini Developer API

      • gemini-2.5-flash-native-audio-preview-12-2025
      • gemini-2.5-flash-native-audio-preview-09-2025

      Mimo że są to modele w wersji testowej, są one dostępne w „poziomie bezpłatnym” Gemini Developer API.

    • Agent Platform Gemini API (formerly Vertex AI)

      • gemini-live-2.5-flash-native-audio (opublikowano w grudniu 2025 r.)
      • gemini-live-2.5-flash-preview-native-audio-09-2025

      Podczas korzystania z Agent Platform Gemini API (formerly Vertex AI) modele Live API 2.5 nie są dostępne w lokalizacji global.

Strumieniowe przesyłanie wejścia i wyjścia audio

Kliknij dostawcę Gemini API, aby wyświetlić na tej stronie treści i kod dotyczące tego dostawcy.

Poniższy przykład pokazuje podstawową implementację wysyłania strumieniowych danych wejściowych audio i odbierania strumieniowych danych wyjściowych audio.

Dodatkowe opcje i możliwości Live API znajdziesz w sekcji „Co jeszcze możesz zrobić?” poniżej.

Swift

Aby używać Live API, utwórz instancję LiveModel i ustaw modalność odpowiedzi na audio.


import FirebaseAILogic

// Initialize the Gemini Developer API backend service.
// Create a `liveModel` instance with a model that supports the Live API.
let liveModel = FirebaseAI.firebaseAI(backend: .googleAI()).liveModel(
  modelName: "GEMINI_LIVE_API_MODEL_NAME",
  // Configure the model to respond with audio.
  generationConfig: LiveGenerationConfig(
    responseModalities: [.audio]
  )
)

do {
  let session = try await liveModel.connect()

  // Load the audio file, or tap a microphone.
  guard let audioFile = NSDataAsset(name: "audio.pcm") else {
    fatalError("Failed to load audio file")
  }

  // Provide the audio data.
  await session.sendAudioRealtime(audioFile.data)

  var outputText = ""
  for try await message in session.responses {
    if case let .content(content) = message.payload {
      content.modelTurn?.parts.forEach { part in
        if let part = part as? InlineDataPart, part.mimeType.starts(with: "audio/pcm") {
          // Handle 16bit pcm audio data at 24khz
          playAudio(part.data)
        }
      }
      // Optional: if you don't need to send more requests.
      if content.isTurnComplete {
        await session.close()
      }
    }
  }
} catch {
  fatalError(error.localizedDescription)
}

Kotlin

Aby używać Live API, utwórz instancję LiveModel i ustaw modalność odpowiedzi na AUDIO.


// Initialize the Gemini Developer API backend service.
// Create a `liveModel` instance with a model that supports the Live API.
val liveModel = Firebase.ai(backend = GenerativeBackend.googleAI()).liveModel(
    modelName = "GEMINI_LIVE_API_MODEL_NAME",
    // Configure the model to respond with audio.
    generationConfig = liveGenerationConfig {
        responseModality = ResponseModality.AUDIO
   }
)

val session = liveModel.connect()

// This is the recommended approach.
// However, you can create your own recorder and handle the stream.
session.startAudioConversation()

Java

Aby używać Live API, utwórz instancję LiveModel i ustaw modalność odpowiedzi na AUDIO.


ExecutorService executor = Executors.newFixedThreadPool(1);
// Initialize the Gemini Developer API backend service.
// Create a `liveModel` instance with a model that supports the Live API.
LiveGenerativeModel lm = FirebaseAI.getInstance(GenerativeBackend.googleAI()).liveModel(
        "GEMINI_LIVE_API_MODEL_NAME",
        // Configure the model to respond with audio.
        new LiveGenerationConfig.Builder()
                .setResponseModality(ResponseModality.AUDIO)
                .build()
);
LiveModelFutures liveModel = LiveModelFutures.from(lm);

ListenableFuture<LiveSession> sessionFuture =  liveModel.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

Aby używać modelu Live API, utwórz instancję LiveGenerativeModel i ustaw modalność odpowiedzi na AUDIO.


import { initializeApp } from "firebase/app";
import { getAI, getLiveGenerativeModel, GoogleAIBackend, ResponseModality } from "firebase/ai";

// TODO(developer): Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
  // ...
};

// Initialize FirebaseApp
const firebaseApp = initializeApp(firebaseConfig);

// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Create a `LiveGenerativeModel` instance with a model that supports the Live API.
const liveModel = getLiveGenerativeModel(ai, {
  model: "GEMINI_LIVE_API_MODEL_NAME",
  // Configure the model to respond with audio.
  generationConfig: {
    responseModalities: [ResponseModality.AUDIO],
  },
});

const session = await liveModel.connect();

// Start the audio conversation.
const audioConversationController = await startAudioConversation(session);

// ... Later, to stop the audio conversation
// await audioConversationController.stop()

Dart

Aby używać Live API, utwórz instancję LiveGenerativeModel i ustaw modalność odpowiedzi na audio.


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 LiveSession _session;
final _audioRecorder = YourAudioRecorder();

await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform,
);

// Initialize the Gemini Developer API backend service.
// Create a `liveGenerativeModel` instance with a model that supports the Live API.
final liveModel = FirebaseAI.googleAI().liveGenerativeModel(
  model: 'GEMINI_LIVE_API_MODEL_NAME',
  // Configure the model to respond with audio.
  liveGenerationConfig: LiveGenerationConfig(
    responseModalities: [ResponseModalities.audio],
  ),
);

_session = await liveModel.connect();

final audioRecordStream = _audioRecorder.startRecordingStream();
// Map the Uint8List stream to InlineDataPart stream.
final mediaChunkStream = audioRecordStream.map((data) {
  return InlineDataPart('audio/pcm', data);
});
await for (final chunk in mediaChunkStream) {
  await _session.sendAudioRealtime(chunk);
}

// In a separate thread, receive the audio response from the model.
await for (final message in _session.receive()) {
   // Process the received message.
}

Unity

Aby używać Live API, utwórz instancję LiveModel i ustaw modalność odpowiedzi na Audio.


using Firebase;
using Firebase.AI;

async Task SendTextReceiveAudio() {
  // Initialize the Gemini Developer API backend service.
  // Create a `LiveModel` instance with a model that supports the Live API.
  var liveModel = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).GetLiveModel(
      modelName: "GEMINI_LIVE_API_MODEL_NAME",
      // Configure the model to respond with audio.
      liveGenerationConfig: new LiveGenerationConfig(
          responseModalities: new[] { ResponseModality.Audio })
    );

  LiveSession session = await liveModel.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<float> 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>();
  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++;
  }
}



Ceny i liczenie tokenów

Informacje o cenach modeli Live API znajdziesz w dokumentacji wybranego dostawcy Gemini API: Gemini Developer API | Agent Platform Gemini API (formerly Vertex AI).

Niezależnie od dostawcy Gemini API usługa Live API nie obsługuje interfejsu Count Tokens API.



Co jeszcze możesz zrobić?

  • Zapoznaj się z pełnym zestawem możliwości modelu Live API, takich jak strumieniowe przesyłanie różnych danych wejściowych (audio, tekst lub wideo + audio).

  • Dostosuj implementację, korzystając z różnych opcji konfiguracji, takich jak dodawanie transkrypcji czy ustawianie głosu odpowiedzi.

  • Dowiedz się, jak zarządzać sesjami, w tym jak aktualizować treści w trakcie sesji, kompresować okno kontekstu, wykrywać, kiedy sesja dobiega końca, i wznawiać sesję.

  • Ulepsz swoją implementację, dając modelowi dostęp do narzędzi takich jak wywoływanie funkcji i grounding za pomocą Google Search. Oficjalna dokumentacja dotycząca korzystania z narzędzi w Live API będzie dostępna już wkrótce.

  • Dowiedz się więcej o limitach i specyfikacjach dotyczących korzystania z Live API, takich jak długość sesji, limity liczby żądań, obsługiwane języki itp.