Gemini Live API

চ্যাটবট বা এজেন্টিক ইন্টার‍্যাকশনের মতো যেসব অ্যাপ্লিকেশনের জন্য রিয়েল-টাইম এবং কম লেটেন্সি ভয়েস সাপোর্ট প্রয়োজন, সেগুলির ক্ষেত্রে Gemini Live API, Gemini মডেলের জন্য ইনপুট এবং আউটপুট উভয়ই স্ট্রিম করার একটি অপ্টিমাইজ করা উপায় প্রদান করে। Firebase AI Logic ব্যবহার করে, আপনি ব্যাকএন্ড ইন্টিগ্রেশনের প্রয়োজন ছাড়াই সরাসরি আপনার Android অ্যাপ থেকে Gemini Live API কল করতে পারবেন। এই নির্দেশিকা আপনাকে দেখায় যে কীভাবে Firebase AI Logic-এর মাধ্যমে আপনার Android অ্যাপে Gemini Live API ব্যবহার করবেন।

শুরু করুন

শুরু করার আগে, আপনার অ্যাপ API লেভেল ২৩ বা তার বেশি টার্গেট করছে কিনা তা নিশ্চিত করুন।

আপনি আগে থেকে না করে থাকলে, Firebase প্রোজেক্ট সেট-আপ করুন এবং আপনার অ্যাপ Firebase-এর সাথে কানেক্ট করুন। আরও জানতে, Firebase AI Logic ডকুমেন্টেশন দেখুন।

আপনার Android প্রোজেক্ট সেট-আপ করা

আপনার অ্যাপ-লেভেল build.gradle.kts বা build.gradle ফাইলে Firebase AI Logic লাইব্রেরি এবং App Check ডিপেন্ডেন্সি যোগ করুন। লাইব্রেরি ভার্সন ম্যানেজ করতে 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")
}

ডিপেন্ডেন্সি যোগ করার পরে, Gradle-এর সাথে আপনার Android প্রোজেক্ট সিঙ্ক করুন।

স্থানীয় ডেভেলপমেন্টের জন্য App Check ডিবাগ প্রোভাইডার কনফিগার করা

২০২৬ সালের জুলাই মাসের শুরু থেকে, Firebase কনসোলে AI Logic-এর জন্য গাইডেড সেট-আপ ওয়ার্কফ্লোর অংশ হিসেবে, Gemini API সুরক্ষিত রাখতে Firebase App Check অটোমেটিক এনফোর্স করা হয়। লোকাল ডেভেলপমেন্টের জন্য, আপনাকে App Check-এর এনফোর্সমেন্ট বজায় রেখে অ্যাটেস্টেশন বাইপাস করতে App Check ডিবাগ প্রোভাইডার কনফিগার করতে হবে।

  1. আপনার ডিবাগ বিল্ডে, ডিবাগ প্রোভাইডার ফ্যাক্টরি ব্যবহার করার জন্য App Check কনফিগার করুন:

    Kotlin

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

    জাভা

    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 কনসোলে, নিরাপত্তা > App Check > অ্যাপ ট্যাব বিকল্পে যান।

    2. আপনার অ্যাপ খুঁজে নিন, ওভারফ্লো মেনুতে () ক্লিক করুন এবং তারপরে ডিবাগ টোকেন ম্যানেজ করুন বিকল্প বেছে নিন।

    3. আপনার ডিবাগ টোকেন রেজিস্টার করতে অন-স্ক্রিন নির্দেশাবলী অনুসরণ করুন।

ডিবাগ প্রোভাইডার সম্পর্কে বিস্তারিত জানতে (নতুন ডিবাগ টোকেন কীভাবে পাবেন তা সহ), অফিসিয়াল App Check ডকুমেন্ট দেখুন।

Firebase AI Logic ইন্টিগ্রেট করা এবং জেনারেটিভ মডেল শুরু করা

আপনার অ্যাপ্লিকেশনের AndroidManifest.xml ফাইলে RECORD_AUDIO অনুমতি যোগ করুন:

<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"))
    }
)

জাভা

// 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,
)

জাভা

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

জাভা

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 কানেক্ট করুন

আরও এক ধাপ এগিয়ে যেতে, আপনি ফাংশন কলিং ব্যবহার করে আপনার অ্যাপের লজিকের সাথে সরাসরি ইন্টার‍্যাক্ট করার জন্য মডেলটিকে চালু করতে পারেন।

ফাংশন কলিং (বা টুল কলিং) হল জেনারেটিভ AI প্রয়োগের একটি ফিচার যা মডেলকে অ্যাকশন পারফর্ম করার জন্য নিজস্ব উদ্যোগে ফাংশন কল করার অনুমতি দেয়। ফাংশনের কোনও আউটপুট থাকলে, মডেল সেটি নিজের প্রসঙ্গে যোগ করে এবং পরবর্তী জেনারেশনের জন্য ব্যবহার করে।

Gemini Live API কীভাবে কোনও ব্যবহারকারীর প্রম্পটকে মডেলের মাধ্যমে ব্যাখ্যা করতে দেয়,
       Android অ্যাপে প্রাসঙ্গিক আর্গুমেন্ট সহ আগে থেকে নির্ধারিত ফাংশন ট্রিগার করে,
       যা পরে মডেল থেকে কনফার্মেশন রেসপন্স পায়,
       তা এই ডায়াগ্রামে দেখানো হয়েছে।
ছবি ১: 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")
    )
)

জাভা

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

জাভা

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

সবশেষে, মডেলের করা টুল কল ম্যানেজ করতে এবং সেটির উত্তর ফেরত পাঠাতে একটি হ্যান্ডলার ফাংশন প্রয়োগ করুন। আপনি startAudioConversation-এ কল করলে, LiveSession-এ প্রদান করা এই হ্যান্ডলার ফাংশন, 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)
        }
    }
}

জাভা

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

পরবর্তী ধাপ