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
}
Узнайте, как выбрать модель и, при необходимости, местоположение, подходящее для вашего варианта использования и приложения.
Вы можете отправлять потоковый аудиовход и получать потоковый текстовый вывод. Обязательно создайте экземпляр 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 audioContent = content("user") { audioData }
session.send(audioContent)
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
TODO - snippet 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);
// Send Audio data
session.send(new Content.Builder().addInlineData(audioData, "audio/pcm").build());
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';
import 'package:your_audio_recorder_package/your_audio_recorder_package.dart';
import 'dart:async';
late LiveModelSession _session;
final _audioRecorder = YourAudioRecorder();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
final model = FirebaseVertexAI.instance.liveModel(
model: 'gemini-2.0-flash-live-preview-04-09',
config: LiveGenerationConfig(responseModality: ResponseModality.text),
);
_session = await model.connect();
final audioRecordStream = _audioRecorder.startRecordingStream();
final mediaChunkStream = audioRecordStream.map((data) {
return InlineDataPart('audio/pcm', data);
});
await _session.startMediaStream(mediaChunkStream);
final responseStream = _session.receive();
return responseStream.asyncMap((response) async {
if (response.parts.isNotEmpty && response.parts.first.text != null) {
return response.parts.first.text!;
} else {
throw Exception('Text response not found.');
}
});
Future main() async {
try {
final textStream = await audioToText();
await for (final text in textStream) {
print('Received text: $text');
// Handle the text response
}
} catch (e) {
print('Error: $e');
}
}
Узнайте, как выбрать модель и, при необходимости, местоположение, подходящее для вашего варианта использования и приложения.
Вы можете отправлять потоковый текстовый ввод и получать потоковый аудиовыход. Обязательно создайте экземпляр 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()
// Provide a text prompt
val text = "tell a short story"
session.send(text)
session.receive().collect {
if(it.status == Status.TURN_COMPLETE) {
// Optional: if you don't require to send more requests.
session.stopReceiving();
}
// Handle 16bit pcm audio data at 24khz
playAudio(it.data)
}
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.AUDIO)
.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 16bit pcm audio data at 24khz
liveContentResponse.getData();
}
@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';
import 'dart:async';
import 'dart:typed_data';
late LiveModelSession _session;
Future<Stream<Uint8List>> textToAudio(String textPrompt) async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
final model = FirebaseVertexAI.instance.liveModel(
model: 'gemini-2.0-flash-live-preview-04-09',
config: LiveGenerationConfig(responseModality: ResponseModality.audio),
);
_session = await model.connect();
final prompt = Content.text(textPrompt);
await _session.send(input: prompt);
return _session.receive().asyncMap((response) async {
if (response is LiveServerContent && response.modelTurn?.parts != null) {
for (final part in response.modelTurn!.parts) {
if (part is InlineDataPart) {
return part.bytes;
}
}
}
throw Exception('Audio data not found');
});
}
Future<void> main() async {
try {
final audioStream = await textToAudio('Convert this text to audio.');
await for (final audioData in audioStream) {
// Process the audio data (e.g., play it using an audio player package)
print('Received audio data: ${audioData.length} bytes');
// Example using flutter_sound (replace with your chosen package):
// await _flutterSoundPlayer.startPlayer(fromDataBuffer: audioData);
}
} catch (e) {
print('Error: $e');
}
}
Узнайте, как выбрать модель и, при необходимости, местоположение, подходящее для вашего варианта использования и приложения.
Создавайте более увлекательный и интерактивный опыт
В этом разделе описывается, как создавать и управлять более привлекательными или интерактивными функциями 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 пока не поддерживает транскрипцию. Возвращайтесь скорее!
Языки
- Языки ввода: см. полный список поддерживаемых языков ввода для моделей Gemini.
- Языки вывода: полный список доступных языков вывода см. в Chirp 3: HD voices.
Аудио форматы
Live API поддерживает следующие аудиоформаты:
- Формат входного аудио: необработанный 16-битный звук PCM с частотой 16 кГц с прямым порядком байтов.
- Выходной аудиоформат: необработанный 16-битный звук PCM с частотой 24 кГц с прямым порядком байтов.
Ограничения ставок
Применяются следующие ограничения по ставкам:
- 10 одновременных сеансов на проект Firebase
- 4 миллиона токенов в минуту
Продолжительность сеанса
По умолчанию продолжительность сеанса составляет 30 минут. Когда продолжительность сеанса превышает лимит, соединение разрывается.
Модель также ограничена размером контекста. Отправка больших порций входных данных может привести к более раннему завершению сеанса.
Обнаружение голосовой активности (VAD)
Модель автоматически выполняет обнаружение голосовой активности (VAD) в непрерывном входном аудиопотоке. VAD включен по умолчанию.
Подсчет токенов
Вы не можете использовать API CountTokens
с Live API .