টেক্সট-টু-স্পিচ জেনারেশন (TTS)

Gemini API, Gemini টেক্সট-টু-স্পিচ (TTS) জেনারেশন ক্ষমতা ব্যবহার করে টেক্সট ইনপুটকে সিঙ্গেল-স্পিকার বা মাল্টি-স্পিকার অডিওতে ট্রান্সফর্ম করতে পারে। টেক্সট-টু-স্পিচ জেনারেশন কন্ট্রোল করা যায়, অর্থাৎ আপনি অডিওর স্টাইল, উচ্চারণ, গতি এবং টোন গাইড করতে স্ট্রাকচার্ড টার্ন মেটাডেটা (speech_metadata) এবং ইনলাইন ভোকাল ট্যাগ একত্রিত করতে পারবেন।

TTS ক্ষমতা Live API-এর মাধ্যমে প্রদান করা স্পিচ জেনারেশন থেকে আলাদা, যা ইন্ট্যার‍্যাক্টিভ, আনস্ট্রাকচার্ড অডিও এবং মাল্টিমোডাল ইনপুট ও আউটপুটের জন্য ডিজাইন করা হয়েছে। Live API ডায়নামিক কথোপকথনের ক্ষেত্রে দারুণ কাজ করলেও, Gemini API-এর মাধ্যমে TTS এমন পরিস্থিতিতে ব্যবহারের জন্য উপযুক্ত যেখানে স্টাইল ও সাউন্ডের উপর সূক্ষ্ম নিয়ন্ত্রণ রেখে সঠিক টেক্সট আবৃত্তি করার প্রয়োজন হয়, যেমন পডকাস্ট বা অডিওবুক তৈরি করা।

এই নির্দেশিকা আপনাকে দেখায় কীভাবে Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) এবং Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) ব্যবহার করে টেক্সট থেকে সিঙ্গেল-স্পিকার এবং মাল্টি-স্পিকার অডিও জেনারেট করতে হয়।

শুরু করার আগে

মানানসই মডেল বিভাগে তালিকাভুক্ত Gemini TTS মডেল ব্যবহার করছেন কিনা তা নিশ্চিত করুন এবং লেটেস্ট Google GenAI SDK-তে (Python-এর জন্য google-genai >= 2.25.0 বা JavaScript/TypeScript-এর জন্য @google/genai >= 2.24.0) আপগ্রেড করুন অথবা REST API ব্যবহার করুন। সেরা ফলাফল পেতে, আপনার কাজের জন্য সেরা মডেল বেছে নিতে কখন কোন মডেল ব্যবহার করতে হবে তা পর্যালোচনা করুন।

আপনি তৈরি করা শুরু করার আগে AI Studio-তে Gemini TTS মডেল টেস্ট করলে তা আপনার জন্য উপযোগী হতে পারে।

একজন বক্তার TTS

Gemini 3.8 TTS মডেলের সাহায্যে টেক্সটকে সিঙ্গেল-স্পিকার অডিওতে কনভার্ট করতে, input-এ ভারবাটিম ট্রান্সক্রিপ্ট পাস করুন, speech_metadata অ্যানোটেশন ব্যবহার করে টার্ন-লেভেল স্টাইলিং অ্যাটাচ করুন এবং generation_config.speech_config-এ আপনার ভয়েস কনফিগার করুন। আপনি আগে থেকে তৈরি করা ভয়েস বিকল্প, এক্সটেন্ডেড ভয়েস লাইব্রেরি (GET /v1beta/voices), কাস্টম ভয়েস ডিজাইন আইডি (voice_...) অথবা ভয়েস রেপ্লিকেশন আইডি (voice_... অথবা ঐচ্ছিক স্টেটলেস voicekey_...) থেকে ভয়েস বেছে নিতে পারেন।

এই উদাহরণটি মডেল থেকে সরাসরি একটি ফাইলে ডিফল্ট WAV আউটপুট অডিও (audio/wav) সেভ করে:

Python

import base64
from google import genai

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3.8-flash-tts",
    input=[{
        "type": "user_input",
        "content": [{
            "type": "text",
            "text": "Have a wonderful day!",
            "annotations": [{
                "type": "speech_metadata",
                "style": "cheerful and friendly",
            }],
        }],
    }],
    response_format={"type": "audio"},
    generation_config={
        "speech_config": [
            {"voice": "Kore"},
        ]
    },
)

with open("out.wav", "wb") as f:
    f.write(base64.b64decode(interaction.output_audio.data))

জাভাস্ক্রিপ্ট

import * as fs from 'node:fs';
import {GoogleGenAI} from '@google/genai';

async function main() {
   const client = new GoogleGenAI({});

   const interaction = await client.interactions.create({
      model: 'gemini-3.8-flash-tts',
      input: [{
         type: 'user_input',
         content: [{
            type: 'text',
            text: 'Have a wonderful day!',
            annotations: [{
               type: 'speech_metadata',
               style: 'cheerful and friendly',
            }],
         }],
      }],
      response_format: { type: 'audio' },
      generation_config: {
         speech_config: [
            { voice: 'Kore' },
         ],
      },
   });

   const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
   fs.writeFileSync('out.wav', audioBuffer);
}
await main();

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.8-flash-tts",
    "input": [{
      "type": "user_input",
      "content": [{
        "type": "text",
        "text": "Have a wonderful day!",
        "annotations": [{
          "type": "speech_metadata",
          "style": "cheerful and friendly"
        }]
      }]
    }],
    "response_format": {
      "type": "audio"
    },
    "generation_config": {
      "speech_config": [
        { "voice": "Kore" }
      ]
    }
  }' | jq -r '[.steps[] | select(.type=="model_output") | .content[] | select(.type=="audio")] | last | .data' | base64 --decode > out.wav

Python ও JavaScript SDK-তে, আপনি interaction.output_audio কনভেনিয়েন্স প্রপার্টি ব্যবহার করে জেনারেট করা অডিও ডেটা রিট্রিভ করতে পারবেন, যা সর্বশেষ জেনারেট করা অডিও ব্লক রিটার্ন করে (কাঁচা REST JSON রেসপন্সে, base64-এনকোড করা অডিও steps[].content[].data-এ স্টোর করা থাকে)। কনভেনিয়েন্স প্রপার্টির ব্যাপারে আরও জানতে, ইন্টার‍্যাকশন ওভারভিউ দেখুন।

একাধিক স্পিকারের TTS

একাধিক স্পিকারের সংলাপের জন্য, speech_config.speakers-এ দুটি স্পিকার কনফিগার করুন এবং প্রতিটি টার্নকে একটি পৃথক টেক্সট আইটেম হিসেবে পাস করুন, যেখানে speech_metadata অ্যানোটেশন speaker এবং ঐচ্ছিক টার্ন-লেভেল style নির্দিষ্ট করে। লক্ষ্য করুন যে speech_config সিঙ্গেল-স্পিকার জেনারেশনের জন্য একটি অ্যারে ([{"voice": "..."}]) এবং মাল্টি-স্পিকার জেনারেশনের জন্য একটি অবজেক্ট ({"speakers": [...]}) গ্রহণ করে:

Python

import base64
from google import genai

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3.8-flash-tts",
    input=[{
        "type": "user_input",
        "content": [
            {
                "type": "text",
                "text": "How's it going today Jane?",
                "annotations": [{
                    "type": "speech_metadata",
                    "speaker": "Joe",
                    "style": "cheerful and friendly",
                }],
            },
            {
                "type": "text",
                "text": "Not too bad, how about you? Ready to test these new voices?",
                "annotations": [{
                    "type": "speech_metadata",
                    "speaker": "Jane",
                    "style": "calm and relaxed",
                }],
            },
        ],
    }],
    response_format={"type": "audio"},
    generation_config={
        "speech_config": {
            "speakers": [
                {"speaker": "Joe", "voice": "Puck"},
                {"speaker": "Jane", "voice": "Kore"},
            ],
        }
    },
)

