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