Live API

লাইভ এপিআই মিথুনের সাথে কম লেটেন্সি দ্বিমুখী ভয়েস এবং ভিডিও ইন্টারঅ্যাকশন সক্ষম করে। লাইভ API ব্যবহার করে, আপনি শেষ ব্যবহারকারীদের প্রাকৃতিক, মানুষের মতো ভয়েস কথোপকথনের অভিজ্ঞতা এবং ভয়েস কমান্ড ব্যবহার করে মডেলের প্রতিক্রিয়াগুলিকে বাধা দেওয়ার ক্ষমতা প্রদান করতে পারেন। মডেলটি পাঠ্য, অডিও এবং ভিডিও ইনপুট প্রক্রিয়া করতে পারে এবং এটি পাঠ্য এবং অডিও আউটপুট সরবরাহ করতে পারে।

আপনি Google AI স্টুডিওতে লাইভ API ব্যবহার করে দেখতে পারেন।

নতুন কি

লাইভ এপিআইতে নতুন বৈশিষ্ট্য এবং ক্ষমতা রয়েছে!

নতুন ক্ষমতা:

  • কনফিগারযোগ্য আউটপুট ভাষা সহ দুটি নতুন ভয়েস এবং 30টি নতুন ভাষা
  • কনফিগারযোগ্য চিত্র রেজোলিউশন 66/256 টোকেন
  • কনফিগারযোগ্য পালা কভারেজ: সমস্ত ইনপুট সব সময় পাঠান বা শুধুমাত্র যখন ব্যবহারকারী কথা বলছেন
  • ইনপুট মডেলকে বাধা দেবে কিনা তা কনফিগার করুন
  • কনফিগারযোগ্য ভয়েস অ্যাক্টিভিটি সনাক্তকরণ এবং টার্ন সিগন্যালিং শেষ করার জন্য নতুন ক্লায়েন্ট ইভেন্ট
  • টোকেন গণনা
  • স্ট্রিমের শেষের সংকেত দেওয়ার জন্য একটি ক্লায়েন্ট ইভেন্ট
  • টেক্সট স্ট্রিমিং
  • 24 ঘন্টার জন্য সার্ভারে সংরক্ষিত সেশন ডেটা সহ কনফিগারযোগ্য সেশন পুনঃসূচনা
  • একটি স্লাইডিং প্রসঙ্গ উইন্ডো সহ দীর্ঘতর সেশন সমর্থন

নতুন ক্লায়েন্ট ইভেন্ট:

  • অডিও স্ট্রিম/মাইক বন্ধ
  • ম্যানুয়ালি টার্ন ট্রানজিশন নিয়ন্ত্রণের জন্য কার্যকলাপ শুরু/শেষ ইভেন্ট

নতুন সার্ভার ইভেন্ট:

  • একটি সেশন পুনরায় আরম্ভ করার প্রয়োজনের ইঙ্গিত দিয়ে বিজ্ঞপ্তি থেকে দূরে যান
  • প্রজন্ম সম্পূর্ণ

লাইভ API ব্যবহার করুন

এই বিভাগটি বর্ণনা করে যে কীভাবে আমাদের SDK-এর সাথে লাইভ API ব্যবহার করতে হয়। অন্তর্নিহিত WebSockets API সম্পর্কে আরও তথ্যের জন্য, WebSockets API রেফারেন্স দেখুন।

পাঠান এবং টেক্সট গ্রহণ

import asyncio
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

config = {"response_modalities": ["TEXT"]}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        while True:
            message = input("User> ")
            if message.lower() == "exit":
                break
            await session.send_client_content(
                turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
            )

            async for response in session.receive():
                if response.text is not None:
                    print(response.text, end="")

if __name__ == "__main__":
    asyncio.run(main())

অডিও গ্রহণ

নিচের উদাহরণটি দেখায় কিভাবে অডিও ডেটা গ্রহণ করতে হয় এবং এটি একটি .wav ফাইলে লিখতে হয়।

import asyncio
import wave
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'})
model = "gemini-2.0-flash-live-001"

config = {"response_modalities": ["AUDIO"]}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        wf = wave.open("audio.wav", "wb")
        wf.setnchannels(1)
        wf.setsampwidth(2)
        wf.setframerate(24000)

        message = "Hello? Gemini are you there?"
        await session.send_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )

        async for idx,response in async_enumerate(session.receive()):
            if response.data is not None:
                wf.writeframes(response.data)

            # Un-comment this code to print audio data info
            # if response.server_content.model_turn is not None:
            #      print(response.server_content.model_turn.parts[0].inline_data.mime_type)

        wf.close()