with open("out.wav", "wb") as f:
    f.write(base64.b64decode(interaction.output_audio.data))

জাভাস্ক্রিপ্ট

import * as fs from 'node:fs';
import {GoogleGenAI} from '@google/genai';

async function main() {
   const client = new GoogleGenAI({});

   const interaction = await client.interactions.create({
      model: 'gemini-3.8-flash-tts',
      input: [{
         type: 'user_input',
         content: [
            {
               type: 'text',
               text: "How's it going today Jane?",
               annotations: [{
                  type: 'speech_metadata',
                  speaker: 'Joe',
                  style: 'cheerful and friendly',
               }],
            },
            {
               type: 'text',
               text: 'Not too bad, how about you? Ready to test these new voices?',
               annotations: [{
                  type: 'speech_metadata',
                  speaker: 'Jane',
                  style: 'calm and relaxed',
               }],
            },
         ],
      }],
      response_format: { type: 'audio' },
      generation_config: {
         speech_config: {
            speakers: [
               { speaker: 'Joe', voice: 'Puck' },
               { speaker: 'Jane', voice: 'Kore' },
            ],
         },
      },
   });

   const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
   fs.writeFileSync('out.wav', audioBuffer);
}

await main();

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.8-flash-tts",
    "input": [{
      "type": "user_input",
      "content": [
        {
          "type": "text",
          "text": "How'\''s it going today Jane?",
          "annotations": [{
            "type": "speech_metadata",
            "speaker": "Joe",
            "style": "cheerful and friendly"
          }]
        },
        {
          "type": "text",
          "text": "Not too bad, how about you? Ready to test these new voices?",
          "annotations": [{
            "type": "speech_metadata",
            "speaker": "Jane",
            "style": "calm and relaxed"
          }]
        }
      ]
    }],
    "response_format": {
      "type": "audio"
    },
    "generation_config": {
      "speech_config": {
        "mode": "conversational",
        "speakers": [
          { "speaker": "Joe", "voice": "Puck" },
          { "speaker": "Jane", "voice": "Kore" }
        ]
      }
    }
  }'

মেটাডেটা ও ট্যাগ ব্যবহার করে স্পিচ স্টাইল কন্ট্রোল করা

Gemini 3.8 TTS, text ফিল্ডকে কঠোরভাবে একটি ভারবাটিম ট্রান্সক্রিপ্ট হিসেবে বিবেচনা করে। স্টেজের দিকনির্দেশ জোরে না পড়ে ডেলিভারি নিয়ন্ত্রণ করতে, আপনার নির্দেশাবলী স্কোপ অনুযায়ী ভাগ করুন:

  • দীর্ঘস্থায়ী টার্ন-লেভেল ডেলিভারি (speech_metadata.style): style ফিল্ডে (যেমন, "style": "whispered urgently", "style": "out of breath" বা "style": "warm and enthusiastic") পুরো টার্ন জুড়ে প্রযোজ্য আবেগ, ডেলিভারি স্টাইল, প্রসোডি, পেসিং ও ভলিউম যোগ করুন।
  • পয়েন্ট-ইন-টাইম ইভেন্ট (ইনলাইন ট্যাগ): অ্যাঙ্গেল ব্র্যাকেট ব্যবহার করে ট্রান্সক্রিপ্টের মধ্যে সরাসরি ক্ষণস্থায়ী নন-স্পিচ ভোকাল বার্স্ট বা পজ প্লেস করুন (যেমন, "Wait... <short pause> did you hear that? <sigh>" বা "Excuse me <cough> as I was saying...")।

পেশাদার পদ্ধতি সম্পর্কে বিস্তারিত জানতে প্রম্পট সংক্রান্ত নির্দেশিকা দেখুন।

Python

import base64
from google import genai

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3.8-flash-tts",
    input=[{
        "type": "user_input",
        "content": [
            {
                "type": "text",
                "text": "Wait... <short pause> look under that fallen log! Is that a blue-spotted salamander?",
                "annotations": [{
                    "type": "speech_metadata",
                    "speaker": "Dr. Anya",
                    "style": "whispered urgently",
                }],
            },
            {
                "type": "text",
                "text": "<gasp> No way! <laugh> We've been searching for this species all season!",
                "annotations": [{
                    "type": "speech_metadata",
                    "speaker": "Liam",
                    "style": "warm and enthusiastic",
                }],
            },
        ],
    }],
    response_format={"type": "audio"},
    generation_config={
        "speech_config": {
            "speakers": [
                {"speaker": "Dr. Anya", "voice": "Kore"},
                {"speaker": "Liam", "voice": "Puck"},
            ],
        }
    },
)

with open("out.wav", "wb") as f:
    f.write(base64.b64decode(interaction.output_audio.data))

জাভাস্ক্রিপ্ট

import * as fs from 'node:fs';
import {GoogleGenAI} from '@google/genai';

async function main() {
   const client = new GoogleGenAI({});

   const interaction = await client.interactions.create({
      model: 'gemini-3.8-flash-tts',
      input: [{
         type: 'user_input',
         content: [
            {
               type: 'text',
               text: 'Wait... <short pause> look under that fallen log! Is that a blue-spotted salamander?',
               annotations: [{
                  type: 'speech_metadata',
                  speaker: 'Dr. Anya',
                  style: 'whispered urgently',
               }],
            },
            {
               type: 'text',
               text: "<gasp> No way! <laugh> We've been searching for this species all season!",
               annotations: [{
                  type: 'speech_metadata',
                  speaker: 'Liam',
                  style: 'warm and enthusiastic',
               }],
            },
         ],
      }],
      response_format: { type: 'audio' },
      generation_config: {
         speech_config: {
            speakers: [
               { speaker: 'Dr. Anya', voice: 'Kore' },
               { speaker: 'Liam', voice: 'Puck' },
            ],
         },
      },
   });

   if (interaction.output_audio?.data) {
      const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
      fs.writeFileSync('out.wav', audioBuffer);
   }
}

await main();

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.8-flash-tts",
    "input": [{
      "type": "user_input",
      "content": [
        {
          "type": "text",
          "text": "Wait... <short pause> look under that fallen log! Is that a blue-spotted salamander?",
          "annotations": [{
            "type": "speech_metadata",
            "speaker": "Dr. Anya",
            "style": "whispered urgently"
          }]
        },
        {
          "type": "text",
          "text": "<gasp> No way! <laugh> We'\''ve been searching for this species all season!",
          "annotations": [{
            "type": "speech_metadata",
            "speaker": "Liam",
            "style": "warm and enthusiastic"
          }]
        }
      ]
    }],
    "response_format": {
      "type": "audio"
    },
    "generation_config": {
      "speech_config": {
        "speakers": [
          { "speaker": "Dr. Anya", "voice": "Kore" },
          { "speaker": "Liam", "voice": "Puck" }
        ]
      }
    }
  }'

স্ট্রিমিং স্পিচ জেনারেশন

আপনি stream: true সেট করে জেনারেট করা অডিও স্ট্রিম করতে পারবেন। ইউনারি অনুরোধের (যা RIFF হেডার সহ সম্পূর্ণ WAV ফাইল ফিরিয়ে দেয়) মতো নয়, স্ট্রিমিং অনুরোধ ডিফল্ট হিসেবে হেডারলেস র ১৬-বিট সাইনড লিটল-এন্ডিয়ান লিনিয়ার পিসিএম (audio/l16, ২৪ kHz, মোনো) চাঙ্ক ফিরিয়ে দেয় যাতে কন্টেনার হেডার ছাড়াই অডিও চাঙ্ক একটানা চালানো বা কনক্যাটিনেট করা যায়।

