যেসব অ্যাপ্লিকেশনের জন্য রিয়েল-টাইম এবং কম ল্যাটেন্সি ভয়েস সাপোর্ট প্রয়োজন, যেমন চ্যাটবট বা এজেন্টিক ইন্টারঅ্যাকশন, তাদের জন্য জেমিনি লাইভ 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());
পরবর্তী পদক্ষেপ
- অ্যান্ড্রয়েড এআই ক্যাটালগ নমুনা অ্যাপে জেমিনি লাইভ এপিআই দিয়ে খেলুন।
- জেমিনি লাইভ এপিআই সম্পর্কে আরও পড়ুন ফায়ারবেস এআই লজিক ডকুমেন্টেশনে ।
- উপলব্ধ জেমিনি মডেলগুলি সম্পর্কে আরও জানুন।
- ফাংশন কলিং সম্পর্কে আরও জানুন।
- দ্রুত নকশা কৌশলগুলি অন্বেষণ করুন।