if __name__ == "__main__":
    asyncio.run(main())

অডিও ফরম্যাট

লাইভ API নিম্নলিখিত অডিও ফরম্যাট সমর্থন করে:

  • ইনপুট অডিও ফরম্যাট: Raw 16 bit PCM অডিও 16kHz লিটল-এন্ডিয়ান
  • আউটপুট অডিও ফরম্যাট: 24kHz লিটল-এন্ডিয়ানে কাঁচা 16 বিট পিসিএম অডিও

অডিও এবং ভিডিও স্ট্রিম করুন

সিস্টেম নির্দেশাবলী

সিস্টেম নির্দেশাবলী আপনাকে আপনার নির্দিষ্ট প্রয়োজন এবং ব্যবহারের ক্ষেত্রের উপর ভিত্তি করে একটি মডেলের আচরণ পরিচালনা করতে দেয়। সিস্টেম নির্দেশাবলী সেটআপ কনফিগারেশনে সেট করা যেতে পারে এবং পুরো সেশনের জন্য কার্যকর থাকবে।

from google.genai import types

config = {
    "system_instruction": types.Content(
        parts=[
            types.Part(
                text="You are a helpful assistant and answer in a friendly tone."
            )
        ]
    ),
    "response_modalities": ["TEXT"],
}

ইনক্রিমেন্টাল কন্টেন্ট আপডেট

টেক্সট ইনপুট পাঠাতে, সেশন প্রসঙ্গ স্থাপন বা সেশন প্রসঙ্গ পুনরুদ্ধার করতে ক্রমবর্ধমান আপডেট ব্যবহার করুন। সংক্ষিপ্ত প্রসঙ্গের জন্য আপনি ঘটনার সঠিক ক্রম উপস্থাপন করতে পালাক্রমে মিথস্ক্রিয়া পাঠাতে পারেন:

পাইথন JSON
turns = [
    {"role": "user", "parts": [{"text": "What is the capital of France?"}]},
    {"role": "model", "parts": [{"text": "Paris"}]},
]

await session.send_client_content(turns=turns, turn_complete=False)

turns = [{"role": "user", "parts": [{"text": "What is the capital of Germany?"}]}]

await session.send_client_content(turns=turns, turn_complete=True)
{
  "clientContent": {
    "turns": [
      {
        "parts":[
          {
            "text": ""
          }
        ],
        "role":"user"
      },
      {
        "parts":[
          {
            "text": ""
          }
        ],
        "role":"model"
      }
    ],
    "turnComplete": true
  }
}

দীর্ঘ প্রসঙ্গগুলির জন্য পরবর্তী মিথস্ক্রিয়াগুলির জন্য প্রসঙ্গ উইন্ডোটি মুক্ত করতে একটি একক বার্তা সারাংশ প্রদান করার পরামর্শ দেওয়া হয়।

কণ্ঠস্বর পরিবর্তন করুন

লাইভ এপিআই নিম্নলিখিত ভয়েসগুলিকে সমর্থন করে: পাক, চ্যারন, কোর, ফেনরির, এওডি, লেডা, ওরাস এবং জেফির।

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

পাইথন JSON
from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    speech_config=types.SpeechConfig(
        voice_config=types.VoiceConfig(
            prebuilt_voice_config=types.PrebuiltVoiceConfig(voice_name="Kore")
        )
    )
)
{
  "voiceConfig": {
    "prebuiltVoiceConfig": {
      "voiceName": "Kore"
    }
  }
}

ভাষা পরিবর্তন করুন

লাইভ API একাধিক ভাষা সমর্থন করে।

ভাষা পরিবর্তন করতে, সেশন কনফিগারেশনের অংশ হিসাবে speechConfig অবজেক্টের মধ্যে ভাষা কোড সেট করুন:

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    speech_config=types.SpeechConfig(
        language_code="de-DE",
    )
)

ফাংশন কলিং ব্যবহার করুন

আপনি লাইভ এপিআই দিয়ে সরঞ্জামগুলি সংজ্ঞায়িত করতে পারেন। ফাংশন কলিং সম্পর্কে আরও জানতে ফাংশন কলিং টিউটোরিয়াল দেখুন।

সরঞ্জামগুলিকে সেশন কনফিগারেশনের অংশ হিসাবে সংজ্ঞায়িত করা আবশ্যক:

