Gemini Live API

Đối với những ứng dụng yêu cầu hỗ trợ giọng nói theo thời gian thực và có độ trễ thấp, chẳng hạn như chatbot hoặc tương tác với tác nhân, Gemini Live API cung cấp một cách tối ưu hoá để truyền cả dữ liệu đầu vào và đầu ra cho mô hình Gemini. Khi sử dụng Firebase AI Logic, bạn có thể gọi Gemini Live API trực tiếp từ ứng dụng Android mà không cần tích hợp phần phụ trợ. Hướng dẫn này trình bày cách sử dụng Gemini Live API trong ứng dụng Android bằng Firebase AI Logic.

Bắt đầu

Trước khi bắt đầu, hãy đảm bảo ứng dụng của bạn nhắm đến API cấp 23 trở lên.

Nếu bạn chưa thiết lập dự án Firebase và kết nối ứng dụng với Firebase, hãy làm việc này. Để biết thông tin chi tiết, hãy xem tài liệu về Firebase AI Logic.

Thiết lập dự án Android

Thêm thư viện Firebase AI Logic và các phần phụ thuộc của tính năng Kiểm tra ứng dụng vào tệp ở cấp ứng dụng build.gradle.kts hoặc build.gradle. Sử dụng BoM trên Android cho Firebase để quản lý các phiên bản thư viện.

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

Sau khi thêm các phần phụ thuộc, hãy đồng bộ hoá dự án Android với Gradle.

Định cấu hình nhà cung cấp gỡ lỗi của tính năng Kiểm tra ứng dụng cho quá trình phát triển cục bộ

Kể từ đầu tháng 7 năm 2026, trong quy trình thiết lập có hướng dẫn cho AI Logic trong Bảng điều khiển Firebase, tính năng Kiểm tra ứng dụng Firebase sẽ tự động được thực thi để bảo vệ Gemini API. Đối với quá trình phát triển cục bộ, bạn cần định cấu hình nhà cung cấp gỡ lỗi của tính năng Kiểm tra ứng dụng để bỏ qua quy trình chứng thực trong khi vẫn duy trì việc thực thi tính năng Kiểm tra ứng dụng.

  1. Trong bản dựng gỡ lỗi, hãy định cấu hình tính năng Kiểm tra ứng dụng để sử dụng nhà máy cung cấp gỡ lỗi:

    Kotlin

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

    Java

    FirebaseApp.initializeApp(/*context=*/ this);
    FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance();
    firebaseAppCheck.installAppCheckProviderFactory(
            DebugAppCheckProviderFactory.getInstance());
    
  2. Lấy mã thông báo gỡ lỗi:

    1. Chạy ứng dụng trong trình mô phỏng hoặc trên thiết bị kiểm thử.

    2. Tìm mã thông báo gỡ lỗi của tính năng Kiểm tra ứng dụng trong nhật ký. Ví dụ:

      D DebugAppCheckProvider: Enter this debug secret into the allow list
      in the Firebase Console for your project: 123a4567-b89c-12d3-e456-789012345678
      
    3. Sao chép mã thông báo (ví dụ: 123a4567-b89c-12d3-e456-789012345678).

  3. Đăng ký mã thông báo gỡ lỗi với tính năng Kiểm tra ứng dụng:

    1. Trong Bảng điều khiển Firebase, hãy chuyển đến thẻ Bảo mật > Kiểm tra ứng dụng > Ứng dụng.

    2. Tìm ứng dụng của bạn, nhấp vào trình đơn mục khác (), sau đó chọn Quản lý mã thông báo gỡ lỗi.

    3. Làm theo hướng dẫn trên màn hình để đăng ký mã thông báo gỡ lỗi.

Để biết thông tin chi tiết về nhà cung cấp gỡ lỗi (bao gồm cả cách lấy mã thông báo gỡ lỗi mới), hãy xem tài liệu chính thức về tính năng Kiểm tra ứng dụng.

Tích hợp Firebase AI Logic và khởi chạy mô hình tạo sinh

Thêm quyền RECORD_AUDIO vào tệp AndroidManifest.xml của ứng dụng:

<uses-permission android:name="android.permission.RECORD_AUDIO" />

