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 и зависимости App Check в файл build.gradle.kts или build.gradle на уровне приложения. Используйте Firebase Android BoM для управления версиями библиотек.

dependencies {
  // Import the Firebase BoM
  implementation(platform("com.google.firebase:firebase-bom:34.19.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.

Как настроить поставщика данных для отладки App Check при локальной разработке

С начала июля 2026 года в рамках пошаговой настройки логики ИИ в консоли Firebase будет автоматически включаться Проверка приложений Firebase для защиты Gemini API. Для локальной разработки вам нужно настроить поставщика данных для отладки App Check, чтобы пропускать подтверждение, но при этом сохранять принудительное применение App Check.

  1. В отладочной сборке настройте App Check на использование фабрики поставщика отладки:

    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. Найдите в журналах токен отладки App Check. Пример:

      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. Зарегистрируйте токен отладки в App Check:

    1. В консоли Firebase выберите Безопасность > Проверка приложений > вкладка Приложения.

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

    3. Следуйте инструкциям на экране, чтобы зарегистрировать токен отладки.

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

Как интегрировать 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. Ознакомьтесь с документацией Firebase о доступных моделях Live API.

Чтобы указать голос, задайте название голоса в объекте 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);

Во время разговора с моделью не перебивайте ее. Кроме того, действующий 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());

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