জেমিনি লাইভ API

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

শুরু করুন

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

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

আপনার অ্যান্ড্রয়েড প্রজেক্ট সেট আপ করুন

আপনার অ্যাপ-লেভেলের build.gradle.kts অথবা build.gradle ফাইলে Firebase AI Logic লাইব্রেরি ডিপেন্ডেন্সিটি যোগ করুন। লাইব্রেরির ভার্সনগুলো পরিচালনা করতে Firebase Android BoM ব্যবহার করুন।

dependencies {
  // Import the Firebase BoM
  implementation(platform("com.google.firebase:firebase-bom:34.10.0"))
  // Add the dependency for the Firebase AI Logic library
  // When using the BoM, you don't specify versions in Firebase library dependencies
  implementation("com.google.firebase:firebase-ai")
}

ডিপেন্ডেন্সি যোগ করার পর, আপনার অ্যান্ড্রয়েড প্রজেক্টটি গ্রেডলের সাথে সিঙ্ক করুন।

ফায়ারবেস এআই লজিক একীভূত করুন এবং একটি জেনারেটিভ মডেল শুরু করুন।

আপনার অ্যাপ্লিকেশনের 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উপলব্ধ মডেলগুলির জন্য Firebase ডকুমেন্টেশন দেখুন।

ভয়েস নির্দিষ্ট করতে, মডেল কনফিগারেশনের অংশ হিসেবে speechConfig অবজেক্টের মধ্যে ভয়েসের নামটি সেট করুন। যদি আপনি কোনো ভয়েস নির্দিষ্ট না করেন, তাহলে ডিফল্ট ভয়েস হবে Puck

কোটলিন

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

আপনি চাইলে একটি সিস্টেম নির্দেশনা সেট করার মাধ্যমে মডেলটির জন্য একটি ব্যক্তিত্ব বা ভূমিকা নির্ধারণ করতে পারেন:

কোটলিন

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

আপনি সিস্টেম নির্দেশাবলী ব্যবহার করে আপনার অ্যাপের জন্য নির্দিষ্ট প্রাসঙ্গিক তথ্য (যেমন, ব্যবহারকারীর অ্যাপের ভেতরের কার্যকলাপের ইতিহাস) প্রদান করার মাধ্যমে মডেলের সাথে কথোপকথনটিকে আরও সুনির্দিষ্ট করতে পারেন।

একটি লাইভ এপিআই সেশন শুরু করুন

LiveModel ইনস্ট্যান্স তৈরি করার পর, একটি LiveSession অবজেক্ট তৈরি করতে এবং লো-ল্যাটেন্সি স্ট্রিমিংয়ের মাধ্যমে মডেলের সাথে একটি স্থায়ী সংযোগ স্থাপন করতে model.connect() কল করুন। LiveSession আপনাকে ভয়েস সেশন শুরু ও বন্ধ করা এবং টেক্সট পাঠানো ও গ্রহণ করার মাধ্যমে মডেলের সাথে ইন্টারঅ্যাক্ট করতে দেয়।

এরপর আপনি মডেলের সাথে কথোপকথন শুরু করতে startAudioConversation() কল করতে পারেন:

কোটলিন

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

মডেলের সাথে কথোপকথনের সময় মনে রাখবেন যে এটি কোনো বাধা সামলাতে পারে না। এছাড়াও, লাইভ এপিআই দ্বিমুখী , তাই আপনি কন্টেন্ট পাঠানো এবং গ্রহণ করার জন্য একই সংযোগ ব্যবহার করেন।

এছাড়াও আপনি জেমিনি লাইভ এপিআই ব্যবহার করে বিভিন্ন ইনপুট মোডালিটি থেকে অডিও তৈরি করতে পারেন:

ফাংশন কলিং: আপনার অ্যাপের সাথে জেমিনি লাইভ এপিআই সংযুক্ত করুন।

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

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

এই ডায়াগ্রামটি ব্যাখ্যা করে যে কীভাবে জেমিনি লাইভ এপিআই ব্যবহারকারীর একটি প্রম্পটকে একটি মডেল দ্বারা ব্যাখ্যা করতে দেয়, যা একটি অ্যান্ড্রয়েড অ্যাপে প্রাসঙ্গিক আর্গুমেন্টসহ একটি পূর্বনির্ধারিত ফাংশনকে ট্রিগার করে, এবং এরপর অ্যাপটি মডেল থেকে একটি নিশ্চিতকরণ প্রতিক্রিয়া গ্রহণ করে।
চিত্র ১: একটি ডায়াগ্রাম যা ব্যাখ্যা করে কিভাবে জেমিনি লাইভ এপিআই ব্যবহারকারীর কোনো প্রম্পটকে একটি মডেল দ্বারা ব্যাখ্যা করতে দেয়, যা একটি অ্যান্ড্রয়েড অ্যাপে প্রাসঙ্গিক আর্গুমেন্টসহ একটি পূর্বনির্ধারিত ফাংশনকে ট্রিগার করে এবং অ্যাপটি পরবর্তীতে মডেলের কাছ থেকে একটি নিশ্চিতকরণ প্রতিক্রিয়া গ্রহণ করে।

আপনার অ্যাপে ফাংশন কলিং বাস্তবায়ন করতে, প্রথমে মডেলের কাছে প্রকাশ করতে চান এমন প্রতিটি ফাংশনের জন্য একটি FunctionDeclaration অবজেক্ট তৈরি করুন।

উদাহরণস্বরূপ, জেমিনিতে স্ট্রিং-এর একটি তালিকায় একটি স্ট্রিং যুক্ত করার জন্য একটি addList ফাংশন প্রকাশ করতে, প্রথমে একটি FunctionDeclaration ভেরিয়েবল তৈরি করুন। এতে একটি নাম এবং ফাংশন ও তার প্যারামিটারের একটি সংক্ষিপ্ত বিবরণ সহজ ইংরেজিতে লিখুন:

কোটলিন

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"));
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 হিসেবে পাস করুন:

কোটলিন

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

অবশেষে, মডেলের করা টুল কলটি পরিচালনা করতে এবং প্রতিক্রিয়াটি ফেরত পাঠাতে একটি হ্যান্ডলার ফাংশন প্রয়োগ করুন। startAudioConversation কল করার সময় LiveSession এ সরবরাহ করা এই হ্যান্ডলার ফাংশনটি একটি FunctionCallPart প্যারামিটার গ্রহণ করে এবং FunctionResponsePart রিটার্ন করে:

কোটলিন

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

পরবর্তী পদক্ষেপ