Khởi chạy dịch vụ phụ trợ Gemini Developer API và truy cập vào LiveModel. Sử dụng mô hình hỗ trợ Live API, chẳng hạn như gemini-2.5-flash-native-audio-preview-12-2025. Hãy xem tài liệu về Firebase để biết các mô hình Live API hiện có.

Để chỉ định một giọng nói, hãy đặt tên giọng nói trong speechConfig đối tượng như một phần của cấu hình mô hình. Nếu bạn không chỉ định giọng nói, giá trị mặc định sẽ là 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
);

Bạn có thể tuỳ ý xác định một nhân vật hoặc vai trò mà mô hình đóng bằng cách đặt hướng dẫn hệ thống:

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

Bạn có thể chuyên biệt hoá thêm cuộc trò chuyện với mô hình bằng cách sử dụng hướng dẫn hệ thống để cung cấp bối cảnh dành riêng cho ứng dụng của bạn (ví dụ: nhật ký hoạt động trong ứng dụng của người dùng).

Khởi chạy phiên Live API

Sau khi tạo thực thể LiveModel, hãy gọi model.connect() để tạo đối tượng LiveSession và thiết lập kết nối liên tục với mô hình bằng tính năng truyền trực tuyến có độ trễ thấp. LiveSession cho phép bạn tương tác với mô hình bằng cách bắt đầu và dừng phiên giọng nói, đồng thời gửi và nhận văn bản.

Sau đó, bạn có thể gọi startAudioConversation() để bắt đầu cuộc trò chuyện với mô hình:

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

Trong cuộc trò chuyện với mô hình, hãy lưu ý rằng mô hình này không xử lý các trường hợp bị gián đoạn. Ngoài ra, Live API là hai chiều nên bạn sử dụng cùng một kết nối để gửi và nhận nội dung.

Bạn cũng có thể sử dụng Gemini Live API để tạo âm thanh từ nhiều phương thức đầu vào:

Gọi hàm: kết nối Gemini Live API với ứng dụng của bạn

Để tiến thêm một bước, bạn cũng có thể cho phép mô hình tương tác trực tiếp với logic của ứng dụng bằng cách gọi hàm.

Gọi hàm (hoặc gọi công cụ) là một tính năng của các cách triển khai AI tạo sinh cho phép mô hình tự động gọi các hàm để thực hiện hành động. Nếu hàm có dữ liệu đầu ra, mô hình sẽ thêm dữ liệu đó vào ngữ cảnh và sử dụng cho các thế hệ tiếp theo.

Sơ đồ minh hoạ cách Gemini Live API cho phép một mô hình diễn giải câu lệnh của người dùng, kích hoạt một hàm được xác định trước bằng các đối số liên quan trong một ứng dụng Android, sau đó nhận được phản hồi xác nhận từ mô hình.
Hình 1: Sơ đồ minh hoạ cách Gemini Live API cho phép mô hình diễn giải câu lệnh của người dùng, kích hoạt một hàm được xác định trước với các đối số liên quan trong ứng dụng Android, sau đó nhận phản hồi xác nhận từ mô hình.

Để triển khai tính năng gọi hàm trong ứng dụng, hãy bắt đầu bằng cách tạo đối tượng FunctionDeclaration cho từng hàm mà bạn muốn hiển thị cho mô hình.

Ví dụ: để hiển thị hàm addList nối một chuỗi vào danh sách chuỗi cho Gemini, hãy bắt đầu bằng cách tạo biến FunctionDeclaration có tên và nội dung mô tả ngắn bằng tiếng Anh đơn giản về hàm và tham số của hàm đó:

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

Sau đó, hãy truyền FunctionDeclaration này dưới dạng Tool cho mô hình khi bạn tạo thực thể:

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()
        .setResponseModalities(ResponseModality.AUDIO)
        .setSpeechConfig(new SpeechConfig(new Voice("FENRIR")))
        .build(),
  List.of(Tool.functionDeclarations(List.of(addListFunctionDeclaration))),
               null,
               systemInstruction
        );

Cuối cùng, hãy triển khai hàm trình xử lý để xử lý lệnh gọi công cụ mà mô hình thực hiện và truyền phản hồi trở lại. Hàm trình xử lý này được cung cấp cho LiveSession khi bạn gọi startAudioConversation, lấy tham số FunctionCallPart và trả về 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());

Các bước tiếp theo