Python

import base64
from google import genai

client = genai.Client()

stream = client.interactions.create(
    model="gemini-3.8-flash-tts",
    input=[{
        "type": "user_input",
        "content": [{
            "type": "text",
            "text": "Have a wonderful day!",
            "annotations": [{
                "type": "speech_metadata",
                "style": "cheerful and friendly",
            }],
        }],
    }],
    response_format={"type": "audio"},
    generation_config={
        "speech_config": [
            {"voice": "Kore"},
        ]
    },
    stream=True,
)

for event in stream:
    if event.event_type == "step.delta":
        if event.delta.type == "audio":
            audio_data = base64.b64decode(event.delta.data)
            # Process the audio chunk (e.g. play it or write to a file)

জাভাস্ক্রিপ্ট

import {GoogleGenAI} from '@google/genai';

async function main() {
   const client = new GoogleGenAI({});

   const stream = await client.interactions.create({
      model: 'gemini-3.8-flash-tts',
      input: [{
         type: 'user_input',
         content: [{
            type: 'text',
            text: 'Have a wonderful day!',
            annotations: [{
               type: 'speech_metadata',
               style: 'cheerful and friendly',
            }],
         }],
      }],
      response_format: { type: 'audio' },
      generation_config: {
         speech_config: [
            { voice: 'Kore' },
         ],
      },
      stream: true,
   });

   for await (const event of stream) {
      if (event.event_type === 'step.delta') {
         if (event.delta.type === 'audio') {
            const audioBuffer = Buffer.from(event.delta.data, 'base64');
            // Process the audio buffer
         }
      }
   }
}
await main();

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  --no-buffer \
  -d '{
    "model": "gemini-3.8-flash-tts",
    "input": [{
      "type": "user_input",
      "content": [{
        "type": "text",
        "text": "Have a wonderful day!",
        "annotations": [{
          "type": "speech_metadata",
          "style": "cheerful and friendly"
        }]
      }]
    }],
    "response_format": {
      "type": "audio"
    },
    "generation_config": {
      "speech_config": [
        { "voice": "Kore" }
      ]
    },
    "stream": true
  }'

অডিও আউটপুট ফর্ম্যাট

অনুরোধটি ইউনারি নাকি স্ট্রিমিং, তার উপর নির্ভর করে Gemini 3.8 TTS মডেলগুলি বিভিন্ন ডিফল্ট অডিও ফর্ম্যাট ব্যবহার করে:

  • ইউনারি অনুরোধ (stream=False): স্ট্যান্ডার্ড RIFF হেডার (২৪ kHz, মোনো, ১৬-বিট সাইনড লিটল-এন্ডিয়ান PCM) সহ সম্পূর্ণ WAV (audio/wav) অডিও ফেরত দেয়। আপনি ডিকোড করা অডিও বাইট সরাসরি .wav ফাইলে সেভ করতে পারবেন, WAV হেডার ম্যানুয়ালি যোগ না করেই।
  • স্ট্রিমিং অনুরোধ (stream=True): ডিফল্ট হিসেবে হেডার ছাড়া কাঁচা Linear PCM (audio/l16) চ্যাঙ্ক (২৪ kHz, মনো, ১৬-বিট সাইন করা লিটল-এন্ডিয়ান PCM) রিটার্ন করুন যাতে প্রতিটি চ্যাঙ্কে কন্টেনার হেডার না রেখে চ্যাঙ্কগুলি ক্রমাগত স্ট্রিম বা কনক্যাটেনেট করা যায়।

অন্য অডিও এনকোডিং বা স্যাম্পেল রেটের অনুরোধ করতে, response_format-এর মধ্যে mime_type এবং ঐচ্ছিক sample_rate কনফিগার করুন:

ফর্ম্যাট mime_typeটি বিবরণ
WAV (ইউনারি ডিফল্ট) "audio/wav" RIFF হেডার সহ আনকমপ্রেসড WAV ফাইল (১৬-বিট সাইনড লিটল-এন্ডিয়ান PCM, মোনো, ২৪ kHz ডিফল্ট)। ইউনারি অনুরোধের জন্য ডিফল্ট।
Raw PCM (L16) (স্ট্রিমিং ডিফল্ট) "audio/l16" কমপ্রেস না করা, হেডারলেস ১৬-বিট সাইনড লিটল-এন্ডিয়ান লিনিয়ার PCM অডিও (২৪ kHz, মোনো)। স্ট্রিমিং অনুরোধের জন্য ডিফল্ট।
Mu-law "audio/mulaw" ৮-বিট G.711 mu-law এনকোড করা অডিও (সাধারণত উত্তর আমেরিকান এবং জাপানি টেলিফোনি/IVR সিস্টেমে ব্যবহৃত হয়)।
A-law "audio/alaw" ৮-বিট G.711 A-ল এনকোড করা অডিও (সাধারণত ইউরোপীয় ও আন্তর্জাতিক টেলিফোনি সিস্টেমে ব্যবহার করা হয়)।

এছাড়াও, আপনি হার্জে sample_rate নির্দিষ্ট করতে পারবেন (যেমন, 24000, 16000 বা 8000)।

Python

import base64
from google import genai

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3.8-flash-tts",
    input=[{
        "type": "user_input",
        "content": [{
            "type": "text",
            "text": "Have a wonderful day!",
            "annotations": [{
                "type": "speech_metadata",
                "style": "cheerful and friendly",
            }],
        }],
    }],
    response_format={
        "type": "audio",
        "mime_type": "audio/l16",  # "audio/wav" (default), "audio/l16", "audio/mulaw", or "audio/alaw"
        "sample_rate": 24000,
    },
    generation_config={
        "speech_config": [
            {"voice": "Kore"},
        ]
    },
)

with open("out.pcm", "wb") as f:
    f.write(base64.b64decode(interaction.output_audio.data))

জাভাস্ক্রিপ্ট

import * as fs from 'node:fs';
import {GoogleGenAI} from '@google/genai';

async function main() {
   const client = new GoogleGenAI({});

   const interaction = await client.interactions.create({
      model: 'gemini-3.8-flash-tts',
      input: [{
         type: 'user_input',
         content: [{
            type: 'text',
            text: 'Have a wonderful day!',
            annotations: [{
               type: 'speech_metadata',
               style: 'cheerful and friendly',
            }],
         }],
      }],
      response_format: {
         type: 'audio',
         mime_type: 'audio/l16', // 'audio/wav' (default), 'audio/l16', 'audio/mulaw', or 'audio/alaw'
         sample_rate: 24000,
      },
      generation_config: {
         speech_config: [
            { voice: 'Kore' },
         ],
      },
   });

   const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
   fs.writeFileSync('out.pcm', audioBuffer);
}
await main();

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.8-flash-tts",
    "input": [{
      "type": "user_input",
      "content": [{
        "type": "text",
        "text": "Have a wonderful day!",
        "annotations": [{
          "type": "speech_metadata",
          "style": "cheerful and friendly"
        }]
      }]
    }],
    "response_format": {
      "type": "audio",
      "mime_type": "audio/l16",
      "sample_rate": 24000
    },
    "generation_config": {
      "speech_config": [
        { "voice": "Kore" }
      ]
    }
  }'

ভয়েস সংক্রান্ত বিকল্প

