জেমিনি লাইভ API

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

শুরু করুন

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

যদি আপনি ইতিমধ্যেই না করে থাকেন, তাহলে একটি 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.5.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" />

জেমিনি ডেভেলপার API ব্যাকএন্ড পরিষেবাটি শুরু করুন এবং LiveModel অ্যাক্সেস করুন। এমন একটি মডেল ব্যবহার করুন যা Live API সমর্থন করে, যেমন gemini-live-2.5-flash-previewউপলব্ধ মডেলগুলির জন্য Firebase ডকুমেন্টেশন দেখুন।

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

কোটলিন

// Initialize the `LiveModel`
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).liveModel(
       modelName = "gemini-live-2.5-flash-preview",
       generationConfig = liveGenerationConfig {
          responseModality = ResponseModality.AUDIO
          speechConfig = SpeechConfig(voice = Voice("FENRIR"))
       })

জাভা

// Initialize the `LiveModel`
LiveGenerativeModel model = FirebaseAI
       .getInstance(GenerativeBackend.googleAI())
       .liveModel(
              "gemini-live-2.5-flash-preview",
              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-live-2.5-flash-preview",
       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-live-2.5-flash-preview",
              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
);

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

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

LiveModel ইনস্ট্যান্স তৈরি করার পর, model.connect() কল করে একটি LiveSession অবজেক্ট তৈরি করুন এবং কম-বিলম্বিত স্ট্রিমিং সহ মডেলের সাথে একটি স্থায়ী সংযোগ স্থাপন করুন। 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);

এছাড়াও, মডেলের সাথে আপনার কথোপকথনে, মনে রাখবেন যে এটি কোনও বাধা পরিচালনা করে না।

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

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

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

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

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

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

উদাহরণস্বরূপ, একটি addList ফাংশন এক্সপোজ করতে যা Gemini-তে স্ট্রিং তালিকার সাথে একটি স্ট্রিং যুক্ত করে, একটি 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 as a Tool মডেলটিতে পাস করুন:

কোটলিন

val addListTool = Tool.functionDeclarations(listOf(addListFunctionDeclaration))

val model = Firebase.ai(backend = GenerativeBackend.googleAI()).liveModel(
       modelName = "gemini-live-2.5-flash-preview",
       generationConfig = liveGenerationConfig {
          responseModality = ResponseModality.AUDIO
          speechConfig = SpeechConfig(voice= Voice("FENRIR"))
       },
       systemInstruction = systemInstruction,
       tools = listOf(addListTool)
)

জাভা

LiveGenerativeModel model = FirebaseAI.getInstance(
    GenerativeBackend.googleAI()).liveModel(
        "gemini-live-2.5-flash-preview",
  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());

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