জেমিনি লাইভ API

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

শুরু করুন

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

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

আপনার Android প্রকল্প সেট আপ করুন

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

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

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

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

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

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

জেমিনি ডেভেলপার API ব্যাকএন্ড পরিষেবা শুরু করুন এবং LiveModel অ্যাক্সেস করুন। লাইভ API সমর্থন করে এমন একটি মডেল ব্যবহার করুন, যেমন gemini-2.0-flash-live-preview-04-09উপলব্ধ মডেলের জন্য ফায়ারবেস ডকুমেন্টেশন দেখুন।

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

কোটলিন

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

জাভা

// Initialize the `LiveModel`
LiveGenerativeModel model = FirebaseAI
       .getInstance(GenerativeBackend.googleAI())
       .liveModel(
              "gemini-2.0-flash-live-preview-04-09",
              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.0-flash-live-preview-04-09",
       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.0-flash-live-preview-04-09",
              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 ইন্সট্যান্স তৈরি করলে, একটি 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);

এছাড়াও, মডেলের সাথে আপনার কথোপকথনে, নোট করুন যে এটি বাধাগুলি পরিচালনা করে না। আমরা ভবিষ্যতে এটি যোগ করার ইচ্ছা আছে।

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

ফাংশন কলিং: আপনার অ্যাপে Gemini Live API সংযোগ করুন

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

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

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

আপনার অ্যাপ্লিকেশানে ফাংশন কলিং বাস্তবায়ন করতে, আপনি মডেলের সাথে প্রকাশ করতে চান এমন প্রতিটি ফাংশনের জন্য একটি 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"));

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.0-flash-live-preview-04-09",
       generationConfig = liveGenerationConfig {
          responseModality = ResponseModality.AUDIO
          speechConfig = SpeechConfig(voice= Voice("FENRIR"))
       },
       systemInstruction = systemInstruction,
       tools = listOf(addListTool)
)

জাভা

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

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