Gemini 3.8 TTS-এ ভয়েস বেছে নেওয়া বা তৈরি করার চারটি পদ্ধতি কাজ করে:

  1. প্রি-বিল্ট স্টুডিও ভয়েস: নিচের সারণিতে ৩০টি কিউরেট করা ভয়েসের তালিকা দেওয়া আছে।
  2. এক্সটেন্ডেড ভয়েস লাইব্রেরি: বিভিন্ন ভাষা, অ্যাকসেন্ট ও চরিত্রের আর্কিটাইপ জুড়ে শত শত অতিরিক্ত ভয়েস client.voices.list() (GET /v1beta/voices) ব্যবহার করে অ্যাক্সেস করা যায়।
  3. ভয়েস ডিজাইন: Google AI Studio-তে ন্যাচারাল ল্যাঙ্গুয়েজ বিবরণ থেকে অথবা POST /v1beta/voices (type="prompted", যা CreateVoice ও GetVoice-এ একটি স্থায়ী voice_... আইডি এবং একটি sample_audio WAV প্রিভিউ রিটার্ন করে) ব্যবহার করে একটি কাস্টম ভোকাল পারসোনা জেনারেট করুন।
  4. ভয়েস রেপ্লিকেশন: Google AI Studio-তে বা POST /v1beta/voices (type="replicated", ডিফল্ট হিসেবে পারসিস্টেন্ট store=True বা ঐচ্ছিক স্টেটলেস store=False) ব্যবহার করে রেফারেন্স ও সম্মতি অডিও থেকে স্পিকারের ভয়েস রেপ্লিকেট করুন।

কাস্টম ভয়েস সীমা ও TTL

ভয়েস টাইপিং স্টোরেজ মোড কোটা / সীমা রিটেনশন (TTL)
স্টেটফুল ভয়েস (voice_..., প্রম্পট করা বা রেপ্লিকেট করা) store=True প্রতিটি প্রোজেক্টে ২০০টি ভয়েস (প্রম্পট করা ও রেপ্লিকেট করা ভয়েস জুড়ে) শেষবার ব্যবহার করার পর থেকে ১ বছর*
স্টেটলেস ভয়েস কী (voicekey_..., রেপ্লিকেট করা) store=False ক্লায়েন্ট-ম্যানেজড ৭ দিন

TTL এক্সটেনশন: প্রতিবার ভয়েস অ্যাক্টিভভাবে ব্যবহার করা হলে (ভয়েসের সাথে স্পিচ সিন্থেসাইজ করে অথবা রিমিক্স করার জন্য বেস ভয়েস হিসেবে ব্যবহার করে) ১-বছরের রিটেনশন উইন্ডো রিসেট হয়ে যায়। ১ বছর ধরে কোনও অ্যাক্টিভিটি না থাকা ভয়েস অটোমেটিক মুছে দেওয়া হয়।

প্রি-বিল্ট ভয়েস

Zephyr -- Bright পাক -- আপবিট Charon -- তথ্যপূর্ণ
Kore -- Firm Fenrir -- উত্তেজিত Leda -- Youthful
Orus -- Firm Aoede -- Breezy Callirrhoe -- সহজ
Autonoe -- উজ্জ্বল Enceladus -- Breathy Iapetus -- পরিষ্কার
Umbriel -- সহজ Algieba -- Smooth ডেসপিনা -- স্মুথ
Erinome -- পরিষ্কার Algenib -- Gravelly Rasalgethi -- তথ্যপূর্ণ
Laomedeia -- Upbeat Achernar -- Soft Alnilam -- Firm
Schedar -- Even Gacrux -- ম্যাচিওর Pulcherrima -- এগিয়ে যান
Achird -- বন্ধুত্বপূর্ণ Zubenelgenubi -- ক্যাজুয়াল Vindemiatrix -- Gentle
সদাচবিয়া -- লাইভলি Sadaltager -- Knowledgeable Sulafat -- উষ্ণ

এক্সটেন্ডেড ভয়েস লাইব্রেরি ও ফিল্টারিং

আগের সারণীতে দেখানো ৩০টি ফিচার করা স্টুডিও ভয়েস ছাড়াও, এক্সটেন্ডেড ভয়েস লাইব্রেরি বিভিন্ন ভাষা, আঞ্চলিক অ্যাকসেন্ট, চরিত্রের ব্যক্তিত্ব এবং ডোমেন জুড়ে শত শত অতিরিক্ত ভয়েস প্রদান করে। আপনি Google AI Studio-তে ইন্টার‍্যাক্টিভভাবে সম্পূর্ণ ভয়েস লাইব্রেরি ব্রাউজ, ফিল্টার ও অডিশন করতে পারবেন অথবা client.voices.list() (GET /v1beta/voices, google-genai 2.25.0+ / @google/genai 2.24.0+ ব্যবহার করে) ব্যবহার করে প্রোগ্রাম্যাটিকভাবে কোয়েরি করতে পারবেন।

ListVoices আপনার কাস্টম স্টোর করা ভয়েস (সবচেয়ে নতুন ভয়েস প্রথমে দেখানো হয়) এবং তারপরে আপনার ফিল্টার মাপকাঠির সাথে ম্যাচ করা প্রি-বিল্ট ক্যাটালগ ভয়েস দেখায়। তালিকা ফিল্টারের জন্য একাধিক মান প্রদান করা হলে, সেই ফিল্টারে যেকোনও মানের সাথে ম্যাচ করা ভয়েস রিটার্ন করা হয় (OR), যেখানে আলাদা ফিল্টার প্যারামিটার AND-এর সাথে একত্রিত হয়:

প্যারামিটার ধরন বিবরণ
language_code list[str] BCP-47 ভাষা ট্যাগ (যেমন, ["en-US", "en-GB"])। কেস-ইনসেনসিটিভ হুবহু মিল।
region_code list[str] ISO 3166-1 alpha-2 বা UN M.49 অঞ্চলের কোড (যেমন, ["US", "GB"])।
accent list[str] আঞ্চলিক অ্যাকসেন্ট ডেসক্রিপ্টর (যেমন, ["American", "British"])।
gender list[str] লিঙ্গগত পরিচয় ("female", "male" বা "neutral")।
pitch list[str] ভোকাল পিচ ক্লাসিফিকেশন ("low", "medium" বা "high")।
persona list[str] ভোকাল পারসোনা বা চরিত্রের আর্কিটাইপ (যেমন, ["Warm, Friendly"], ["Narrator"])।
contexts (REST-এ context) list[str] ব্যবহারের জন্য আদর্শ ডোমেন (যেমন, ["Audiobook", "Conversational", "News"])।
type (Python-এ type_) list[str] ভয়েস সোর্স অনুযায়ী ফিল্টার করুন: "prebuilt", "prompted" (ভয়েস ডিজাইন) অথবা "replicated" (ভয়েস রেপ্লিকেশন)।
search str ফ্রি-টেক্সট সাবস্ট্রিং সার্চ display_name এবং description-এর সাথে কেস-ইনসেনসিটিভভাবে মিলেছে।
page_size int প্রতি পৃষ্ঠায় সর্বাধিক সংখ্যক ভয়েস রিটার্ন করা হয়েছে (ডিফল্ট 50, সর্বাধিক 1000)।
page_token str পরবর্তী পৃষ্ঠার ফলাফল পেতে response.next_page_token থেকে টোকেন।

Python

from google import genai

client = genai.Client()

# Filter the Voice Library by language, gender, pitch, domain context, and keyword
response = client.voices.list(
    language_code=["en-US", "en-GB"],
    gender=["female"],
    pitch=["medium", "low"],
    contexts=["Audiobook", "Conversational"],
    type_=["prebuilt"],
    search="warm",
    page_size=50,
)

for voice in response.voices or []:
    print(
        f"{voice.id} | {voice.display_name} ({voice.language_code},"
        f" {voice.accent}, {voice.gender}, pitch={voice.pitch}):"
        f" {voice.description}"
    )

জাভাস্ক্রিপ্ট

import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI();

