এটি একটি বিশদ নির্দেশিকা যা লাইভ এপিআই (Live API)-এর সাথে উপলব্ধ ক্ষমতা এবং কনফিগারেশনগুলি নিয়ে আলোচনা করে। একটি সার্বিক ধারণা এবং সাধারণ ব্যবহারের ক্ষেত্রগুলির জন্য নমুনা কোডের জন্য 'লাইভ এপিআই দিয়ে শুরু করুন' (Get started with Live API) পৃষ্ঠাটি দেখুন।
শুরু করার আগে
- মূল ধারণাগুলোর সাথে পরিচিত হন: যদি আপনি আগে থেকে তা না করে থাকেন, তাহলে প্রথমে ‘লাইভ এপিআই দিয়ে শুরু করুন’ পৃষ্ঠাটি পড়ুন। এটি আপনাকে লাইভ এপিআই-এর মৌলিক নীতি, এটি কীভাবে কাজ করে এবং এর বিভিন্ন বাস্তবায়ন পদ্ধতির সাথে পরিচয় করিয়ে দেবে।
- এআই স্টুডিওতে লাইভ এপিআই ব্যবহার করে দেখুন: বিল্ড করা শুরু করার আগে গুগল এআই স্টুডিওতে লাইভ এপিআই ব্যবহার করে দেখা আপনার জন্য সহায়ক হতে পারে। গুগল এআই স্টুডিওতে লাইভ এপিআই ব্যবহার করতে, স্ট্রিম (Stream) নির্বাচন করুন।
মডেল তুলনা
নিম্নলিখিত সারণিতে জেমিনি ৩.১ ফ্ল্যাশ লাইভ প্রিভিউ এবং জেমিনি ২.৫ ফ্ল্যাশ লাইভ প্রিভিউ মডেল দুটির মধ্যকার প্রধান পার্থক্যগুলো সংক্ষেপে তুলে ধরা হলো:
| বৈশিষ্ট্য | জেমিনি ৩.১ ফ্ল্যাশ লাইভ প্রিভিউ | জেমিনি ২.৫ ফ্ল্যাশ লাইভ প্রিভিউ |
|---|---|---|
| চিন্তা | চিন্তার গভীরতা নিয়ন্ত্রণ করতে thinkingLevel ব্যবহার করা হয়, যার জন্য minimal , low , medium এবং high মতো সেটিংস রয়েছে। সর্বনিম্ন ল্যাটেন্সি অপ্টিমাইজ করার জন্য এটি ডিফল্টভাবে minimal এ সেট করা থাকে। থিঙ্কিং লেভেল এবং বাজেট দেখুন। | থিংকিং টোকেনের সংখ্যা নির্ধারণ করতে thinkingBudget ব্যবহার করা হয়। ডাইনামিক থিংকিং ডিফল্টরূপে সক্রিয় থাকে। এটি নিষ্ক্রিয় করতে thinkingBudget এর মান 0 সেট করুন। থিংকিং লেভেল এবং বাজেট দেখুন। |
| প্রতিক্রিয়া গ্রহণ | একটি একক সার্ভার ইভেন্টে একই সাথে একাধিক কন্টেন্ট পার্ট থাকতে পারে (উদাহরণস্বরূপ, inlineData এবং ট্রান্সক্রিপ্ট)। কোনো কন্টেন্ট বাদ পড়া এড়াতে, আপনার কোড যেন প্রতিটি ইভেন্টের সমস্ত পার্ট প্রসেস করে, তা নিশ্চিত করুন। | প্রতিটি সার্ভার ইভেন্টে কেবল একটি কন্টেন্ট পার্ট থাকে। পার্টগুলো আলাদা আলাদা ইভেন্টে ডেলিভার করা হয়। |
| ক্লায়েন্টের বিষয়বস্তু | send_client_content শুধুমাত্র প্রাথমিক কনটেক্সট হিস্ট্রি সিড করার জন্য সমর্থিত (এর জন্য সেশন কনফিগে initial_history_in_client_content সেট করতে হবে)। কথোপকথন চলাকালীন টেক্সট আপডেট পাঠাতে, এর পরিবর্তে send_realtime_input ব্যবহার করুন। | ক্রমবর্ধমান কন্টেন্ট আপডেট পাঠাতে এবং প্রাসঙ্গিকতা প্রতিষ্ঠা করতে, পুরো কথোপকথন জুড়ে send_client_content সমর্থিত। |
| টার্ন কভারেজ | ডিফল্ট হিসেবে TURN_INCLUDES_AUDIO_ACTIVITY_AND_ALL_VIDEO ব্যবহৃত হয়। মডেলের পালা চলাকালীন শনাক্তকৃত অডিও কার্যকলাপ এবং সমস্ত ভিডিও ফ্রেম অন্তর্ভুক্ত থাকে। | ডিফল্ট হিসেবে TURN_INCLUDES_ONLY_ACTIVITY ব্যবহৃত হয়। মডেলের পালায় শুধুমাত্র শনাক্তকৃত কার্যকলাপ অন্তর্ভুক্ত থাকে। |
কাস্টম ভিএডি ( activity_start / activity_end ) | সমর্থিত । স্বয়ংক্রিয় VAD নিষ্ক্রিয় করুন এবং বাঁকের সীমানা নিয়ন্ত্রণ করতে activityStart ও activityEnd বার্তা ম্যানুয়ালি পাঠান। | সমর্থিত । স্বয়ংক্রিয় VAD নিষ্ক্রিয় করুন এবং বাঁকের সীমানা নিয়ন্ত্রণ করতে ম্যানুয়ালি activityStart এবং activityEnd বার্তা পাঠান। |
| স্বয়ংক্রিয় VAD কনফিগারেশন | সমর্থিত । start_of_speech_sensitivity , end_of_speech_sensitivity , prefix_padding_ms , এবং silence_duration_ms এর মতো প্যারামিটারগুলো কনফিগার করুন। | সমর্থিত । start_of_speech_sensitivity , end_of_speech_sensitivity , prefix_padding_ms , এবং silence_duration_ms এর মতো প্যারামিটারগুলো কনফিগার করুন। |
অ্যাসিঙ্ক্রোনাস ফাংশন কলিং ( behavior: NON_BLOCKING ) | সমর্থিত নয় । ফাংশন কলিং শুধুমাত্র ক্রমানুসারে করা যায়। আপনি টুলের প্রতিক্রিয়া না পাঠানো পর্যন্ত মডেলটি সাড়া দেওয়া শুরু করবে না। | সমর্থিত । কোনো ফাংশন চলার সময় মডেলকে তার সাথে মিথস্ক্রিয়া চালিয়ে যেতে দেওয়ার জন্য, ফাংশন ডিক্লারেশনে এর behavior NON_BLOCKING এ সেট করুন। scheduling প্যারামিটার ( INTERRUPT , WHEN_IDLE , বা SILENT ) ব্যবহার করে মডেল কীভাবে প্রতিক্রিয়াগুলি পরিচালনা করবে তা নিয়ন্ত্রণ করুন। |
| প্রোঅ্যাকটিভ অডিও | সমর্থিত নয় | সমর্থিত । সক্রিয় করা হলে, ইনপুট কন্টেন্ট প্রাসঙ্গিক না হলে মডেলটি সাড়া না দেওয়ার সিদ্ধান্ত স্বতঃপ্রণোদিতভাবে নিতে পারে। proactivity কনফিগে proactive_audio true তে সেট করুন (এর জন্য v1alpha প্রয়োজন)। |
| আবেগপূর্ণ সংলাপ | সমর্থিত নয় | সমর্থিত । মডেলটি ইনপুটের অভিব্যক্তি এবং সুরের সাথে তার প্রতিক্রিয়া শৈলীকে মানিয়ে নেয়। সেশন কনফিগে enable_affective_dialog true তে সেট করুন (এর জন্য v1alpha প্রয়োজন)। |
Gemini 2.5 Flash Live থেকে Gemini 3.1 Flash Live-এ স্থানান্তরিত হতে, স্থানান্তর নির্দেশিকা দেখুন।
সংযোগ স্থাপন করা
নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি API কী ব্যবহার করে সংযোগ তৈরি করতে হয়:
পাইথন
import asyncio
from google import genai
client = genai.Client()
model = "gemini-3.1-flash-live-preview"
config = {"response_modalities": ["AUDIO"]}
async def main():
async with client.aio.live.connect(model=model, config=config) as session:
print("Session started")
# Send content...
if __name__ == "__main__":
asyncio.run(main())
জাভাস্ক্রিপ্ট
import { GoogleGenAI, Modality } from '@google/genai';
const ai = new GoogleGenAI({});
const model = 'gemini-3.1-flash-live-preview';
const config = { responseModalities: [Modality.AUDIO] };
async function main() {
const session = await ai.live.connect({
model: model,
callbacks: {
onopen: function () {
console.debug('Opened');
},
onmessage: function (message) {
console.debug(message);
},
onerror: function (e) {
console.debug('Error:', e.message);
},
onclose: function (e) {
console.debug('Close:', e.reason);
},
},
config: config,
});
console.debug("Session started");
// Send content...
session.close();
}
main();
মিথস্ক্রিয়া পদ্ধতি
নিম্নলিখিত বিভাগগুলিতে লাইভ এপিআই-তে উপলব্ধ বিভিন্ন ইনপুট এবং আউটপুট পদ্ধতির উদাহরণ এবং প্রাসঙ্গিক তথ্য প্রদান করা হয়েছে।
অডিও পাঠানো হচ্ছে
অডিও র PCM ডেটা হিসেবে পাঠাতে হবে (র ১৬-বিট PCM অডিও, ১৬kHz, লিটল-এন্ডিয়ান)।
পাইথন
# Assuming 'chunk' is your raw PCM audio bytes
await session.send_realtime_input(
audio=types.Blob(
data=chunk,
mime_type="audio/pcm;rate=16000"
)
)
জাভাস্ক্রিপ্ট
// Assuming 'chunk' is a Buffer of raw PCM audio
session.sendRealtimeInput({
audio: {
data: chunk.toString('base64'),
mimeType: 'audio/pcm;rate=16000'
}
});
অডিও ফরম্যাট
Live API-তে অডিও ডেটা সর্বদা র, লিটল-এন্ডিয়ান, ১৬-বিট PCM হয়ে থাকে। অডিও আউটপুটে সর্বদা ২৪kHz স্যাম্পল রেট ব্যবহৃত হয়। ইনপুট অডিও স্বাভাবিকভাবে ১৬kHz হয়ে থাকে, কিন্তু Live API প্রয়োজনে রিস্যাম্পল করে, ফলে যেকোনো স্যাম্পল রেট পাঠানো সম্ভব। ইনপুট অডিওর স্যাম্পল রেট জানানোর জন্য, অডিও-যুক্ত প্রতিটি Blob- এর MIME টাইপকে audio/pcm;rate=16000 মতো কোনো মানে সেট করুন।
অডিও গ্রহণ করা
মডেলের অডিও প্রতিক্রিয়াগুলো ডেটার খণ্ড হিসেবে গ্রহণ করা হয়।
পাইথন
async for response in session.receive():
if response.server_content and response.server_content.model_turn:
for part in response.server_content.model_turn.parts:
if part.inline_data:
audio_data = part.inline_data.data
# Process or play the audio data
জাভাস্ক্রিপ্ট
// Inside the onmessage callback
const content = response.serverContent;
if (content?.modelTurn?.parts) {
for (const part of content.modelTurn.parts) {
if (part.inlineData) {
const audioData = part.inlineData.data;
// Process or play audioData (base64 encoded string)
}
}
}
টেক্সট পাঠানো
send_realtime_input (Python) বা sendRealtimeInput (JavaScript) ব্যবহার করে টেক্সট পাঠানো যায়।
পাইথন
await session.send_realtime_input(text="Hello, how are you?")
জাভাস্ক্রিপ্ট
session.sendRealtimeInput({
text: 'Hello, how are you?'
});
ভিডিও পাঠানো
ভিডিও ফ্রেমগুলো একটি নির্দিষ্ট ফ্রেম রেটে (প্রতি সেকেন্ডে সর্বোচ্চ ১ ফ্রেম) স্বতন্ত্র ছবি (যেমন, JPEG বা PNG) হিসেবে পাঠানো হয়।
পাইথন
# Assuming 'frame' is your JPEG-encoded image bytes
await session.send_realtime_input(
video=types.Blob(
data=frame,
mime_type="image/jpeg"
)
)
জাভাস্ক্রিপ্ট
// Assuming 'frame' is a Buffer of JPEG-encoded image data
session.sendRealtimeInput({
video: {
data: frame.toString('base64'),
mimeType: 'image/jpeg'
}
});
ক্রমবর্ধমান বিষয়বস্তু আপডেট
টেক্সট ইনপুট পাঠাতে, সেশন কনটেক্সট স্থাপন করতে বা সেশন কনটেক্সট পুনরুদ্ধার করতে ইনক্রিমেন্টাল আপডেট ব্যবহার করুন। সংক্ষিপ্ত কনটেক্সটের জন্য, আপনি ঘটনাগুলোর সঠিক ক্রম তুলে ধরতে টার্ন-বাই-টার্ন ইন্টারঅ্যাকশন পাঠাতে পারেন:
পাইথন
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)
জাভাস্ক্রিপ্ট
let inputTurns = [
{ "role": "user", "parts": [{ "text": "What is the capital of France?" }] },
{ "role": "model", "parts": [{ "text": "Paris" }] },
]
session.sendClientContent({ turns: inputTurns, turnComplete: false })
inputTurns = [{ "role": "user", "parts": [{ "text": "What is the capital of Germany?" }] }]
session.sendClientContent({ turns: inputTurns, turnComplete: true })
দীর্ঘতর কনটেক্সটের ক্ষেত্রে, পরবর্তী ইন্টারঅ্যাকশনের জন্য কনটেক্সট উইন্ডোটি খালি রাখতে একটিমাত্র মেসেজ সামারি প্রদান করার পরামর্শ দেওয়া হয়। সেশন কনটেক্সট লোড করার আরেকটি পদ্ধতির জন্য ‘সেশন রিজাম্পশন’ দেখুন।
অডিও ট্রান্সক্রিপশন
মডেল প্রতিক্রিয়ার পাশাপাশি, আপনি অডিও আউটপুট এবং অডিও ইনপুট উভয়ের প্রতিলিপিও পেতে পারেন।
মডেলের অডিও আউটপুটের ট্রান্সক্রিপশন চালু করতে, সেটআপ কনফিগে ` output_audio_transcription পাঠান। মডেলের প্রতিক্রিয়া থেকে ট্রান্সক্রিপশনের ভাষা অনুমান করা হয়।
পাইথন
import asyncio
from google import genai
from google.genai import types
client = genai.Client()
model = "gemini-3.1-flash-live-preview"
config = {
"response_modalities": ["AUDIO"],
"output_audio_transcription": {}
}
async def main():
async with client.aio.live.connect(model=model, config=config) as session:
message = "Hello? Gemini are you there?"
await session.send_client_content(
turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
)
async for response in session.receive():
if response.server_content.model_turn:
print("Model turn:", response.server_content.model_turn)
if response.server_content.output_transcription:
print("Transcript:", response.server_content.output_transcription.text)
if __name__ == "__main__":
asyncio.run(main())
জাভাস্ক্রিপ্ট
import { GoogleGenAI, Modality } from '@google/genai';
const ai = new GoogleGenAI({});
const model = 'gemini-3.1-flash-live-preview';
const config = {
responseModalities: [Modality.AUDIO],
outputAudioTranscription: {}
};
async function live() {
const responseQueue = [];
async function waitMessage() {
let done = false;
let message = undefined;
while (!done) {
message = responseQueue.shift();
if (message) {
done = true;
} else {
await new Promise((resolve) => setTimeout(resolve, 100));
}
}
return message;
}
async function handleTurn() {
const turns = [];
let done = false;
while (!done) {
const message = await waitMessage();
turns.push(message);
if (message.serverContent && message.serverContent.turnComplete) {
done = true;
}
}
return turns;
}
const session = await ai.live.connect({
model: model,
callbacks: {
onopen: function () {
console.debug('Opened');
},
onmessage: function (message) {
responseQueue.push(message);
},
onerror: function (e) {
console.debug('Error:', e.message);
},
onclose: function (e) {
console.debug('Close:', e.reason);
},
},
config: config,
});
const inputTurns = 'Hello how are you?';
session.sendClientContent({ turns: inputTurns });
const turns = await handleTurn();
for (const turn of turns) {
if (turn.serverContent && turn.serverContent.outputTranscription) {
console.debug('Received output transcription: %s\n', turn.serverContent.outputTranscription.text);
}
}
session.close();
}
async function main() {
await live().catch((e) => console.error('got error', e));
}
main();
মডেলের অডিও ইনপুটের ট্রান্সক্রিপশন চালু করতে, সেটআপ কনফিগে input_audio_transcription পাঠান।
পাইথন
import asyncio
from pathlib import Path
from google import genai
from google.genai import types
client = genai.Client()
model = "gemini-3.1-flash-live-preview"
config = {
"response_modalities": ["AUDIO"],
"input_audio_transcription": {},
}
async def main():
async with client.aio.live.connect(model=model, config=config) as session:
audio_data = Path("16000.pcm").read_bytes()
await session.send_realtime_input(
audio=types.Blob(data=audio_data, mime_type='audio/pcm;rate=16000')
)
async for msg in session.receive():
if msg.server_content.input_transcription:
print('Transcript:', msg.server_content.input_transcription.text)
if __name__ == "__main__":
asyncio.run(main())
জাভাস্ক্রিপ্ট
import { GoogleGenAI, Modality } from '@google/genai';
import * as fs from "node:fs";
import pkg from 'wavefile';
const { WaveFile } = pkg;
const ai = new GoogleGenAI({});
const model = 'gemini-3.1-flash-live-preview';
const config = {
responseModalities: [Modality.AUDIO],
inputAudioTranscription: {}
};
async function live() {
const responseQueue = [];
async function waitMessage() {
let done = false;
let message = undefined;
while (!done) {
message = responseQueue.shift();
if (message) {
done = true;
} else {
await new Promise((resolve) => setTimeout(resolve, 100));
}
}
return message;
}
async function handleTurn() {
const turns = [];
let done = false;
while (!done) {
const message = await waitMessage();
turns.push(message);
if (message.serverContent && message.serverContent.turnComplete) {
done = true;
}
}
return turns;
}
const session = await ai.live.connect({
model: model,
callbacks: {
onopen: function () {
console.debug('Opened');
},
onmessage: function (message) {
responseQueue.push(message);
},
onerror: function (e) {
console.debug('Error:', e.message);
},
onclose: function (e) {
console.debug('Close:', e.reason);
},
},
config: config,
});
// Send Audio Chunk
const fileBuffer = fs.readFileSync("16000.wav");
// Ensure audio conforms to API requirements (16-bit PCM, 16kHz, mono)
const wav = new WaveFile();
wav.fromBuffer(fileBuffer);
wav.toSampleRate(16000);
wav.toBitDepth("16");
const base64Audio = wav.toBase64();
// If already in correct format, you can use this:
// const fileBuffer = fs.readFileSync("sample.pcm");
// const base64Audio = Buffer.from(fileBuffer).toString('base64');
session.sendRealtimeInput(
{
audio: {
data: base64Audio,
mimeType: "audio/pcm;rate=16000"
}
}
);
const turns = await handleTurn();
for (const turn of turns) {
if (turn.text) {
console.debug('Received text: %s\n', turn.text);
}
else if (turn.data) {
console.debug('Received inline data: %s\n', turn.data);
}
else if (turn.serverContent && turn.serverContent.inputTranscription) {
console.debug('Received input transcription: %s\n', turn.serverContent.inputTranscription.text);
}
}
session.close();
}
async function main() {
await live().catch((e) => console.error('got error', e));
}
main();
কণ্ঠস্বর ও ভাষা পরিবর্তন করুন
নেটিভ অডিও আউটপুট মডেলগুলো আমাদের টেক্সট-টু-স্পিচ (TTS) মডেলগুলোর জন্য উপলব্ধ যেকোনো ভয়েস সমর্থন করে। আপনি AI Studio- তে সমস্ত ভয়েস শুনতে পারেন।
ভয়েস নির্দিষ্ট করতে, সেশন কনফিগারেশনের অংশ হিসেবে speechConfig অবজেক্টের মধ্যে ভয়েসের নামটি সেট করুন:
পাইথন
config = {
"response_modalities": ["AUDIO"],
"speech_config": {
"voice_config": {"prebuilt_voice_config": {"voice_name": "Kore"}}
},
}
জাভাস্ক্রিপ্ট
const config = {
responseModalities: [Modality.AUDIO],
speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } }
};
লাইভ এপিআই একাধিক ভাষা সমর্থন করে। নেটিভ অডিও আউটপুট মডেলগুলো স্বয়ংক্রিয়ভাবে উপযুক্ত ভাষা বেছে নেয় এবং স্পষ্টভাবে ভাষা কোড সেট করার সুবিধা দেয় না।
নেটিভ অডিও ক্ষমতা
আমাদের সর্বশেষ মডেলগুলিতে রয়েছে নেটিভ অডিও আউটপুট , যা স্বাভাবিক ও বাস্তবসম্মত কণ্ঠস্বর এবং উন্নত বহুভাষিক পারফরম্যান্স প্রদান করে।
চিন্তা
জেমিনি ৩.১ মডেলগুলো চিন্তার গভীরতা নিয়ন্ত্রণ করতে thinkingLevel ব্যবহার করে, যার সেটিংসগুলো হলো minimal ’, low , medium ’ এবং high ’। সর্বনিম্ন ল্যাটেন্সির জন্য ডিফল্ট সেটিং হলো minimal । এর পরিবর্তে জেমিনি ২.৫ মডেলগুলো থিংকিং টোকেনের সংখ্যা নির্ধারণ করতে thinkingBudget ব্যবহার করে। লেভেল বনাম বাজেট সম্পর্কে আরও বিস্তারিত জানতে, ‘থিংকিং লেভেলস অ্যান্ড বাজেটস’ দেখুন।
পাইথন
model = "gemini-3.1-flash-live-preview"
config = types.LiveConnectConfig(
response_modalities=["AUDIO"]
thinking_config=types.ThinkingConfig(
thinking_level="low",
)
)
async with client.aio.live.connect(model=model, config=config) as session:
# Send audio input and receive audio
জাভাস্ক্রিপ্ট
const model = 'gemini-3.1-flash-live-preview';
const config = {
responseModalities: [Modality.AUDIO],
thinkingConfig: {
thinkingLevel: 'low',
},
};
async function main() {
const session = await ai.live.connect({
model: model,
config: config,
callbacks: ...,
});
// Send audio input and receive audio
session.close();
}
main();
এছাড়াও, আপনার কনফিগারেশনে includeThoughts true সেট করে আপনি চিন্তার সারাংশ সক্রিয় করতে পারেন। আরও তথ্যের জন্য চিন্তার সারাংশ দেখুন:
পাইথন
model = "gemini-3.1-flash-live-preview"
config = types.LiveConnectConfig(
response_modalities=["AUDIO"]
thinking_config=types.ThinkingConfig(
thinking_level="low",
include_thoughts=True
)
)
জাভাস্ক্রিপ্ট
const model = 'gemini-3.1-flash-live-preview';
const config = {
responseModalities: [Modality.AUDIO],
thinkingConfig: {
thinkingLevel: 'low',
includeThoughts: true,
},
};
আবেগপূর্ণ সংলাপ
এই বৈশিষ্ট্যটি জেমিনিকে প্রদত্ত অভিব্যক্তি এবং কণ্ঠস্বরের সাথে তার প্রতিক্রিয়া শৈলীকে মানিয়ে নিতে সাহায্য করে।
অ্যাফেক্টিভ ডায়ালগ ব্যবহার করতে, এপিআই সংস্করণটি v1alpha তে সেট করুন এবং সেটআপ মেসেজে enable_affective_dialog true তে সেট করুন:
পাইথন
client = genai.Client(http_options={"api_version": "v1alpha"})
config = types.LiveConnectConfig(
response_modalities=["AUDIO"],
enable_affective_dialog=True
)
জাভাস্ক্রিপ্ট
const ai = new GoogleGenAI({ httpOptions: {"apiVersion": "v1alpha"} });
const config = {
responseModalities: [Modality.AUDIO],
enableAffectiveDialog: true
};
প্রোঅ্যাকটিভ অডিও
এই ফিচারটি চালু করা থাকলে, কন্টেন্টটি প্রাসঙ্গিক না হলে জেমিনি স্বতঃপ্রণোদিত হয়ে সাড়া না দেওয়ার সিদ্ধান্ত নিতে পারে।
এটি ব্যবহার করতে, এপিআই সংস্করণটি v1alpha তে সেট করুন, সেটআপ মেসেজে proactivity ফিল্ডটি কনফিগার করুন এবং proactive_audio true তে সেট করুন:
পাইথন
client = genai.Client(http_options={"api_version": "v1alpha"})
config = types.LiveConnectConfig(
response_modalities=["AUDIO"],
proactivity={'proactive_audio': True}
)
জাভাস্ক্রিপ্ট
const ai = new GoogleGenAI({ httpOptions: {"apiVersion": "v1alpha"} });
const config = {
responseModalities: [Modality.AUDIO],
proactivity: { proactiveAudio: true }
}
ভয়েস অ্যাক্টিভিটি ডিটেকশন (VAD)
ভয়েস অ্যাক্টিভিটি ডিটেকশন (VAD) মডেলটিকে কোনো ব্যক্তি কথা বলার সময় তা শনাক্ত করতে সাহায্য করে। স্বাভাবিক কথোপকথন তৈরির জন্য এটি অপরিহার্য, কারণ এর মাধ্যমে ব্যবহারকারী যেকোনো সময় মডেলটিকে থামিয়ে দিতে পারেন।
যখন VAD কোনো বাধা শনাক্ত করে, তখন চলমান জেনারেশনটি বাতিল ও বাতিল হয়ে যায়। শুধুমাত্র ক্লায়েন্টের কাছে ইতিমধ্যে পাঠানো তথ্যই সেশন হিস্ট্রিতে সংরক্ষিত থাকে। এরপর সার্ভার বাধাটির বিষয়ে জানানোর জন্য একটি BidiGenerateContentServerContent মেসেজ পাঠায়।
এরপর জেমিনি সার্ভারটি অপেক্ষাধীন ফাংশন কলগুলো বাতিল করে দেয় এবং বাতিল করা কলগুলোর আইডি সহ একটি BidiGenerateContentServerContent বার্তা পাঠায়।
পাইথন
async for response in session.receive():
if response.server_content.interrupted is True:
# The generation was interrupted
# If realtime playback is implemented in your application,
# you should stop playing audio and clear queued playback here.
জাভাস্ক্রিপ্ট
const turns = await handleTurn();
for (const turn of turns) {
if (turn.serverContent && turn.serverContent.interrupted) {
// The generation was interrupted
// If realtime playback is implemented in your application,
// you should stop playing audio and clear queued playback here.
}
}
স্বয়ংক্রিয় VAD
ডিফল্টরূপে, মডেলটি একটি অবিচ্ছিন্ন অডিও ইনপুট স্ট্রিমে স্বয়ংক্রিয়ভাবে VAD সম্পাদন করে। সেটআপ কনফিগারেশনের realtimeInputConfig.automaticActivityDetection ফিল্ডের মাধ্যমে VAD কনফিগার করা যেতে পারে।
যখন অডিও স্ট্রিম এক সেকেন্ডের বেশি সময়ের জন্য থেমে থাকে (উদাহরণস্বরূপ, ব্যবহারকারী মাইক্রোফোন বন্ধ করে দিলে), তখন ক্যাশে থাকা অডিও মুছে ফেলার জন্য একটি audioStreamEnd ইভেন্ট পাঠানো উচিত। ক্লায়েন্ট যেকোনো সময় আবার অডিও ডেটা পাঠানো শুরু করতে পারে।
পাইথন
# example audio file to try:
# URL = "https://storage.googleapis.com/generativeai-downloads/data/hello_are_you_there.pcm"
# !wget -q $URL -O sample.pcm
import asyncio
from pathlib import Path
from google import genai
from google.genai import types
client = genai.Client()
model = "gemini-3.1-flash-live-preview"
config = {"response_modalities": ["AUDIO"]}
async def main():
async with client.aio.live.connect(model=model, config=config) as session:
audio_bytes = Path("sample.pcm").read_bytes()
await session.send_realtime_input(
audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
)
# if stream gets paused, send:
# await session.send_realtime_input(audio_stream_end=True)
async for response in session.receive():
if response.text is not None:
print(response.text)
if __name__ == "__main__":
asyncio.run(main())
জাভাস্ক্রিপ্ট
// example audio file to try:
// URL = "https://storage.googleapis.com/generativeai-downloads/data/hello_are_you_there.pcm"
// !wget -q $URL -O sample.pcm
import { GoogleGenAI, Modality } from '@google/genai';
import * as fs from "node:fs";
const ai = new GoogleGenAI({});
const model = 'gemini-3.1-flash-live-preview';
const config = { responseModalities: [Modality.AUDIO] };
async function live() {
const responseQueue = [];
async function waitMessage() {
let done = false;
let message = undefined;
while (!done) {
message = responseQueue.shift();
if (message) {
done = true;
} else {
await new Promise((resolve) => setTimeout(resolve, 100));
}
}
return message;
}
async function handleTurn() {
const turns = [];
let done = false;
while (!done) {
const message = await waitMessage();
turns.push(message);
if (message.serverContent && message.serverContent.turnComplete) {
done = true;
}
}
return turns;
}
const session = await ai.live.connect({
model: model,
callbacks: {
onopen: function () {
console.debug('Opened');
},
onmessage: function (message) {
responseQueue.push(message);
},
onerror: function (e) {
console.debug('Error:', e.message);
},
onclose: function (e) {
console.debug('Close:', e.reason);
},
},
config: config,
});
// Send Audio Chunk
const fileBuffer = fs.readFileSync("sample.pcm");
const base64Audio = Buffer.from(fileBuffer).toString('base64');
session.sendRealtimeInput(
{
audio: {
data: base64Audio,
mimeType: "audio/pcm;rate=16000"
}
}
);
// if stream gets paused, send:
// session.sendRealtimeInput({ audioStreamEnd: true })
const turns = await handleTurn();
for (const turn of turns) {
if (turn.text) {
console.debug('Received text: %s\n', turn.text);
}
else if (turn.data) {
console.debug('Received inline data: %s\n', turn.data);
}
}
session.close();
}
async function main() {
await live().catch((e) => console.error('got error', e));
}
main();
send_realtime_input মাধ্যমে, API-টি VAD-এর উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে অডিওতে সাড়া দেবে। যেখানে send_client_content বার্তাগুলিকে ক্রমানুসারে মডেল কনটেক্সটে যুক্ত করে, সেখানে send_realtime_input সুনির্দিষ্ট ক্রমবিন্যাসের বিনিময়ে দ্রুত সাড়া দেওয়ার ক্ষমতার জন্য অপ্টিমাইজ করা হয়েছে।
স্বয়ংক্রিয় VAD কনফিগারেশন
VAD কার্যকলাপের উপর আরও বেশি নিয়ন্ত্রণের জন্য, আপনি নিম্নলিখিত প্যারামিটারগুলি কনফিগার করতে পারেন। আরও তথ্যের জন্য API রেফারেন্স দেখুন।
পাইথন
from google.genai import types
config = {
"response_modalities": ["AUDIO"],
"realtime_input_config": {
"automatic_activity_detection": {
"disabled": False, # default
"start_of_speech_sensitivity": types.StartSensitivity.START_SENSITIVITY_LOW,
"end_of_speech_sensitivity": types.EndSensitivity.END_SENSITIVITY_LOW,
"prefix_padding_ms": 20,
"silence_duration_ms": 100,
}
}
}
জাভাস্ক্রিপ্ট
import { GoogleGenAI, Modality, StartSensitivity, EndSensitivity } from '@google/genai';
const config = {
responseModalities: [Modality.AUDIO],
realtimeInputConfig: {
automaticActivityDetection: {
disabled: false, // default
startOfSpeechSensitivity: StartSensitivity.START_SENSITIVITY_LOW,
endOfSpeechSensitivity: EndSensitivity.END_SENSITIVITY_LOW,
prefixPaddingMs: 20,
silenceDurationMs: 100,
}
}
};
স্বয়ংক্রিয় VAD নিষ্ক্রিয় করুন
বিকল্পভাবে, সেটআপ মেসেজে realtimeInputConfig.automaticActivityDetection.disabled কে true সেট করে স্বয়ংক্রিয় VAD নিষ্ক্রিয় করা যেতে পারে। এই কনফিগারেশনে, ক্লায়েন্ট ব্যবহারকারীর কথা শনাক্ত করার এবং উপযুক্ত সময়ে activityStart ও activityEnd মেসেজ পাঠানোর দায়িত্বে থাকে। এই কনফিগারেশনে কোনো audioStreamEnd পাঠানো হয় না। এর পরিবর্তে, স্ট্রিমে যেকোনো বাধা একটি activityEnd মেসেজের মাধ্যমে চিহ্নিত করা হয়।
পাইথন
config = {
"response_modalities": ["AUDIO"],
"realtime_input_config": {"automatic_activity_detection": {"disabled": True}},
}
async with client.aio.live.connect(model=model, config=config) as session:
# ...
await session.send_realtime_input(activity_start=types.ActivityStart())
await session.send_realtime_input(
audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
)
await session.send_realtime_input(activity_end=types.ActivityEnd())
# ...
জাভাস্ক্রিপ্ট
const config = {
responseModalities: [Modality.AUDIO],
realtimeInputConfig: {
automaticActivityDetection: {
disabled: true,
}
}
};
session.sendRealtimeInput({ activityStart: {} })
session.sendRealtimeInput(
{
audio: {
data: base64Audio,
mimeType: "audio/pcm;rate=16000"
}
}
);
session.sendRealtimeInput({ activityEnd: {} })
টোকেন সংখ্যা
ফেরত আসা সার্ভার মেসেজের usageMetadata ফিল্ডে আপনি মোট ব্যবহৃত টোকেনের সংখ্যা খুঁজে পাবেন।
পাইথন
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}")
জাভাস্ক্রিপ্ট
const turns = await handleTurn();
for (const turn of turns) {
if (turn.usageMetadata) {
console.debug('Used %s tokens in total. Response token breakdown:\n', turn.usageMetadata.totalTokenCount);
for (const detail of turn.usageMetadata.responseTokensDetails) {
console.debug('%s\n', detail);
}
}
}
মিডিয়া রেজোলিউশন
সেশন কনফিগারেশনের অংশ হিসেবে mediaResolution ফিল্ডটি সেট করার মাধ্যমে আপনি ইনপুট মিডিয়ার জন্য মিডিয়া রেজোলিউশন নির্দিষ্ট করতে পারেন:
পাইথন
from google.genai import types
config = {
"response_modalities": ["AUDIO"],
"media_resolution": types.MediaResolution.MEDIA_RESOLUTION_LOW,
}
জাভাস্ক্রিপ্ট
import { GoogleGenAI, Modality, MediaResolution } from '@google/genai';
const config = {
responseModalities: [Modality.AUDIO],
mediaResolution: MediaResolution.MEDIA_RESOLUTION_LOW,
};
সীমাবদ্ধতা
আপনার প্রকল্পের পরিকল্পনা করার সময় লাইভ এপিআই-এর নিম্নলিখিত সীমাবদ্ধতাগুলো বিবেচনা করুন।
প্রতিক্রিয়া পদ্ধতি
নেটিভ অডিও মডেলগুলো শুধুমাত্র ‘অডিও’ রেসপন্স মোডালিটি সাপোর্ট করে। আপনার যদি মডেলের রেসপন্সটি টেক্সট হিসেবে প্রয়োজন হয়, তাহলে আউটপুট অডিও ট্রান্সক্রিপশন ফিচারটি ব্যবহার করুন।
ক্লায়েন্ট প্রমাণীকরণ
লাইভ এপিআই ডিফল্টরূপে শুধুমাত্র সার্ভার-টু-সার্ভার অথেন্টিকেশন প্রদান করে। আপনি যদি ক্লায়েন্ট-টু-সার্ভার পদ্ধতি ব্যবহার করে আপনার লাইভ এপিআই অ্যাপ্লিকেশনটি বাস্তবায়ন করেন, তবে নিরাপত্তা ঝুঁকি কমাতে আপনাকে এফিমিরাল টোকেন ব্যবহার করতে হবে।
সেশনের সময়কাল
শুধুমাত্র অডিও সেশন ১৫ মিনিটে এবং অডিও ও ভিডিও সেশন ২ মিনিটে সীমাবদ্ধ। তবে, সেশনের সময়কাল অনির্দিষ্টকালের জন্য বাড়ানোর জন্য আপনি বিভিন্ন সেশন ব্যবস্থাপনা কৌশল কনফিগার করতে পারেন।
প্রসঙ্গ উইন্ডো
একটি সেশনের কনটেক্সট উইন্ডোর সীমা হলো:
- নেটিভ অডিও আউটপুট মডেলগুলির জন্য ১২৮ হাজার টোকেন
- অন্যান্য লাইভ এপিআই মডেলগুলির জন্য ৩২ হাজার টোকেন
সমর্থিত ভাষা
লাইভ এপিআই নিম্নলিখিত ৯৭টি ভাষা সমর্থন করে।
| ভাষা | বিসিপি-৪৭ কোড | ভাষা | বিসিপি-৪৭ কোড |
|---|---|---|---|
| আফ্রিকান | af | লাতভিয়ান | lv |
| আকান | ak | লিথুয়ানিয়ান | lt |
| আলবেনিয়ান | sq | ম্যাসিডোনিয়ান | mk |
| আমহারিক | am | মালয় | ms |
| আরবি | ar | মালয়ালম | ml |
| আর্মেনীয় | hy | মাল্টিজ | mt |
| অসমীয়া | as | মাওরি | mi |
| আজারবাইজানীয় | az | মারাঠি | mr |
| বাস্ক | eu | মঙ্গোলীয় | mn |
| বেলারুশীয় | be | নেপালি | ne |
| বাংলা | bn | নরওয়েজিয়ান | no |
| বসনীয় | bs | ওড়িয়া | or |
| বুলগেরীয় | bg | ওরোমো | om |
| বর্মী | my | পশতু | ps |
| কাতালান | ca | ফার্সি | fa |
| সেবুয়ানো | ceb | পোলিশ | pl |
| চীনা | zh | পর্তুগিজ | pt |
| ক্রোয়েশীয় | hr | পাঞ্জাবি | pa |
| চেক | cs | কেচুয়া | qu |
| ড্যানিশ | da | রোমানিয়ান | ro |
| ডাচ | nl | রোমানশ | rm |
| ইংরেজি | en | রাশিয়ান | ru |
| এস্তোনিয়ান | et | সার্বিয়ান | sr |
| ফারোয়েজ | fo | সিন্ধি | sd |
| ফিলিপিনো | fil | সিংহলী | si |
| ফিনিশ | fi | স্লোভাক | sk |
| ফরাসি | fr | স্লোভেনীয় | sl |
| গ্যালিসিয়ান | gl | সোমালি | so |
| জর্জিয়ান | ka | দক্ষিণ সোথো | st |
| জার্মান | de | স্প্যানিশ | es |
| গ্রীক | el | সোয়াহিলি | sw |
| গুজরাটি | gu | সুইডিশ | sv |
| হাউসা | ha | তাজিক | tg |
| হিব্রু | iw | তামিল | ta |
| হিন্দি | hi | তেলুগু | te |
| হাঙ্গেরীয় | hu | থাই | th |
| আইসল্যান্ডীয় | is | সোয়ানা | tn |
| ইন্দোনেশিয়ান | id | তুর্কি | tr |
| আইরিশ | ga | তুর্কমেন | tk |
| ইতালীয় | it | ইউক্রেনীয় | uk |
| জাপানি | ja | উর্দু | ur |
| কন্নড় | kn | উজবেক | uz |
| কাজাখ | kk | ভিয়েতনামী | vi |
| খেমার | km | ওয়েলশ | cy |
| কিনিয়ারওয়ান্ডা | rw | পশ্চিম ফ্রিজিয়ান | fy |
| কোরিয়ান | ko | ওলোফ | wo |
| কুর্দিশ | ku | ইয়োরুবা | yo |
| কিরগিজ | ky | জুলু | zu |
| লাও | lo |
এরপর কী?
- লাইভ এপিআই কার্যকরভাবে ব্যবহার করার জন্য প্রয়োজনীয় তথ্যের জন্য টুল ব্যবহার এবং সেশন ব্যবস্থাপনা নির্দেশিকাগুলো পড়ুন।
- Google AI Studio- তে লাইভ এপিআই ব্যবহার করে দেখুন।
- Live API মডেলগুলো সম্পর্কে আরও তথ্যের জন্য, Models পৃষ্ঠায় Gemini 2.5 Flash Native Audio দেখুন।
- Live API কুকবুক , Live API টুলস কুকবুক এবং Live API গেট স্টার্টেড স্ক্রিপ্ট- এ আরও উদাহরণ দেখুন।