Gemini Live API

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

शुरू करें

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

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

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

अपने ऐप्लिकेशन-लेवल की build.gradle.kts या build.gradle फ़ाइल में, Firebase AI Logic लाइब्रेरी और App Check की डिपेंडेंसी जोड़ें. लाइब्रेरी के वर्शन मैनेज करने के लिए, Firebase Android बीओएम का इस्तेमाल करें.

dependencies {
  // Import the Firebase BoM
  implementation(platform("com.google.firebase:firebase-bom:35.1.0"))

  // Add the dependencies for the Firebase AI Logic and App Check libraries
  // When using the BoM, you don't specify versions in Firebase library dependencies
  implementation("com.google.firebase:firebase-ai")
  implementation("com.google.firebase:firebase-appcheck-debug")
}

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

लोकल डेवलपमेंट के लिए, App Check के डीबग प्रोवाइडर को कॉन्फ़िगर करना

जुलाई 2026 की शुरुआत से, Firebase कंसोल में एआई लॉजिक के लिए सेटअप वर्कफ़्लो के तहत, Gemini API को सुरक्षित रखने के लिए Firebase App Check अपने-आप लागू हो जाएगा. लोकल डेवलपमेंट के लिए, आपको App Check के डीबग प्रोवाइडर को कॉन्फ़िगर करना होगा. इससे, App Check को लागू करने के साथ-साथ, पुष्टि करने की प्रोसेस को बायपास किया जा सकता है.

  1. डीबग के लिए बिल्ड में, App Check को कॉन्फ़िगर करें, ताकि डीबग प्रोवाइडर फ़ैक्ट्री का इस्तेमाल किया जा सके:

    Kotlin

    Firebase.initialize(context = this)
    Firebase.appCheck.installAppCheckProviderFactory(
        DebugAppCheckProviderFactory.getInstance(),
    )
    

    Java

    FirebaseApp.initializeApp(/*context=*/ this);
    FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance();
    firebaseAppCheck.installAppCheckProviderFactory(
            DebugAppCheckProviderFactory.getInstance());
    
  2. अपना डीबग टोकन पाना:

    1. अपने ऐप्लिकेशन को एम्युलेटर या टेस्ट डिवाइस पर चलाएं.

    2. अपने लॉग में App Check डीबग टोकन देखें. उदाहरण के लिए:

      D DebugAppCheckProvider: Enter this debug secret into the allow list
      in the Firebase Console for your project: 123a4567-b89c-12d3-e456-789012345678
      
    3. टोकन को कॉपी करें (उदाहरण के लिए, 123a4567-b89c-12d3-e456-789012345678).

  3. App Check में अपना डीबग टोकन रजिस्टर करें:

    1. Firebase कंसोल में, सुरक्षा > App Check > ऐप्लिकेशन टैब पर जाएं.

    2. अपना ऐप्लिकेशन ढूंढें और ओवरफ़्लो मेन्यू () पर क्लिक करें. इसके बाद, डीबग टोकन मैनेज करें को चुनें.

    3. डीबग टोकन को रजिस्टर करने के लिए, स्क्रीन पर दिए गए निर्देशों का पालन करें.

डीबग प्रोवाइडर के बारे में ज़्यादा जानकारी के लिए, App Check के आधिकारिक दस्तावेज़ देखें. इसमें नया डीबग टोकन पाने का तरीका भी बताया गया है.

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

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

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

Gemini Developer API की बैकएंड सेवा को शुरू करें और LiveModel को ऐक्सेस करें. Live API के साथ काम करने वाले किसी मॉडल का इस्तेमाल करें, जैसे कि gemini-2.5-flash-native-audio-preview-12-2025. उपलब्ध Live API मॉडल के लिए, Firebase का दस्तावेज़ देखें.

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

Kotlin

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

Java

// Initialize the `LiveModel`
LiveGenerativeModel model = FirebaseAI
       .getInstance(GenerativeBackend.googleAI())
       .liveModel(
              "gemini-2.5-flash-native-audio-preview-12-2025",
              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.5-flash-native-audio-preview-12-2025",
    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.5-flash-native-audio-preview-12-2025",
              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() को कॉल करके, model:

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

मॉडल के साथ बातचीत करते समय, ध्यान रखें कि यह रुकावटों को हैंडल नहीं करता. साथ ही, Live API दोनों तरफ़ से काम करता है. इसलिए, कॉन्टेंट भेजने और पाने के लिए एक ही कनेक्शन का इस्तेमाल किया जाता है.

Gemini 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.5-flash-native-audio-preview-12-2025",
    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.5-flash-native-audio-preview-12-2025",
  new LiveGenerationConfig.Builder()
        .setResponseModality(ResponseModality.AUDIO)
        .setSpeechConfig(new SpeechConfig(new Voice("FENRIR")))
        .build(),
  List.of(Tool.functionDeclarations(List.of(addListFunctionDeclaration))),
               null,
               systemInstruction
        );

आखिर में, मॉडल के टूल कॉल को मैनेज करने के लिए, एक हैंडलर फ़ंक्शन लागू करें और उसे रिस्पॉन्स वापस भेजें. startAudioConversation को कॉल करने पर, यह हैंडलर फ़ंक्शन LiveSession को दिया जाता है. यह 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());

अगले चरण