Двунаправленная потоковая передача с использованием API Gemini Live Двунаправленная потоковая передача с использованием API Gemini Live 


Gemini Live API обеспечивает двунаправленное текстовое и голосовое взаимодействие с низкой задержкой с Gemini . Используя Live API , вы можете предоставить конечным пользователям возможность естественного, человеческого голосового общения с возможностью прерывать ответы модели с помощью текстовых или голосовых команд. Модель может обрабатывать ввод текста и аудио (скоро появится видео!), а также обеспечивать вывод текста и звука.

Вы можете создавать прототипы с помощью подсказок и Live API в Vertex AI Studio .

Live API — это API с отслеживанием состояния, который создает соединение WebSocket для установления сеанса между клиентом и сервером Gemini. Подробности см. в справочной документации Live API .

Прежде чем начать

Если вы еще этого не сделали, прочтите руководство по началу работы , в котором описывается, как настроить проект Firebase, подключить приложение к Firebase, добавить SDK, инициализировать службу Vertex AI и создать экземпляр LiveModel .

Убедитесь, что вы используете как минимум следующие версии библиотеки Firebase:
iOS+ : пока не поддерживается | Android : v16.3.0+ ( BoM : v33.12.0+) | Интернет : еще не поддерживается | Flutter : v1.5.0+ (BoM: v3.9.0+)

Модели, поддерживающие эту возможность

Live API поддерживается только gemini-2.0-flash-live-preview-04-09 (не gemini-2.0-flash ).

Используйте стандартные функции Live API

В этом разделе описывается, как использовать стандартные функции Live API , в частности для потоковой передачи различных типов входных и выходных данных:

Отправляйте текст и получайте текст

Вы можете отправлять потоковый текстовый ввод и получать потоковый текстовый вывод. Обязательно создайте экземпляр liveModel и установите для модальности ответа значение Text .

Быстрый

Live API пока не поддерживается для приложений платформы Apple, но загляните сюда позже!

Kotlin