// Filter the Voice Library by language, gender, pitch, domain context, and keyword
const response = await ai.voices.list({
  language_code: ["en-US", "en-GB"],
  gender: ["female"],
  pitch: ["medium", "low"],
  contexts: ["Audiobook", "Conversational"],
  type: ["prebuilt"],
  search: "warm",
  page_size: 50,
});

for (const voice of response.voices ?? []) {
  console.log(
    `${voice.id} | ${voice.display_name} (${voice.language_code}, ${voice.accent}, ${voice.gender}, pitch=${voice.pitch}): ${voice.description}`
  );
}

বিশ্রাম

curl -G "https://generativelanguage.googleapis.com/v1beta/voices" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  --data-urlencode "language_code=en-US" \
  --data-urlencode "language_code=en-GB" \
  --data-urlencode "gender=female" \
  --data-urlencode "pitch=medium" \
  --data-urlencode "context=Audiobook" \
  --data-urlencode "type=prebuilt" \
  --data-urlencode "search=warm" \
  --data-urlencode "page_size=50"

যেসব ভাষায় এটি ব্যবহার করা যায়

TTS মডেল অটোমেটিক ইনপুট ভাষা শনাক্ত করে। Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) ১৩০টিরও বেশি ভাষায় কাজ করে এবং Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) ১০০টিরও বেশি ভাষায় কাজ করে:

ভাষা Gemini 3.8 Flash TTS Gemini 3.8 Flash-Lite TTS
আচেনিজ (আরবি স্ক্রিপ্ট) ✔️ ✔️
আফ্রিকান্স ✔️ ✔️
আকান ✔️ ✔️
আমহারীক ✔️ ✔️
আর্মেনীয় ✔️ ✔️
অসমিয়া ✔️ ✔️
আওয়াধি ✔️ ✔️
বালিনিজ ✔️ ✔️
বাংলা ✔️ ✔️
বানজার (আরবি স্ক্রিপ্ট) ✔️ —
বানজার (ল্যাটিন স্ক্রিপ্ট) ✔️ ✔️
বাশকির ✔️ —
বাস্ক ✔️ ✔️
বেলারুশিয়ান ✔️ ✔️
বেম্বা ✔️ —
ভোজপুরি ✔️ ✔️
বসনিয়ান ✔️ ✔️
বুগিনিজ ✔️ ✔️
বুলগেরিয়ান ✔️ ✔️
বার্মিজ ✔️ —
ক্যান্টনিজ ✔️ ✔️
কাতালান ✔️ ✔️
সেবুয়ানো ✔️ ✔️
সেন্ট্রাল কুর্দিশ ✔️ ✔️
ছত্তিসগড়ী ✔️ ✔️
চীনা (হান্স স্ক্রিপ্ট) ✔️ ✔️
চীনা (Hant স্ক্রিপ্ট) ✔️ ✔️
ক্রিমিয়ান তাতার ✔️ —
ক্রোয়েশিয়ান ✔️ ✔️
চেক ✔️ ✔️
ড্যানিশ ✔️ ✔️
ডাচ ✔️ ✔️
ডায়ুলা ✔️ —
জংখা ✔️ —
মিশরীয় আরবি ✔️ ✔️
ইংরেজি ✔️ ✔️
এস্তোনিয়ান ✔️ ✔️
ফিলিপিনো ✔️ ✔️
ফিনিশ ✔️ —
ফরাসী ✔️ ✔️
গ্যালিশিয় ✔️ ✔️
Ganda ✔️ ✔️
জর্জিয়ান ✔️ ✔️
জার্মান ✔️ ✔️
গ্রিক ✔️ ✔️
গুয়ারানি ✔️ —
গুজরাতি ✔️ ✔️
হাইতিয়ান ক্রেওল ✔️ ✔️
খালখ মঙ্গোলিয়ান ✔️ ✔️
হাউসা ✔️ ✔️
হিব্রু ✔️ ✔️
হিন্দি ✔️ ✔️
হাঙ্গেরিয়ান ✔️ ✔️
আইসল্যান্ডিক ✔️ ✔️
ইগবো ✔️ —
ইলোকো ✔️ ✔️
ইন্দোনেশিয়ান ✔️ ✔️
ইরানিয়ান ফার্সি ✔️ ✔️
ইতালিয়ান ✔️ ✔️
জাপানি ✔️ ✔️
জাভানীয় ✔️ ✔️
কাবাইল ✔️ —
কাম্বা ✔️ ✔️
কন্নড় ✔️ ✔️
কাশ্মীরি (আরবি লিপি) ✔️ ✔️
কাশ্মীরি (দেবনাগরী স্ক্রিপ্ট) ✔️ ✔️
কাজাখ ✔️ ✔️
খমের ✔️ ✔️
কিকু্ইয়ু ✔️ ✔️
কাইনিয়ারোয়ান্ডা ✔️ ✔️
কঙ্গো ✔️ ✔️
কোরিয়ান ✔️ ✔️
কিরগিজ ✔️ ✔️
লাও ✔️ ✔️
লাতগালিয়ান ✔️ —
লিঙ্গালা ✔️ ✔️
লিথুয়ানিয়ান ✔️ —
লুক্সেমবার্গীয় ✔️ —
ম্যাসিডোনীয় ✔️ ✔️
মগহী ✔️ ✔️
মৈথিলি ✔️ ✔️
মালায়লাম ✔️ ✔️
মল্টিজ ✔️ ✔️
মণিপুরী ✔️ ✔️
মারাঠি ✔️ ✔️
মিনাঙ্গকাবাউ (আরবি স্ক্রিপ্ট) ✔️ ✔️
মিনাংকাবাউ (ল্যাটিন স্ক্রিপ্ট) ✔️ —
মিজো ✔️ ✔️
নেপালি (ব্যক্তিগত ভাষা) ✔️ ✔️
নাইজেরিয়ান ফুলফুলদে ✔️ ✔️
উত্তর আজারবাইজানি ✔️ ✔️
নর্দার্ন সোথো ✔️ ✔️
উত্তর উজবেক ✔️ ✔️
নরওয়ে বোকমাল ✔️ ✔️
নরওয়েজীয় নাইনরস্ক ✔️ ✔️
নিয়াঞ্জা ✔️ ✔️
অকসিটান ✔️ —
ওড়িয়া (স্বতন্ত্র ভাষা) ✔️ ✔️
পাঙ্গাসিনান ✔️ —
ফারসি (আফগানিস্তান) ✔️ ✔️
পোলিশ ✔️ ✔️
পর্তুগিজ ✔️ ✔️
পঞ্জাবি ✔️ ✔️
রোমানিয়ান ✔️ ✔️
রুশ ✔️ ✔️
সাঁওতালি ✔️ ✔️
সার্বিয় ✔️ ✔️
সিন্ধি ✔️ —
সিংহলি ✔️ ✔️
স্লোভাক ✔️ ✔️
স্লোভেনিয়ান ✔️ —
সোমালি ✔️ —
দক্ষিণ আজারবাইজানি ✔️ ✔️
দক্ষিণ পশতু ✔️ ✔️
সাউদার্ন সোথো ✔️ —
স্প্যানিশ ✔️ ✔️
আধুনিক আরবি (আরবি স্ক্রিপ্ট) ✔️ ✔️
প্রমিত আরবি (ল্যাটিন স্ক্রিপ্ট) ✔️ ✔️
স্ট্যান্ডার্ড লাটভিয়ান ✔️ ✔️
প্রমিত মালয় ✔️ ✔️
সোয়াহিলি (স্বতন্ত্র ভাষা) ✔️ —
সোয়াতি ✔️ —
সুইডিশ ✔️ —
তাজিক ✔️ —
তামিল ✔️ ✔️
তেলুগু ✔️ ✔️
থাই ✔️ —
টাইগ্রিনা ✔️ —
Tosk আলবেনিয়ান ✔️ —
তুর্কি ✔️ ✔️
উইঘুর ✔️ —
ভিয়েতনামিজ ✔️ ✔️

