Для приложений, которым требуется поддержка голосового взаимодействия в реальном времени с низкой задержкой, например чат-ботов или агентов, Gemini Live API предоставляет оптимизированный способ потоковой передачи входных и выходных данных для модели Gemini. С помощью Firebase AI Logic вы можете вызывать Gemini Live API прямо из приложения Android, не интегрируя его с серверной частью. В этом руководстве рассказывается, как использовать Gemini Live API в приложении для Android с помощью Firebase AI Logic.
Начать
Прежде всего убедитесь, что целевой уровень API вашего приложения – 23 или выше.
Если вы ещё этого не сделали, настройте проект Firebase и подключите к нему приложение. Подробную информацию можно найти в документации по Firebase AI Logic.
Как настроить проект для Android
Добавьте библиотеку Firebase AI Logic и зависимости Проверки приложений в файл build.gradle.kts или build.gradle на уровне приложения. Для управления версиями библиотек используйте Firebase Android BoM.
dependencies {
// Import the Firebase BoM
implementation(platform("com.google.firebase:firebase-bom:35.1.0"))
// Add the dependencies for the Firebase AI Logic and App Check libraries
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation("com.google.firebase:firebase-ai")
implementation("com.google.firebase:firebase-appcheck-debug")
}
Добавив зависимости, синхронизируйте проект для Android с Gradle.
Как настроить отладочного поставщика Проверки приложений для локальной разработки
С начала июля 2026 года в рамках пошаговой настройки AI Logic в консоли Firebase для защиты Gemini API автоматически применяется проверка приложений Firebase. Для локальной разработки необходимо настроить отладочный поставщик Проверки приложений, чтобы обходить аттестацию, сохраняя при этом принудительное применение Проверки приложений.
В отладочной сборке настройте Проверку приложений на использование фабрики отладочных поставщиков:
Kotlin
Firebase.initialize(context = this) Firebase.appCheck.installAppCheckProviderFactory( DebugAppCheckProviderFactory.getInstance(), )Java
FirebaseApp.initializeApp(/*context=*/ this); FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance(); firebaseAppCheck.installAppCheckProviderFactory( DebugAppCheckProviderFactory.getInstance());Получите токен отладки:
Запустите приложение в эмуляторе или на тестовом устройстве.
Найдите в журналах токен отладки Проверки приложений. Пример:
D DebugAppCheckProvider: Enter this debug secret into the allow list in the Firebase Console for your project: 123a4567-b89c-12d3-e456-789012345678Скопируйте токен (например,
123a4567-b89c-12d3-e456-789012345678).
Зарегистрируйте токен отладки в Проверке приложений:
В консоли Firebase перейдите в раздел Security (Безопасность) > App Check (Проверка приложений) > Apps (Приложения).
Найдите свое приложение, нажмите на значок дополнительного меню () и выберите Управление токенами отладки.
Зарегистрируйте токен отладки, следуя инструкциям на экране.
Подробную информацию об отладочном поставщике, в том числе о том, как получить новый токен отладки, можно найти в официальной документации по Проверке приложений.
Как интегрировать Firebase AI Logic и инициализировать генеративную модель
Добавьте разрешение RECORD_AUDIO в файл AndroidManifest.xml своего приложения:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Инициализируйте бэкенд-службу Gemini Developer API и получите доступ к LiveModel.
Используйте модель, которая поддерживает Live API, например gemini-2.5-flash-native-audio-preview-12-2025.
Доступные модели Live API перечислены в документации Firebase.
Чтобы указать голос, задайте название голоса в объекте speechConfig в рамках конфигурации модели. Если вы не укажете голос, по умолчанию будет использоваться Puck.
Kotlin
// Initialize the `LiveModel` val model = Firebase.ai(backend = GenerativeBackend.googleAI()).liveModel( modelName = "gemini-2.5-flash-native-audio-preview-12-2025", generationConfig = liveGenerationConfig { responseModality = ResponseModality.AUDIO speechConfig = SpeechConfig(voice = Voice("FENRIR")) } )
Java
// Initialize the `LiveModel`
LiveGenerativeModel model = FirebaseAI
.getInstance(GenerativeBackend.googleAI())
.liveModel(
"gemini-2.5-flash-native-audio-preview-12-2025",
new LiveGenerationConfig.Builder()
.setResponseModality(ResponseModality.AUDIO)
.setSpeechConfig(new SpeechConfig(new Voice("FENRIR"))
).build(),
null,
null
);
Вы можете определить роль, которую будет играть модель, задав системную инструкцию:
Kotlin
val systemInstruction = content { text("You are a helpful assistant, you main role is [...]") } val model = Firebase.ai(backend = GenerativeBackend.googleAI()).liveModel( modelName = "gemini-2.5-flash-native-audio-preview-12-2025", generationConfig = liveGenerationConfig { responseModality = ResponseModality.AUDIO speechConfig = SpeechConfig(voice = Voice("FENRIR")) }, systemInstruction = systemInstruction, )
Java
Content systemInstruction = new Content.Builder()
.addText("You are a helpful assistant, you main role is [...]")
.build();
LiveGenerativeModel model = FirebaseAI
.getInstance(GenerativeBackend.googleAI())
.liveModel(
"gemini-2.5-flash-native-audio-preview-12-2025",
new LiveGenerationConfig.Builder()
.setResponseModality(ResponseModality.AUDIO)
.setSpeechConfig(new SpeechConfig(new Voice("FENRIR"))
).build(),
tools, // null if you don't want to use function calling
systemInstruction
);
Вы можете дополнительно специализировать разговор с моделью, используя системные инструкции для предоставления контекста, специфичного для вашего приложения (например, истории действий пользователя в приложении).
Инициализация сеанса Live API
После создания экземпляра LiveModel вызовите model.connect(), чтобы создать объект LiveSession и установить постоянное подключение к модели с потоковой передачей с низкой задержкой. LiveSession позволяет взаимодействовать с моделью, запуская и останавливая голосовой сеанс, а также отправляя и получая текст.
Затем вы можете вызвать startAudioConversation(), чтобы начать разговор с моделью:
Kotlin
val session = model.connect() session.startAudioConversation()
Java
LiveModelFutures model = LiveModelFutures.from(liveModel);
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 двунаправленный, поэтому вы можете использовать одно и то же подключение для отправки и получения контента.
Вы также можете использовать Gemini Live API, чтобы генерировать аудио на основе разных входных модальностей:
- Отправлять текстовые и аудиозапросы.
- Отправьте видео (см. краткое руководство по приложению Firebase).
Вызов функций: подключите Gemini Live API к своему приложению
Чтобы пойти ещё дальше, вы также можете включить модель для прямого взаимодействия с логикой вашего приложения с помощью вызова функций.
Вызов функций (или инструментов) – это функция генеративного искусственного интеллекта, которая позволяет модели по собственной инициативе вызывать функции для выполнения действий. Если функция возвращает результат, модель добавляет его в контекст и использует для последующих генераций.
Чтобы реализовать вызов функций в приложении, сначала создайте объект FunctionDeclaration для каждой функции, которую вы хотите предоставить модели.
Например, чтобы предоставить Gemini доступ к функции addList, которая добавляет строку в список строк, сначала создайте переменную FunctionDeclaration с названием и кратким описанием функции и ее параметра на английском языке:
Kotlin
val itemList = mutableListOf<String>() fun addList(item: String) { itemList.add(item) } val addListFunctionDeclaration = FunctionDeclaration( name = "addList", description = "Function adding an item the list", parameters = mapOf( "item" to Schema.string("A short string describing the item to add to the list") ) )
Java
HashMap<String, Schema> addListParams = new HashMap<String, Schema>(1);
addListParams.put("item", Schema.str("A short string describing the item to add to the list"));
FunctionDeclaration addListFunctionDeclaration = new FunctionDeclaration(
"addList",
"Function adding an item the list",
addListParams,
Collections.emptyList()
);
Затем передайте этот объект FunctionDeclaration в качестве параметра Tool в модель при создании ее экземпляра:
Kotlin
val addListTool = Tool.functionDeclarations(listOf(addListFunctionDeclaration)) val model = Firebase.ai(backend = GenerativeBackend.googleAI()).liveModel( modelName = "gemini-2.5-flash-native-audio-preview-12-2025", generationConfig = liveGenerationConfig { responseModality = ResponseModality.AUDIO speechConfig = SpeechConfig(voice = Voice("FENRIR")) }, systemInstruction = systemInstruction, tools = listOf(addListTool) )
Java
LiveGenerativeModel model = FirebaseAI.getInstance(
GenerativeBackend.googleAI()).liveModel(
"gemini-2.5-flash-native-audio-preview-12-2025",
new LiveGenerationConfig.Builder()
.setResponseModality(ResponseModality.AUDIO)
.setSpeechConfig(new SpeechConfig(new Voice("FENRIR")))
.build(),
List.of(Tool.functionDeclarations(List.of(addListFunctionDeclaration))),
null,
systemInstruction
);
Наконец, реализуйте функцию-обработчик, которая будет обрабатывать вызов инструмента, сделанный моделью, и передавать ей ответ. Эта функция-обработчик, которая передается в LiveSession при вызове startAudioConversation, принимает параметр FunctionCallPart и возвращает FunctionResponsePart:
Kotlin
session.startAudioConversation(::functionCallHandler) // ... fun functionCallHandler(functionCall: FunctionCallPart): FunctionResponsePart { return when (functionCall.name) { "addList" -> { // Extract function parameter from functionCallPart val itemName = functionCall.args["item"]!!.jsonPrimitive.content // Call function with parameter addList(itemName) // Confirm the function call to the model val response = JsonObject( mapOf( "success" to JsonPrimitive(true), "message" to JsonPrimitive("Item $itemName added to the todo list") ) ) FunctionResponsePart(functionCall.name, response) } else -> { val response = JsonObject( mapOf( "error" to JsonPrimitive("Unknown function: ${functionCall.name}") ) ) FunctionResponsePart(functionCall.name, response) } } }
Java
Futures.addCallback(sessionFuture, new FutureCallback<LiveSessionFutures>() {
@RequiresPermission(Manifest.permission.RECORD_AUDIO)
@Override
@OptIn(markerClass = PublicPreviewAPI.class)
public void onSuccess(LiveSessionFutures ses) {
ses.startAudioConversation(::handleFunctionCallFuture);
}
@Override
public void onFailure(Throwable t) {
// Handle exceptions
}
}, executor);
// ...
ListenableFuture<JsonObject> handleFunctionCallFuture = Futures.transform(response, result -> {
for (FunctionCallPart functionCall : result.getFunctionCalls()) {
if (functionCall.getName().equals("addList")) {
Map<String, JsonElement> args = functionCall.getArgs();
String item =
JsonElementKt.getContentOrNull(
JsonElementKt.getJsonPrimitive(
locationJsonObject.get("item")));
return addList(item);
}
}
return null;
}, Executors.newSingleThreadExecutor());
Дальнейшие действия
- Попробуйте Gemini Live API в примере приложения Android AI catalog.
- Подробнее о Gemini Live API рассказывается в документации по Firebase AI Logic.
- Подробнее о доступных моделях Gemini…
- Подробнее о вызове функций…
- Изучите стратегии составления запросов.