Gemini Live API

ऐसे ऐप्लिकेशन के लिए Gemini Live API उपलब्ध है जिनमें रीयल-टाइम में और कम समय में आवाज़ से जुड़ी सहायता की ज़रूरत होती है. जैसे, चैटबॉट या एजेंट से बातचीत करने वाले ऐप्लिकेशन. यह API, Gemini मॉडल के लिए इनपुट और आउटपुट, दोनों को स्ट्रीम करने का बेहतर तरीका उपलब्ध कराता है. Firebase AI Logic का इस्तेमाल करके, Gemini Live API को सीधे अपने Android ऐप्लिकेशन से कॉल किया जा सकता है. इसके लिए, बैकएंड इंटिग्रेशन की ज़रूरत नहीं होती. इस गाइड में, Firebase AI Logic के साथ अपने Android ऐप्लिकेशन में Gemini Live API इस्तेमाल करने का तरीका बताया गया है.

शुरू करें

शुरू करने से पहले, पक्का करें कि आपका ऐप्लिकेशन एपीआई लेवल 21 या उसके बाद के लेवल को टारगेट करता हो.

अगर आपने पहले से ही Firebase प्रोजेक्ट सेट अप नहीं किया है, तो उसे सेट अप करें और अपने ऐप्लिकेशन को Firebase से कनेक्ट करें. ज़्यादा जानकारी के लिए, Firebase AI Logic का दस्तावेज़ देखें.

अपना Android प्रोजेक्ट सेट अप करना

अपने ऐप्लिकेशन-लेवल की build.gradle.kts या build.gradle फ़ाइल में, Firebase AI Logic लाइब्रेरी की डिपेंडेंसी जोड़ें. लाइब्रेरी के वर्शन मैनेज करने के लिए, 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")
}

डिपेंडेंसी जोड़ने के बाद, अपने Android प्रोजेक्ट को Gradle के साथ सिंक करें.

Firebase AI Logic को इंटिग्रेट करना और जनरेटिव मॉडल को शुरू करना

अपने ऐप्लिकेशन की AndroidManifest.xml फ़ाइल में RECORD_AUDIO अनुमति जोड़ें:

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

Gemini Developer API की बैकएंड सेवा शुरू करें और LiveModel को ऐक्सेस करें. लाइव एपीआई के साथ काम करने वाले मॉडल का इस्तेमाल करें. जैसे, gemini-2.0-flash-live-preview-04-09. उपलब्ध मॉडल के बारे में जानने के लिए, Firebase का दस्तावेज़ देखें.

आवाज़ तय करने के लिए, मॉडल कॉन्फ़िगरेशन के हिस्से के तौर पर, speechConfig ऑब्जेक्ट में आवाज़ का नाम सेट करें. अगर आपने कोई आवाज़ नहीं चुनी है, तो डिफ़ॉल्ट रूप से Puck को चुना जाता है.

Kotlin

// 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"))
       })

Java

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

आपके पास सिस्टम के लिए निर्देश सेट करके, मॉडल के लिए कोई पर्सोना या भूमिका तय करने का विकल्प होता है:

Kotlin

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

Java

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

सिस्टम के निर्देशों का इस्तेमाल करके, मॉडल के साथ बातचीत को और ज़्यादा बेहतर बनाया जा सकता है. इससे, आपके ऐप्लिकेशन के हिसाब से कॉन्टेक्स्ट दिया जा सकता है. उदाहरण के लिए, ऐप्लिकेशन में उपयोगकर्ता की गतिविधि का इतिहास.

Live API सेशन शुरू करना

LiveModel इंस्टेंस बनाने के बाद, model.connect() को कॉल करके LiveSession ऑब्जेक्ट बनाएं. साथ ही, कम समय में स्ट्रीम होने वाले मॉडल के साथ लगातार कनेक्शन बनाएं. LiveSession की मदद से, मॉडल के साथ इंटरैक्ट किया जा सकता है. इसके लिए, बोलकर बातचीत करने की सुविधा को शुरू और बंद किया जा सकता है. साथ ही, टेक्स्ट भेजे और पाए जा सकते हैं.