মানানসই মডেল

মডেল একজন বক্তা একাধিক স্পিকার ভয়েস ডিজাইন ভয়েস রেপ্লিকেশন
Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) ✔️ ✔️ ✔️ ✔️
Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) ✔️ ✔️ ✔️ ✔️
Gemini 3.1 Flash TTS প্রিভিউ ✔️ ✔️ — —
Gemini 2.5 Pro প্রিভিউ TTS ✔️ ✔️ — —

কখন কোন মডেল ব্যবহার করতে হবে

দুটি Gemini 3.8 TTS মডেলই একই API স্কিমা এবং প্রম্পটিং ফর্ম্যাট শেয়ার করে, যার ফলে আপনি একটি প্যারামিটার পরিবর্তন করেই একটি থেকে অন্যটিতে সুইচ করতে পারবেন:

  • Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) ব্যবহার করুন যখন সর্বাধিক অ্যাকোস্টিক ফিডেলিটি, সূক্ষ্ম অভিনয়, এবং ভাবপূর্ণ কন্ট্রোলকে সবচেয়ে বেশি অগ্রাধিকার দেওয়া হয়। এটি স্টুডিও-গ্রেড ক্রিয়েটিভ কাজ, জটিল মাল্টি-স্পিকার ডায়ালগ, ভারী ভোকাল-বার্স্ট ট্যাগ, কঠিন উচ্চারণ, আঞ্চলিক বা সংখ্যালঘু উপভাষা এবং দীর্ঘ-ফর্মের বর্ণনার জন্য আদর্শ যার জন্য রক-সলিড ভয়েস এবং রুম-টোন স্থিতিশীলতা প্রয়োজন।
  • gemini-3.1-flash-tts-preview-এর পরিবর্তে Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts)-কে আপনার দ্রুত, কম খরচে কাজ করার উপযুক্ত মডেল হিসেবে ব্যবহার করুন। এটি হাই-ভলিউম বাল্ক প্রোডাকশন, কথোপকথনমূলক ভয়েস এজেন্ট ক্যাসকেড, জোরে পড়ো ফিচার, নির্ভরযোগ্য ভয়েস রেপ্লিকেশন এবং প্রধান ভাষা জুড়ে প্রতিদিনের সিঙ্গেল-স্পিকার স্পিচের জন্য অপ্টিমাইজ করা হয়েছে।

মাইগ্রেশন গাইড

আপনি যদি gemini-3.1-flash-tts-preview বা তার আগের Gemini TTS মডেল থেকে Gemini 3.8 TTS-এ মাইগ্রেট করেন:

  1. টার্ন-লেভেল নির্দেশাবলী speech_metadata-এ সরান: Gemini 3.8 TTS ইনপুট টেক্সটকে হুবহু ট্রান্সক্রিপ্ট হিসেবে বিবেচনা করে। ট্রান্সক্রিপ্ট টেক্সটে স্টেজ ডিরেকশন এম্বেড করার পরিবর্তে, সাসটেইনড ডেলিভারি নির্দেশাবলী (style—যেমন "whispering", "out of breath", বা "speaking slowly") এবং স্পিকার লেবেল (speaker) স্ট্রাকচার্ড speech_metadata অ্যানোটেশনে সরান।
  2. শুধুমাত্র নির্দিষ্ট সময়ের ভোকাল ইভেন্টের জন্য অ্যাঙ্গেল-ব্র্যাকেট ইনলাইন ট্যাগ ব্যবহার করুন: অ্যাঙ্গেল ব্র্যাকেট (যেমন <laugh>, <sigh>, <cough>, <breath>, অথবা <short pause>) ব্যবহার করে ট্রান্সক্রিপ্টে ক্ষণস্থায়ী নন-স্পিচ ভোকাল এবং পজ ইনলাইন রাখুন। সাউন্ড-ইফেক্ট ট্যাগ (যেমন হাততালি বা ধপ করে শব্দ) এড়িয়ে চলুন এবং ডেলিভারি স্টাইল speech_metadata.style-এ রাখুন।
  3. একাধিক স্পিকারের অনুরোধে প্রতিটি ধাপে speaker উল্লেখ করুন: একাধিক স্পিকারের অনুরোধের প্রতিটি ধাপে কনফিগার করা স্পিকারের সাথে ম্যাচ করা speaker অবশ্যই speech_metadata স্পষ্টভাবে উল্লেখ করতে হবে।
  4. ভয়েস ডিজাইনের মাধ্যমে আগে থেকেই পার্সোনা ডিজাইন করুন: ভয়েস ডিজাইন-এ তৈরি করা কাস্টম ভয়েস দিয়ে একাধিক প্যারাগ্রাফ "Audio Profile" বা "Director's Notes" ব্লক পাল্টে দিন, তারপর সেই voice_... আইডি আপনার TTS অনুরোধের মাধ্যমে ন্যূনতম বা খালি style স্ট্রিং সহ নিয়ে যান।
  5. একক অনুরোধের ক্ষেত্রে ডিফল্ট WAV (audio/wav) আউটপুটের জন্য অ্যাকাউন্ট: gemini-3.1-flash-tts-preview ও এর আগের TTS মডেলের (যেগুলি ডিফল্ট হিসেবে হেডার ছাড়া কাঁচা PCM audio/l16 রিটার্ন করে) মতো নয়, Gemini 3.8 TTS একক অনুরোধের ক্ষেত্রে ডিফল্ট হিসেবে স্ট্যান্ডার্ড RIFF হেডার সহ WAV অডিও (audio/wav) রিটার্ন করে।
    • আপনার কোড আগে WAV হেডারে (যেমন, Python-এর wave মডিউল বা ffmpeg ব্যবহার করে) র PCM বাইট র‍্যাপ করে থাকলে, ম্যানুয়াল হেডার র‍্যাপার সরিয়ে দিন এবং ফেরত পাওয়া বাইট সরাসরি .wav ফাইলে লিখুন।
    • আপনার পাইপলাইনে হেডার ছাড়া কাঁচা PCM, mu-law বা A-law অডিও প্রয়োজন হলে, response_format.mime_type-কে "audio/l16", "audio/mulaw" বা "audio/alaw" হিসেবে স্পষ্টভাবে সেট করুন (যেমন, {"response_format": {"type": "audio", "mime_type": "audio/l16"}} Interactions API-তে অথবা AUDIO_L16 generateContent-এ)। অডিও আউটপুট ফর্ম্যাট দেখুন।

প্রম্পট সংক্রান্ত গাইড

Gemini 3.8 TTS মডেল ইনপুট টেক্সটকে কঠোরভাবে আক্ষরিক ট্রানস্ক্রিপ্ট হিসেবে বিবেচনা করে। আগের প্রিভিউ মডেলের মতো নয়, যেখানে স্টেজ নির্দেশাবলী সাধারণ টেক্সটে এম্বেড করা ছিল, Gemini 3.8 TTS, সাসটেনড টার্ন-লেভেল নির্দেশাবলী (speech_metadata) থেকে পয়েন্ট-ইন-টাইম ইনলাইন ভোকাল ট্যাগ আলাদা করে।

স্টাইল ফিল্ড বনাম ইনলাইন ট্যাগ