// Initialize the Vertex AI service and create a `LiveModel` instance
val model = Firebase.vertexAI.liveModel(
    // The Live API requires this specific model.
    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 service and create a `LiveModel` instance
LiveGenerativeModel lm = FirebaseVertexAI.getInstance().liveModel(
        // The Live API requires this specific model.
        "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 пока не поддерживается для веб-приложений, но загляните сюда позже!

Dart

import 'package:firebase_vertexai/firebase_vertexai.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 service and create a `LiveModel` instance
final model = FirebaseVertexAI.instance.liveModel(
  // The Live API requires this specific model.
  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 
}

Узнайте, как выбрать модель и, при необходимости, местоположение, подходящее для вашего варианта использования и приложения.

Отправлять аудио и получать аудио

Вы можете отправлять потоковый аудиовход и получать потоковый аудиовыход. Обязательно создайте экземпляр LiveModel и установите модальность ответа Audio .

Узнайте, как настроить голос ответа (далее на этой странице).

Быстрый

Live API пока не поддерживается для приложений платформы Apple, но загляните сюда позже!

Kotlin

// Initialize the Vertex AI service and create a `LiveModel` instance
val model = Firebase.vertexAI.liveModel(
    // The Live API requires this specific model.
    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 service and create a `LiveModel` instance
LiveGenerativeModel lm = FirebaseVertexAI.getInstance().liveModel(
        // The Live API requires this specific model.
        "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);

Интернет

Live API пока не поддерживается для веб-приложений, но загляните сюда позже!

Dart

import 'package:firebase_vertexai/firebase_vertexai.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 service and create a `LiveModel` instance
final model = FirebaseVertexAI.instance.liveModel(
  // The Live API requires this specific model.
  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 
}

Узнайте, как выбрать модель и, при необходимости, местоположение, подходящее для вашего варианта использования и приложения.



Создавайте более увлекательный и интерактивный опыт

В этом разделе описывается, как создавать и управлять более привлекательными или интерактивными функциями Live API .

Изменить голос ответа

Live API использует Chirp 3 для поддержки синтезированных речевых ответов. При использовании Vertex AI в Firebase вы можете отправлять звук на 5 HD-голосах и на 31 языке.

Если вы не укажете голос, по умолчанию используется Puck . Альтернативно вы можете настроить модель на ответ любым из следующих голосов:

Aoede (женщина)
Charon (мужчина)
Fenrir (мужчина)
Kore (женщина)
Puck (мужчина)

Демоверсии того, как звучат эти голоса, а также полный список доступных языков см. в разделе Chirp 3: HD voices .

Чтобы указать голос, установите имя голоса в объекте speechConfig как часть конфигурации модели :

Быстрый

Live API пока не поддерживается для приложений платформы Apple, но загляните сюда позже!

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 пока не поддерживается для веб-приложений, но загляните сюда позже!

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

// ...

Для достижения наилучших результатов при запросе и необходимости ответа модели на языке, отличном от английского, включите в системные инструкции следующее:

RESPOND IN LANGUAGE. YOU MUST RESPOND UNMISTAKABLY IN LANGUAGE.

Поддерживать контекст между сеансами и запросами

Вы можете использовать структуру чата для поддержания контекста между сеансами и запросами. Обратите внимание, что это работает только для ввода и вывода текста.

Этот подход лучше всего подходит для коротких контекстов; вы можете отправлять пошаговые инструкции, чтобы представить точную последовательность событий. Для более длинных контекстов мы рекомендуем предоставлять сводку одного сообщения, чтобы освободить окно контекста для последующих взаимодействий.

Обработка прерываний

Vertex AI в Firebase пока не поддерживает обработку прерываний. Возвращайтесь скорее!

Использовать вызов функций (инструменты)

Вы можете определить инструменты, такие как доступные функции, для использования с Live API так же, как со стандартными методами генерации контента. В этом разделе описаны некоторые нюансы при использовании Live API с вызовом функций. Полное описание и примеры вызова функций см. в руководстве по вызову функций .

Из одного приглашения модель может генерировать несколько вызовов функций и код, необходимый для объединения их выходных данных в цепочку. Этот код выполняется в изолированной среде, генерируя последующие сообщения BidiGenerateContentToolCall . Выполнение приостанавливается до тех пор, пока не станут доступны результаты каждого вызова функции, что обеспечивает последовательную обработку.

Кроме того, использование Live API с вызовом функций особенно эффективно, поскольку модель может запрашивать у пользователя дополнительную или уточняющую информацию. Например, если в модели недостаточно информации для предоставления значения параметра функции, которую она хочет вызвать, модель может попросить пользователя предоставить дополнительную или уточняющую информацию.

Клиент должен ответить BidiGenerateContentToolResponse .



Ограничения и требования

Имейте в виду следующие ограничения и требования Live API .

Транскрипция

Vertex AI в Firebase пока не поддерживает транскрипцию. Возвращайтесь скорее!

Языки

Аудио форматы

Live API поддерживает следующие аудиоформаты:

  • Формат входного аудио: необработанный 16-битный звук PCM с частотой 16 кГц с прямым порядком байтов.
  • Выходной аудиоформат: необработанный 16-битный звук PCM с частотой 24 кГц с прямым порядком байтов.

Ограничения ставок

Применяются следующие ограничения по ставкам:

  • 10 одновременных сеансов на проект Firebase
  • 4 миллиона токенов в минуту

Продолжительность сеанса

По умолчанию продолжительность сеанса составляет 30 минут. Когда продолжительность сеанса превышает лимит, соединение разрывается.

Модель также ограничена размером контекста. Отправка больших порций входных данных может привести к более раннему завершению сеанса.

Обнаружение голосовой активности (VAD)

Модель автоматически выполняет обнаружение голосовой активности (VAD) в непрерывном входном аудиопотоке. VAD включен по умолчанию.

Подсчет токенов

Вы не можете использовать API CountTokens с Live API .