इसके बाद, मॉडल के साथ बातचीत शुरू करने के लिए, startAudioConversation() को कॉल करें:

Kotlin

val session = model.connect()
session.startAudioConversation()

Java

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 का इस्तेमाल करके, टेक्स्ट से स्ट्रीम किया गया ऑडियो जनरेट किया जा सकता है और स्ट्रीम किए गए ऑडियो से टेक्स्ट जनरेट किया जा सकता है. ध्यान दें कि Live API, दोनों दिशाओं में काम करता है. इसलिए, कॉन्टेंट भेजने और पाने के लिए एक ही कनेक्शन का इस्तेमाल किया जाता है. आने वाले समय में, मॉडल को इमेज और लाइव वीडियो स्ट्रीम भी भेजी जा सकेंगी.

फ़ंक्शन कॉलिंग: Gemini Live API को अपने ऐप्लिकेशन से कनेक्ट करें

इसके अलावा, फ़ंक्शन कॉलिंग का इस्तेमाल करके, मॉडल को सीधे तौर पर अपने ऐप्लिकेशन के लॉजिक के साथ इंटरैक्ट करने की सुविधा भी चालू की जा सकती है.

फ़ंक्शन कॉलिंग (या टूल कॉलिंग), जनरेटिव एआई को लागू करने की एक सुविधा है. इसकी मदद से मॉडल, कार्रवाइयां करने के लिए अपने-आप फ़ंक्शन कॉल कर सकता है. अगर फ़ंक्शन का कोई आउटपुट है, तो मॉडल उसे अपने कॉन्टेक्स्ट में जोड़ देता है. साथ ही, इसका इस्तेमाल बाद में जनरेट किए जाने वाले जवाबों के लिए करता है.

इस डायग्राम में दिखाया गया है कि Gemini Live API, उपयोगकर्ता के प्रॉम्प्ट को मॉडल से कैसे इंटरप्रेट करता है. इससे Android ऐप्लिकेशन में पहले से तय किया गया फ़ंक्शन ट्रिगर होता है. इसमें काम के आर्ग्युमेंट होते हैं. इसके बाद, मॉडल से पुष्टि करने वाला जवाब मिलता है.
पहली इमेज: इस डायग्राम में बताया गया है कि Gemini Live API, उपयोगकर्ता के प्रॉम्प्ट को मॉडल से कैसे समझवाता है. इससे Android ऐप्लिकेशन में पहले से तय किया गया फ़ंक्शन, काम के तर्कों के साथ ट्रिगर होता है. इसके बाद, मॉडल से पुष्टि करने वाला जवाब मिलता है.

अपने ऐप्लिकेशन में फ़ंक्शन कॉलिंग की सुविधा लागू करने के लिए, सबसे पहले हर उस फ़ंक्शन के लिए FunctionDeclaration ऑब्जेक्ट बनाएं जिसे आपको मॉडल के साथ शेयर करना है.

उदाहरण के लिए, Gemini को स्ट्रिंग की सूची में स्ट्रिंग जोड़ने वाले addList फ़ंक्शन के बारे में बताने के लिए, सबसे पहले FunctionDeclaration वैरिएबल बनाएं. इसके लिए, फ़ंक्शन और उसके पैरामीटर का नाम और कम शब्दों में जानकारी दें. यह जानकारी अंग्रेज़ी में होनी चाहिए:

Kotlin

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

Java

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 के तौर पर पास करें:

Kotlin

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

Java

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

आखिर में, एक हैंडलर फ़ंक्शन लागू करें, ताकि मॉडल के टूल कॉल को हैंडल किया जा सके. साथ ही, मॉडल को जवाब वापस भेजा जा सके. LiveSession को दिया गया यह हैंडलर फ़ंक्शन, startAudioConversation को कॉल करने पर FunctionCallPart पैरामीटर लेता है और FunctionResponsePart दिखाता है:

Kotlin

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

Java

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

अगले चरण