স্কোপ অনুযায়ী আপনার পারফর্ম্যান্স সংক্রান্ত নির্দেশাবলী ভাগ করুন:

  • টার্ন-লেভেল ডেলিভারি (speech_metadata.style): speech_metadata-এর style ফিল্ডে ডেলিভারির স্থায়ী অ্যাট্রিবিউট—যেমন আবেগ, প্রসডি, সামগ্রিক গতি বা ডেলিভারির স্টাইল (যেমন "whispering", "out of breath", "muttering" বা "sarcastic")—যোগ করুন। প্রতিটি টার্ন জুড়ে একটি স্থিতিশীল চরিত্র ও পারফর্ম্যান্স তৈরি করতে, আগে থেকেই ভয়েস ডিজাইনে পার্সোনা ডিজাইন করুন এবং style শুধুমাত্র ঐচ্ছিক টার্ন-লেভেল টিউনিংয়ের জন্য ব্যবহার করুন।
  • পয়েন্ট-ইন-টাইম ইভেন্ট (ইনলাইন ট্যাগ): ট্রান্সক্রিপ্টের মধ্যে ইনলাইন হিসেবে ক্ষণস্থায়ী অ-মৌখিক সাউন্ড, শ্বাস-প্রশ্বাস বা বিরতি যোগ করতে অ্যাঙ্গেল ব্র্যাকেট (<cough>, <breath>, <sigh>, <short pause>) ব্যবহার করুন। অডিওর কোয়ালিটি সবচেয়ে ভালো করতে অ্যাঙ্গেল ব্র্যাকেট (<...>) ব্যবহার করুন এবং অ-মৌখিক সাউন্ড এফেক্টের পরিবর্তে মানুষের কণ্ঠস্বরের উপর জোর দিন।
সুযোগ কোথায় রাখবেন উদাহরণ
টার্ন-লেভেল (টার্ন জুড়ে বজায় থাকে) speech_metadata.style "angry tone", "speaking rapidly", "out of breath", "whispers", "sarcastic"
পয়েন্ট-ইন-টাইম (নির্দিষ্ট শব্দে ঘটে) text-এ (<...>) ইনলাইন "<cough> Thank you all for coming tonight! <throat-clearing> As I was saying..."

স্পিড ও পজ

আপনি তিনটি লেভেলে ছন্দ ও নীরবতা কন্ট্রোল করতে পারবেন:

  • যতিচিহ্ন ও উপবৃত্ত: স্বাভাবিক কথোপকথনের দ্বিধা বোঝাতে কমা, ড্যাশ (--) ও উপবৃত্ত (...) ব্যবহার করুন।
  • ইনলাইন পজ ট্যাগ: স্ক্রিপ্টের ঠিক যে জায়গায় স্পিকারের পজ নেওয়া উচিত সেখানে <short pause> বা <long pause> যোগ করুন: text Hold on, let me think... <short pause> Alright, I've got it.
  • টার্ন-লেভেল পেস: পুরো টার্ন জুড়ে বলার গতি কন্ট্রোল করতে speech_metadata-এ "style": "speaking rapidly" বা "style": "speaking slowly" সেট করুন।

প্রোসোডি ও পিচ

একটি টার্ন (যেমন, "style": "high pitch, cheerful and excited inflection" বা "style": "monotone and flat") জুড়ে প্রসোডি, পিচ ও ইনফ্লেকশন নিয়ন্ত্রণ করতে speech_metadata.style ব্যবহার করুন। সংলাপের মাঝে আবেগ বা প্রসোডি পরিবর্তিত হলে, স্ক্রিপ্টকে আলাদা আলাদা টার্নে ভাগ করুন এবং প্রতিটি টার্নের জন্য আলাদা style ভ্যালু ব্যবহার করুন।

গুরুত্ব আরোপ করা

ট্রানস্ক্রিপ্টে নির্দিষ্ট শব্দ বড় হাতের অক্ষরে লিখুন, যতিচিহ্ন এবং ইনলাইন ভোকাল ট্যাগের সাথে একত্রিত করে, মূল শব্দগুলিতে স্বাভাবিক ভোকাল স্ট্রেস দিতে:

This is a VERY important point!
It was a VERY long day <sigh> ... nobody listens anymore.

ভোকাল বার্স্ট ও নন-স্পিচ সাউন্ড

যেখানে শব্দ হওয়া উচিত ঠিক সেই জায়গায় অ্যাঙ্গেল ব্র্যাকেট (<...>) ব্যবহার করে ইনলাইনে মানুষের কণ্ঠস্বর থেকে নির্গত স্পিচ নয় এমন শব্দ লিখুন। সাজেস্ট করা ভোকাল ট্যাগের মধ্যে এগুলি অন্তর্ভুক্ত:

<argh> <breath> <heavy breath> <exhales>
<cackle> <cheer> <chuckle> / <chuckles> <cough>
<cry> <gasp> <giggle> <groan>
<growl> <grunt> <grr> <hiss>
<laugh> / <laughter> <moan> <pant> <pff> / <phew>
<scream> <shout> <shriek> <sigh> / <sighs>
<sneeze> <snicker> <snort> <sob>
<throat-clearing> <tsk> <whimper> <whispers> / <whispering>
<yawn> <short pause> <long pause>

ব্যাকচ্যানেল ও ওভারল্যাপ করা স্পিচ

একাধিক স্পিকারের কথোপকথনে, স্পিকারের টার্নের মধ্যে পাইপ ক্যারেক্টারে (|reaction|) শ্রোতার প্রতিক্রিয়া র‍্যাপ করুন যাতে স্বাভাবিক ব্যাকচ্যানেল বা ওভারল্যাপিং স্পিচ তৈরি করা যায় এবং প্রতিটি প্রতিক্রিয়ার জন্য আলাদা টার্ন তৈরি করতে না হয়।

  • সংক্ষিপ্ত ব্যাকচ্যানেল এক্সচেঞ্জ: অ্যাক্টিভ স্পিকারের টার্নের মধ্যে শ্রোতার সংক্ষিপ্ত প্রতিক্রিয়া (|oh hmm|, |oh really?|, |absolutely|) লেয়ার করুন:
    • প্রথম পালা (বক্তা ক): "So the launch is Thursday |oh hmm| Are we actually ready?"
    • টার্ন ২ (স্পিকার খ): "Ready enough |oh really?| The last blocker cleared this morning."
    • টার্ন ৩ (স্পিকার ক): "Then let's ship it |absolutely| and watch the dashboards."
  • ওভারল্যাপ করা এবং ইন্টারলিভ করা স্পিচ: একাধিক পাইপ সেগমেন্ট ব্যবহার করে দুজন স্পিকারের মধ্যে একই সাথে বা ইন্টারলিভ করা স্পিচ সিমুলেট করুন (gemini-3.8-flash-tts-এর সাথে সবচেয়ে ভাল কাজ করে):
    • একসাথে কাউন্টডাউন/কোরাস: "Let's surprise him on three |ok| ready?"-এর পরে "one. two. three. |happy| happy |birthday| birthday!"
    • স্পিকারের কথা সম্পূর্ণ ওভারল্যাপ করা: "Hello |oh| there |my| it |goodness| must |gracious| be |would| almost |you| time |look| for |at that| dinner"

বিভিন্ন জেনারেশন জুড়ে ধারাবাহিকতা এবং কী এড়িয়ে যেতে হবে