config = types.LiveConnectConfig(
    response_modalities=["TEXT"],
    tools=[set_light_values]
)

async with client.aio.live.connect(model=model, config=config) as session:
    await session.send_client_content(
        turns={
            "role": "user",
            "parts": [{"text": "Turn the lights down to a romantic level"}],
        },
        turn_complete=True,
    )

    async for response in session.receive():
        print(response.tool_call)

একটি একক প্রম্পট থেকে, মডেলটি একাধিক ফাংশন কল এবং তাদের আউটপুট চেইন করার জন্য প্রয়োজনীয় কোড তৈরি করতে পারে। এই কোডটি একটি স্যান্ডবক্স পরিবেশে কার্যকর করে, পরবর্তী BidiGenerateContentToolCall বার্তা তৈরি করে। প্রতিটি ফাংশন কলের ফলাফল উপলব্ধ না হওয়া পর্যন্ত এক্সিকিউশন বিরতি দেয়, যা ক্রমিক প্রক্রিয়াকরণ নিশ্চিত করে।

ক্লায়েন্টকে BidiGenerateContentToolResponse দিয়ে প্রতিক্রিয়া জানাতে হবে।

অডিও ইনপুট এবং অডিও আউটপুট নেতিবাচকভাবে মডেলের ফাংশন কলিং ব্যবহার করার ক্ষমতাকে প্রভাবিত করে।

বাধা হ্যান্ডেল

ব্যবহারকারীরা যে কোনো সময় মডেলের আউটপুট ব্যাহত করতে পারেন. যখন ভয়েস অ্যাক্টিভিটি ডিটেকশন (VAD) কোনো বাধা শনাক্ত করে, তখন চলমান জেনারেশন বাতিল করা হয় এবং বাতিল করা হয়। শুধুমাত্র ক্লায়েন্টকে ইতিমধ্যে পাঠানো তথ্য সেশন ইতিহাসে রাখা হয়। সার্ভার তখন বিডিজেনারেট কনটেন্টসার্ভার কনটেন্ট বার্তা পাঠায় বিঘ্নের রিপোর্ট করতে।

এছাড়াও, জেমিনি সার্ভার কোনো মুলতুবি থাকা ফাংশন কল বাতিল করে এবং বাতিল করা কলগুলির আইডি সহ একটি BidiGenerateContentServerContent বার্তা পাঠায়।

async for response in session.receive():
    if response.server_content.interrupted is True:
        # The generation was interrupted

ভয়েস কার্যকলাপ সনাক্তকরণ কনফিগার করুন (VAD)

ডিফল্টরূপে, মডেলটি একটি অবিচ্ছিন্ন অডিও ইনপুট স্ট্রীমে স্বয়ংক্রিয়ভাবে ভয়েস অ্যাক্টিভিটি সনাক্তকরণ (VAD) সম্পাদন করে। VAD সেটআপ কনফিগারেশনের realtimeInputConfig.automaticActivityDetection ক্ষেত্রের সাথে কনফিগার করা যেতে পারে।

যখন অডিও স্ট্রীমটি এক সেকেন্ডের বেশি সময়ের জন্য বিরাম দেওয়া হয় (উদাহরণস্বরূপ, কারণ ব্যবহারকারী মাইক্রোফোনটি বন্ধ করে দিয়েছে), তখন কোনও ক্যাশে করা অডিও ফ্লাশ করার জন্য একটি audioStreamEnd ইভেন্ট পাঠানো উচিত। ক্লায়েন্ট যেকোনো সময় অডিও ডেটা পাঠানো আবার শুরু করতে পারে।

বিকল্পভাবে, সেটআপ মেসেজে realtimeInputConfig.automaticActivityDetection.disabled সেট করে স্বয়ংক্রিয় VAD অক্ষম করা যেতে পারে true এই কনফিগারেশনে ক্লায়েন্ট ব্যবহারকারীর বক্তৃতা শনাক্ত করার জন্য এবং যথাযথ সময়ে activityStart এবং activityEnd বার্তা পাঠানোর জন্য দায়ী। এই কনফিগারেশনে একটি audioStreamEnd পাঠানো হয় না। পরিবর্তে, স্ট্রীমের কোনো বাধা একটি activityEnd বার্তা দ্বারা চিহ্নিত করা হয়।

এই বৈশিষ্ট্যটির জন্য SDK সমর্থন আগামী সপ্তাহগুলিতে উপলব্ধ হবে৷

টোকেন গণনা পান

