Gemini Live API

Для приложений, которым требуется поддержка голосового взаимодействия в реальном времени с низкой задержкой, например чат-ботов или агентов, 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. Для локальной разработки необходимо настроить отладочный поставщик Проверки приложений, чтобы обходить аттестацию, сохраняя при этом принудительное применение Проверки приложений.

  1. В отладочной сборке настройте Проверку приложений на использование фабрики отладочных поставщиков:

    Kotlin

    Firebase.initialize(context = this)
    Firebase.appCheck.installAppCheckProviderFactory(
        DebugAppCheckProviderFactory.getInstance(),
    )
    

    Java

    FirebaseApp.initializeApp(/*context=*/ this);
    FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance();
    firebaseAppCheck.installAppCheckProviderFactory(
            DebugAppCheckProviderFactory.getInstance());
    
  2. Получите токен отладки:

    1. Запустите приложение в эмуляторе или на тестовом устройстве.

    2. Найдите в журналах токен отладки Проверки приложений. Пример:

      D DebugAppCheckProvider: Enter this debug secret into the allow list
      in the Firebase Console for your project: 123a4567-b89c-12d3-e456-789012345678
      
    3. Скопируйте токен (например, 123a4567-b89c-12d3-e456-789012345678).

  3. Зарегистрируйте токен отладки в Проверке приложений:

    1. В консоли Firebase перейдите в раздел Security (Безопасность) > App Check (Проверка приложений) > Apps (Приложения).

    2. Найдите свое приложение, нажмите на значок дополнительного меню () и выберите Управление токенами отладки.

    3. Зарегистрируйте токен отладки, следуя инструкциям на экране.

Подробную информацию об отладочном поставщике, в том числе о том, как получить новый токен отладки, можно найти в официальной документации по Проверке приложений.

Как интегрировать 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, чтобы генерировать аудио на основе разных входных модальностей:

Вызов функций: подключите Gemini Live API к своему приложению

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

Вызов функций (или инструментов) – это функция генеративного искусственного интеллекта, которая позволяет модели по собственной инициативе вызывать функции для выполнения действий. Если функция возвращает результат, модель добавляет его в контекст и использует для последующих генераций.

Диаграмма, иллюстрирующая, как Gemini Live API позволяет модели интерпретировать запрос пользователя, запуская предопределенную функцию с соответствующими аргументами в приложении Android, которое затем получает ответ с подтверждением от модели.
Рисунок 1. Диаграмма, иллюстрирующая, как Gemini Live API позволяет модели интерпретировать запрос пользователя, запуская предопределенную функцию с соответствующими аргументами в приложении Android, которое затем получает ответ с подтверждением от модели.

Чтобы реализовать вызов функций в приложении, сначала создайте объект 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());

Дальнейшие действия