বিভিন্ন টার্ন জুড়ে ভয়েস আইডেন্টিটি স্থিতিশীল রাখতে এইসব নির্দেশিকা অনুসরণ করুন:

  • দীর্ঘ স্টাইল ব্লকের পরিবর্তে ভয়েস ডিজাইনে শুরুতেই ডিজাইন পারসোনা: আগের মডেল থেকে নেওয়া দীর্ঘ "Audio Profile" অনুচ্ছেদ এবং মাল্টি-বুলেট "Director's Notes" ভয়েস ড্রিফ্টের সবচেয়ে সাধারণ কারণ। ভয়েস ডিজাইন-এ সেই একই ক্রিয়েটিভ ইনটিউশন ব্যবহার করে একটি স্থায়ী কাস্টম voice_... পারসোনা তৈরি করুন, তারপর আপনার TTS কলের মাধ্যমে সেই ভয়েস আইডি ব্যবহার করুন।
  • স্থিরতার জন্য ভয়েস রেফারেন্সের উপর নির্ভর করুন (মেটা-নির্দেশ বাদ দিন): Gemini 3.8 TTS মডেলগুলি প্রথমে অডিও রেফারেন্সের উপর নির্ভর করার জন্য প্রশিক্ষিত। মডেলকে ভয়েস স্থির রাখার নির্দেশ (যেমন "do not switch speaker identity" বা "maintain identical timbre") দেবেন না—অতিরিক্ত প্রম্পট টেক্সট ড্রিফ্ট বাড়িয়ে দেয়। অপ্রয়োজনীয় স্টাইল সংক্রান্ত নির্দেশাবলী বাদ দিন এবং ভয়েস রেফারেন্সের মাধ্যমে প্রদান করা স্টেবল পয়েন্টের আশেপাশে মডেলকে স্বাভাবিকভাবে পরিবর্তন হতে দিন।
  • style-এ অপরিবর্তনীয় স্পিকারের বৈশিষ্ট্য পরিবর্তন করার চেষ্টা করবেন না: speech_metadata.style-এ বয়স, লিঙ্গ, নাম বা স্থায়ী অ্যাকসেন্ট পরিবর্তন করা এড়িয়ে চলুন। এর পরিবর্তে, এক্সটেন্ডেড ভয়েস লাইব্রেরি থেকে কোনও আঞ্চলিক ভয়েস বেছে নিন অথবা ভয়েস ডিজাইন ব্যবহার করে একটি তৈরি করুন।
  1. একবার চরিত্র তৈরি করুন: ভয়েস ডিজাইন-এ আপনার চরিত্র তৈরি করুন অথবা এক্সটেন্ডেড ভয়েস লাইব্রেরি থেকে এমন একটি আঞ্চলিক ভয়েস বেছে নিন যা আপনার টার্গেট ভাষা ও চরিত্রের সাথে মানানসই।
  2. স্বাভাবিক কথোপকথনের মতো করে ট্রান্সক্রিপ্ট লিখুন, যেখানে সাবলীলতার অভাব থাকবে: সর্বাধিক স্বাভাবিকতার জন্য, text-কে এমনভাবে লিখুন যাতে সেটি আসল কথোপকথনের ট্রান্সক্রিপ্টের মতো শোনায়—এর মধ্যে স্বাভাবিক কথোপকথনের সাবলীলতার অভাব ও দ্বিধা অন্তর্ভুক্ত থাকবে (যেমন, "Oh uh yeah I think... hm, so that's interesting")।
  3. প্রথমে প্লেন TTS পরীক্ষা করুন: প্রথমে খালি style ফিল্ড সহ আপনার ট্রান্সক্রিপ্ট সিন্থেসাইজ করুন—বেশিরভাগ অনুরোধের জন্য কোনও style নির্দেশের প্রয়োজন হয় না।
  4. শুধুমাত্র টুইকের জন্য ছোট style প্রম্পট যোগ করুন: শুধুমাত্র সেইসব টার্নের জন্য সংক্ষিপ্ত style স্ট্রিং (যেমন "casual, friendly" বা "muttering, then reassuring") যোগ করুন যেগুলির জন্য নির্দিষ্ট ডেলিভারি অ্যাডজাস্টমেন্ট প্রয়োজন এবং আপনি যখন একটি সামঞ্জস্যপূর্ণ বেসলাইন চান তখন টার্ন জুড়ে সেই সঠিক ছোট স্ট্রিংটি আবার ব্যবহার করুন।

মাল্টি-টার্ন ডায়ালগ ও ভয়েস এজেন্ট

রিয়েল-টাইম কথোপকথনমূলক ভয়েস এজেন্ট বা মাল্টি-টার্ন অ্যাপ্লিকেশন তৈরি করার সময়:

  • LLM টেক্সট চাঙ্ক আসার সাথে সাথে প্রতি টার্নে একটি TTS কল করুন।
  • কনফিগার করা voice (প্রি-বিল্ট, ডিজাইন করা voice_..., বা রেপ্লিকেট করা voice_... / voicekey_...) যাতে প্রতিটি টার্নে স্পিকারের পরিচয় বহন করে—প্রতিটি টার্নে কখনও দীর্ঘ ক্যারেক্টার পারসোনা আবার পাঠাবেন না।
  • প্রতি-টার্ন style ফিল্ড খালি রাখুন, অথবা পুরো কথোপকথনের জন্য একটি ছোট কনস্ট্যান্ট স্ট্রিং (যেমন "casual, friendly") পাঠান।
  • এজেন্টের দীর্ঘ উত্তরকে ছোট ছোট ভাগে ভাগ করুন, যাতে আরও শক্তিশালী স্টাইল প্রম্পট ব্যবহার করতে না হয়।

সীমাবদ্ধতা

  • TTS মডেল শুধুমাত্র টেক্সট ইনপুট গ্রহণ করে এবং শুধুমাত্র অডিও আউটপুট তৈরি করে।
  • সিঙ্গেল-রিকোয়েস্ট মাল্টি-স্পিকার জেনারেশন (speech_config.speakers) প্রি-বিল্ট ভয়েস ব্যবহার করে সর্বাধিক ২টি স্পিকার সাপোর্ট করে। একাধিক চরিত্রের ডায়ালগে কাস্টম ডিজাইন করা (voice_...) বা রেপ্লিকেট করা (voice_... / voicekey_...) ভয়েস একত্রিত করতে, প্রত্যেক স্পিকারের পালা আলাদা আলাদা করে সিন্থেসাইজ করুন। কারণ, ইউনারি অনুরোধ ডিফল্ট হিসেবে ৪৪-বাইট RIFF হেডার সহ audio/wav রিটার্ন করে। কাঁচা PCM ({"type": "audio", "mime_type": "audio/l16"}) অনুরোধ করুন অথবা ২৪kHz PCM অডিও ফ্রেম কনক্যাটেনেট করার আগে প্রতিটি টার্ন থেকে WAV হেডার সরিয়ে দিন।
  • কাস্টম ভয়েস স্টোরেজের সীমা ও TTL:
    • স্টেটফুল ভয়েস (store=True, প্রম্পট করা বা রেপ্লিকেট করা):প্রোজেক্ট পিছু সর্বাধিক ২০০টি ভয়েস যার TTL (টাইম-টু-লাইভ) ১ বছর।
    • স্টেটলেস ভয়েস কী (store=False, voicekey_...): ৭-দিনের TTL (টাইম-টু-লাইভ)।
  • কোন কোন ভাষায় এই সুবিধা উপলভ্য তা জানতে যেসব ভাষায় উপলভ্য বিভাগটি পর্যালোচনা করুন।

এর পরে কী করতে হবে

  • ভয়েস ডিজাইন ব্যবহার করে ন্যাচারাল ল্যাঙ্গুয়েজ থেকে কাস্টম ভোকাল পার্সোনা তৈরি করুন।
  • ভয়েস রেপ্লিকেশন ফিচারের মাধ্যমে আগে থেকে থাকা স্পিকারের ভয়েস রেপ্লিকেট করুন।
  • Gemini 3.8 Flash TTS এবং Gemini 3.8 Flash-Lite TTS মডেল পৃষ্ঠায় মডেল স্পেসিফিকেশন তুলনা করুন।
  • Live API-এর মাধ্যমে ইন্ট্যার‍্যাক্টিভ দ্বিমুখী অডিও এক্সপ্লোর করুন।