প্রত্যাবর্তিত সার্ভার বার্তার মেটাডেটা ক্ষেত্রে আপনি মোট ভোক্ত টোকেনের সংখ্যা খুঁজে পেতে পারেন।

async for message in session.receive():
    # The server will periodically send messages that include UsageMetadata.
    if message.usage_metadata:
        usage = message.usage_metadata
        print(
            f"Used {usage.total_token_count} tokens in total. Response token breakdown:"
        )
        for detail in usage.response_tokens_details:
            match detail:
                case types.ModalityTokenCount(modality=modality, token_count=count):
                    print(f"{modality}: {count}")

সেশনের সময়কাল বাড়ান

সর্বাধিক সেশনের সময়কাল দুটি প্রক্রিয়ার সাথে সীমাহীন পর্যন্ত বাড়ানো যেতে পারে:

উপরন্তু, সেশন শেষ হওয়ার আগে আপনি একটি GoAway বার্তা পাবেন, যা আপনাকে আরও পদক্ষেপ নিতে অনুমতি দেবে।

প্রসঙ্গ উইন্ডো কম্প্রেশন সক্ষম করুন

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

ContextWindowCompressionConfig- এ, আপনি একটি স্লাইডিং-উইন্ডো মেকানিজম এবং কম্প্রেশন ট্রিগার করে এমন টোকেনের সংখ্যা কনফিগার করতে পারেন।

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    context_window_compression=(
        # Configures compression with default parameters.
        types.ContextWindowCompressionConfig(
            sliding_window=types.SlidingWindow(),
        )
    ),
)

সেশন পুনঃসূচনা কনফিগার করুন

সার্ভার যখন পর্যায়ক্রমে WebSocket সংযোগ পুনরায় সেট করে তখন সেশন সমাপ্তি প্রতিরোধ করতে, সেটআপ কনফিগারেশনের মধ্যে সেশন রিজাম্পশন ক্ষেত্রটি কনফিগার করুন।

এই কনফিগারেশনটি পাস করার ফলে সার্ভারটি SessionResumptionUpdate বার্তা পাঠাতে পারে, যা পরবর্তী সংযোগের SessionResumptionConfig.handle হিসাবে শেষ পুনঃসূচনা টোকেনটি পাস করে সেশন পুনরায় শুরু করতে ব্যবহার করা যেতে পারে।

from google.genai import types

print(f"Connecting to the service with handle {previous_session_handle}...")
async with client.aio.live.connect(
    model="gemini-2.0-flash-live-001",
    config=types.LiveConnectConfig(
        response_modalities=["AUDIO"],
        session_resumption=types.SessionResumptionConfig(
            # The handle of the session to resume is passed here,
            # or else None to start a new session.
            handle=previous_session_handle
        ),
    ),
) as session:
    # Session connected
    while True:
        await session.send_client_content(
            turns=types.Content(
                role="user", parts=[types.Part(text="Hello world!")]
            )
        )
        async for message in session.receive():
            # Periodically, the server will send update messages that may
            # contain a handle for the current state of the session.
            if message.session_resumption_update:
                update = message.session_resumption_update
                if update.resumable and update.new_handle:
                    # The handle should be retained and linked to the session.
                    return update.new_handle

            # For the purposes of this example, placeholder input is continually fed
            # to the model. In non-sample code, the model inputs would come from
            # the user.
            if message.server_content and message.server_content.turn_complete:
                break

সেশন সংযোগ বিচ্ছিন্ন হওয়ার আগে একটি বার্তা পান

সার্ভার একটি GoAway বার্তা পাঠায় যা সংকেত দেয় যে বর্তমান সংযোগটি শীঘ্রই বন্ধ হয়ে যাবে। এই বার্তাটিতে টাইমলেফ্ট অন্তর্ভুক্ত রয়েছে, বাকি সময় নির্দেশ করে এবং সংযোগটি বন্ধ হয়ে যাওয়ার আগে আপনাকে আরও পদক্ষেপ নিতে দেয়।

async for response in session.receive():
    if response.go_away is not None:
        # The connection will soon be terminated
        print(response.go_away.time_left)

প্রজন্ম সম্পূর্ণ হলে একটি বার্তা পান

সার্ভার একটি জেনারেশন কমপ্লিট মেসেজ পাঠায় যা ইঙ্গিত দেয় যে মডেলটি প্রতিক্রিয়া তৈরি করা শেষ করেছে।

async for response in session.receive():
    if response.server_content.generation_complete is True:
        # The generation is complete

মিডিয়া রেজোলিউশন পরিবর্তন করুন

আপনি সেশন কনফিগারেশনের অংশ হিসাবে mediaResolution ক্ষেত্র সেট করে ইনপুট মিডিয়ার জন্য মিডিয়া রেজোলিউশন নির্দিষ্ট করতে পারেন:

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    media_resolution=types.MediaResolution.MEDIA_RESOLUTION_LOW,
)

সীমাবদ্ধতা

আপনি যখন আপনার প্রকল্পের পরিকল্পনা করবেন তখন লাইভ API এবং জেমিনি 2.0 এর নিম্নলিখিত সীমাবদ্ধতাগুলি বিবেচনা করুন৷

প্রতিক্রিয়া পদ্ধতি

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

ক্লায়েন্ট প্রমাণীকরণ

লাইভ API শুধুমাত্র সার্ভারকে সার্ভার প্রমাণীকরণ প্রদান করে এবং সরাসরি ক্লায়েন্ট ব্যবহারের জন্য সুপারিশ করা হয় না। লাইভ API-এর সাথে নিরাপদ প্রমাণীকরণের জন্য ক্লায়েন্ট ইনপুট একটি মধ্যবর্তী অ্যাপ্লিকেশন সার্ভারের মাধ্যমে রুট করা উচিত।

সেশনের সময়কাল

সেশন কম্প্রেশন সক্ষম করে সেশনের সময়সীমা সীমাহীন পর্যন্ত বাড়ানো যেতে পারে। কম্প্রেশন ছাড়া, শুধুমাত্র অডিও সেশন 15 মিনিটের মধ্যে সীমাবদ্ধ, এবং অডিও প্লাস ভিডিও সেশন 2 মিনিটের মধ্যে সীমাবদ্ধ। কম্প্রেশন ছাড়াই এই সীমা অতিক্রম করলে সংযোগটি বন্ধ হয়ে যাবে।

অতিরিক্তভাবে, আপনি ক্লায়েন্টকে বন্ধ করা সেশন পুনরায় শুরু করার অনুমতি দেওয়ার জন্য সেশন পুনঃসূচনা কনফিগার করতে পারেন।

প্রসঙ্গ উইন্ডো

একটি সেশনের একটি প্রসঙ্গ উইন্ডো সীমা 32k টোকেন রয়েছে৷

সমর্থিত ভাষা

লাইভ API নিম্নলিখিত ভাষা সমর্থন করে:

ভাষা BCP-47 কোড
জার্মান (জার্মানি) ডি-ডিই
ইংরেজি (অস্ট্রেলিয়া) en-AU
ইংরেজি (যুক্তরাজ্য) en-GB
ইংরেজি (ভারত) en-IN
ইংরেজি (মার্কিন) en-US
স্প্যানিশ (মার্কিন যুক্তরাষ্ট্র) es-মার্কিন
ফরাসি (ফ্রান্স) fr-FR
হিন্দি (ভারত) হাই-ইন
পর্তুগিজ (ব্রাজিল) pt-BR
আরবি (জেনারিক) ar-XA
স্প্যানিশ (স্পেন) es-ES
ফরাসি (কানাডা) fr-CA
ইন্দোনেশিয়া (ইন্দোনেশিয়া) আইডি-আইডি
ইতালীয় (ইতালি) এটা-আইটি
জাপানিজ (জাপান) ja-জেপি
তুর্কি (তুরস্ক) tr-TR
ভিয়েতনামী (ভিয়েতনাম) vi-VN
বাংলা (ভারত) bn-IN
গুজরাটি (ভারত) gu-IN
কন্নড় (ভারত) kn-IN
মালায়লাম (ভারত) ml-IN
মারাঠি (ভারত) মিস্টার-আইএন
তামিল (ভারত) ta-IN
তেলেগু (ভারত) te-IN
ডাচ (নেদারল্যান্ডস) nl-NL
কোরিয়ান (দক্ষিণ কোরিয়া) ko-KR
ম্যান্ডারিন চাইনিজ (চীন) cmn-CN
পোলিশ (পোল্যান্ড) pl-PL
রাশিয়ান (রাশিয়া) ru-RU
থাই (থাইল্যান্ড) th-TH

তৃতীয় পক্ষের ইন্টিগ্রেশন

ওয়েব এবং মোবাইল অ্যাপ স্থাপনার জন্য, আপনি এখান থেকে বিকল্পগুলি অন্বেষণ করতে পারেন: