জেমিনি এপিআই, জেমিনির টেক্সট-টু-স্পিচ (টিটিএস) জেনারেশন ক্ষমতা ব্যবহার করে টেক্সট ইনপুটকে একক-বক্তা বা একাধিক-বক্তার অডিওতে রূপান্তর করতে পারে। টেক্সট-টু-স্পিচ জেনারেশন নিয়ন্ত্রণযোগ্য , যার অর্থ হলো আপনি অডিওর স্টাইল , উচ্চারণ , গতি এবং সুর নিয়ন্ত্রণ করার জন্য স্ট্রাকচার্ড টার্ন মেটাডেটা ( speech_metadata ) এবং ইনলাইন ভোকাল ট্যাগ একত্রিত করতে পারেন।
টিটিএস (TTS) সক্ষমতাটি লাইভ এপিআই (Live API) -এর মাধ্যমে প্রদত্ত স্পিচ জেনারেশন থেকে ভিন্ন, যা ইন্টারেক্টিভ, কাঠামোবিহীন অডিও এবং মাল্টিমোডাল ইনপুট ও আউটপুটের জন্য ডিজাইন করা হয়েছে। যেখানে লাইভ এপিআই গতিশীল কথোপকথনের প্রেক্ষাপটে বিশেষভাবে পারদর্শী, সেখানে জেমিনি এপিআই (Gemini API)-এর মাধ্যমে টিটিএস এমন সব পরিস্থিতির জন্য বিশেষভাবে তৈরি করা হয়েছে যেখানে স্টাইল ও সাউন্ডের উপর সূক্ষ্ম নিয়ন্ত্রণের সাথে হুবহু টেক্সট আবৃত্তির প্রয়োজন হয়, যেমন পডকাস্ট বা অডিওবুক তৈরি।
এই নির্দেশিকাটি আপনাকে দেখাবে কিভাবে 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 TTS মডেল ব্যবহার করে টেক্সটকে একক-বক্তার অডিওতে রূপান্তর করতে, input হুবহু ট্রান্সক্রিপ্টটি দিন, speech_metadata অ্যানোটেশন ব্যবহার করে টার্ন-লেভেল স্টাইলিং সংযুক্ত করুন এবং generation_config.speech_config ফাইলে আপনার ভয়েস কনফিগার করুন। আপনি আগে থেকে তৈরি ভয়েস অপশন , এক্সটেন্ডেড ভয়েস লাইব্রেরি ( GET /v1beta/voices ), একটি কাস্টম ভয়েস ডিজাইন আইডি ( voice_... ), অথবা একটি ভয়েস রেপ্লিকেশন আইডি ( voice_... , বা ঐচ্ছিক স্টেটলেস voicekey_... ) থেকে একটি ভয়েস বেছে নিতে পারেন।
এই উদাহরণটি মডেল থেকে ডিফল্ট WAV আউটপুট অডিও ( audio/wav ) সরাসরি একটি ফাইলে সংরক্ষণ করে:
পাইথন
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();
যান
package main
import (
"context"
"encoding/base64"
"encoding/binary"
"log"
"os"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func saveWaveFile(filename string, pcmData []byte) error {
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
sampleRate := uint32(24000)
numChannels := uint16(1)
bitsPerSample := uint16(16)
byteRate := sampleRate * uint32(numChannels) * uint32(bitsPerSample/8)
blockAlign := numChannels * (bitsPerSample / 8)
dataSize := uint32(len(pcmData))
f.WriteString("RIFF")
binary.Write(f, binary.LittleEndian, uint32(36+dataSize))
f.WriteString("WAVEfmt ")
binary.Write(f, binary.LittleEndian, uint32(16))
binary.Write(f, binary.LittleEndian, uint16(1))
binary.Write(f, binary.LittleEndian, numChannels)
binary.Write(f, binary.LittleEndian, sampleRate)
binary.Write(f, binary.LittleEndian, byteRate)
binary.Write(f, binary.LittleEndian, blockAlign)
binary.Write(f, binary.LittleEndian, bitsPerSample)
f.WriteString("data")
binary.Write(f, binary.LittleEndian, dataSize)
_, err = f.Write(pcmData)
return err
}
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Voice: genai.Ptr("Kore")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput("Say cheerfully: Have a wonderful day!"),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
if res.Interaction.OutputAudio != nil && res.Interaction.OutputAudio.Data != nil {
pcmBytes, err := base64.StdEncoding.DecodeString(*res.Interaction.OutputAudio.Data)
if err != nil {
log.Fatal(err)
}
if err := saveWaveFile("out.wav", pcmBytes); err != nil {
log.Fatal(err)
}
}
}
বিশ্রাম
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
পাইথন এবং জাভাস্ক্রিপ্ট SDK-তে, আপনি interaction.output_audio কনভেনিয়েন্স প্রপার্টি ব্যবহার করে জেনারেট করা অডিও ডেটা পুনরুদ্ধার করতে পারেন, যা সর্বশেষ জেনারেট করা অডিও ব্লকটি রিটার্ন করে (র REST JSON রেসপন্সে, base64-এনকোডেড অডিও steps[].content[].data তে স্টোর করা থাকে)। কনভেনিয়েন্স প্রপার্টি সম্পর্কে বিস্তারিত জানতে, ইন্টারঅ্যাকশন ওভারভিউ দেখুন।
মাল্টি-স্পিকার টিটিএস
একাধিক বক্তার কথোপকথনের জন্য, speech_config.speakers ফাইলে দুজন বক্তাকে কনফিগার করুন এবং প্রতিটি পালাকে একটি পৃথক টেক্সট আইটেম হিসাবে পাঠান, যার সাথে speech_metadata অ্যানোটেশন ব্যবহার করে speaker এবং ঐচ্ছিক পালা-স্তরের style নির্দিষ্ট করতে হবে। স্বাভাবিক পালাবদলের ছন্দের জন্য "mode": "conversational" ব্যবহার করুন।
পাইথন
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": {
"mode": "conversational",
"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: {
mode: 'conversational',
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();
যান
package main
import (
"context"
"encoding/base64"
"encoding/binary"
"log"
"os"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func saveWaveFile(filename string, pcmData []byte) error {
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
sampleRate := uint32(24000)
numChannels := uint16(1)
bitsPerSample := uint16(16)
byteRate := sampleRate * uint32(numChannels) * uint32(bitsPerSample/8)
blockAlign := numChannels * (bitsPerSample / 8)
dataSize := uint32(len(pcmData))
f.WriteString("RIFF")
binary.Write(f, binary.LittleEndian, uint32(36+dataSize))
f.WriteString("WAVEfmt ")
binary.Write(f, binary.LittleEndian, uint32(16))
binary.Write(f, binary.LittleEndian, uint16(1))
binary.Write(f, binary.LittleEndian, numChannels)
binary.Write(f, binary.LittleEndian, sampleRate)
binary.Write(f, binary.LittleEndian, byteRate)
binary.Write(f, binary.LittleEndian, blockAlign)
binary.Write(f, binary.LittleEndian, bitsPerSample)
f.WriteString("data")
binary.Write(f, binary.LittleEndian, dataSize)
_, err = f.Write(pcmData)
return err
}
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
prompt := "TTS the following conversation between Joe and Jane:\n" +
"Joe: How's it going today Jane?\n" +
"Jane: Not too bad, how about you?"
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Speaker: genai.Ptr("Joe"), Voice: genai.Ptr("Kore")},
{Speaker: genai.Ptr("Jane"), Voice: genai.Ptr("Puck")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput(prompt),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
if res.Interaction.OutputAudio != nil && res.Interaction.OutputAudio.Data != nil {
pcmBytes, err := base64.StdEncoding.DecodeString(*res.Interaction.OutputAudio.Data)
if err != nil {
log.Fatal(err)
}
if err := saveWaveFile("out.wav", pcmBytes); err != nil {
log.Fatal(err)
}
}
}
বিশ্রাম
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" }
]
}
}
}'
মেটাডেটা এবং ট্যাগ ব্যবহার করে বক্তৃতার ধরণ নিয়ন্ত্রণ করুন
জেমিনি ৩.৮ টিটিএস 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...")।
বিস্তারিত সর্বোত্তম অনুশীলন জানতে প্রম্পটিং নির্দেশিকা দেখুন।
যান
package main
import (
"context"
"log"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
transcriptRes, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.8-flash"),
Input: interactions.NewInteractionsInput(
"Generate a short transcript around 100 words that reads " +
"like it was clipped from a podcast by excited herpetologists. " +
"The hosts names are Dr. Anya and Liam.",
),
}),
})
if err != nil {
log.Fatal(err)
}
var transcript string
if transcriptRes.Interaction.OutputText != nil {
transcript = *transcriptRes.Interaction.OutputText
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Speaker: genai.Ptr("Dr. Anya"), Voice: genai.Ptr("Kore")},
{Speaker: genai.Ptr("Liam"), Voice: genai.Ptr("Puck")},
})),
}
ttsRes, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput(transcript),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
_ = ttsRes
}
স্ট্রিমিং স্পিচ জেনারেশন
আপনি stream: true সেট করে সিন্থেসাইজ হওয়ার সময়েই তৈরি হওয়া অডিও স্ট্রিম করতে পারেন। ইউনিটারি রিকোয়েস্টের (যা একটি RIFF হেডার সহ একটি সম্পূর্ণ WAV ফাইল রিটার্ন করে) বিপরীতে, স্ট্রিমিং রিকোয়েস্ট ডিফল্টরূপে হেডারবিহীন র 16-বিট সাইনড লিটল-এন্ডিয়ান লিনিয়ার PCM ( audio/l16 , 24 kHz, mono) চাঙ্ক রিটার্ন করে, ফলে কন্টেইনার হেডার ছাড়াই অডিও চাঙ্কগুলো অবিচ্ছিন্নভাবে প্লে বা কনক্যাটিনেট করা যায়।
পাইথন
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
}'
অডিও আউটপুট ফরম্যাট
অনুরোধটি ইউনারি নাকি স্ট্রিমিং, তার উপর নির্ভর করে জেমিনি ৩.৮ টিটিএস মডেলগুলো ভিন্ন ভিন্ন ডিফল্ট অডিও ফরম্যাট ব্যবহার করে:
- একক অনুরোধ (
stream=False): একটি স্ট্যান্ডার্ড RIFF হেডার সহ সম্পূর্ণ WAV (audio/wav) অডিও ফেরত দেয় (২৪ কিলোহার্টজ, মোনো, ১৬-বিট সাইনড লিটল-এন্ডিয়ান পিসিএম)। আপনি ম্যানুয়ালি শুরুতে WAV হেডার যোগ না করেই ডিকোড করা অডিও বাইটগুলো সরাসরি একটি.wavফাইলে সংরক্ষণ করতে পারেন। - স্ট্রিমিং অনুরোধ (
stream=True): ডিফল্টরূপে হেডারবিহীন কাঁচা লিনিয়ার পিসিএম (audio/l16) চাঙ্ক (২৪ কিলোহার্টজ, মোনো, ১৬-বিট সাইনড লিটল-এন্ডিয়ান পিসিএম) ফেরত দেয়, যাতে প্রতিটি চাঙ্কে কন্টেইনার হেডার ছাড়াই চাঙ্কগুলো অবিচ্ছিন্নভাবে স্ট্রিম বা সংযুক্ত করা যায়।
ভিন্ন অডিও এনকোডিং বা স্যাম্পল রেট অনুরোধ করতে, response_format ভিতরে mime_type এবং ঐচ্ছিক sample_rate কনফিগার করুন:
| ফর্ম্যাট | mime_type মান | বর্ণনা |
|---|---|---|
| WAV (একক ডিফল্ট) | "audio/wav" | RIFF হেডার সহ অসংকুচিত WAV ফাইল (১৬-বিট সাইনড লিটল-এন্ডিয়ান PCM, মোনো, ডিফল্ট ২৪ kHz)। ইউনিটারি অনুরোধের জন্য এটিই ডিফল্ট। |
| কাঁচা পিসিএম (এল১৬) (স্ট্রিমিং ডিফল্ট) | "audio/l16" | অসংকুচিত, হেডারবিহীন ১৬-বিট সাইনড লিটল-এন্ডিয়ান লিনিয়ার পিসিএম অডিও (২৪ কিলোহার্টজ, মোনো)। স্ট্রিমিং অনুরোধের জন্য এটিই ডিফল্ট। |
| মু-ল | "audio/mulaw" | ৮-বিট জি.৭১১ মিউ-ল এনকোডেড অডিও (যা সাধারণত উত্তর আমেরিকান এবং জাপানি টেলিফোনি/আইভিআর সিস্টেমে ব্যবহৃত হয়)। |
| একটি আইন | "audio/alaw" | ৮-বিট জি.৭১১ এ-ল এনকোডেড অডিও (যা সাধারণত ইউরোপীয় ও আন্তর্জাতিক টেলিফোনি সিস্টেমে ব্যবহৃত হয়)। |
আপনি sample_rate হার্টজ-এও নির্দিষ্ট করতে পারেন (যেমন, 24000 , 16000 বা 8000 )।
পাইথন
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();
যান
package main
import (
"context"
"encoding/base64"
"log"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Voice: genai.Ptr("Kore")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput("Say cheerfully: Have a wonderful day!"),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
Stream: genai.Ptr(true),
}),
})
if err != nil {
log.Fatal(err)
}
stream := res.InteractionSSEStreamEvent
defer stream.Close()
for stream.Next() {
event := stream.Value()
if stepDelta := event.GetDataStepDelta(); stepDelta != nil {
if audioDelta := stepDelta.GetDeltaAudio(); audioDelta != nil && audioDelta.Data != nil {
audioData, err := base64.StdEncoding.DecodeString(*audioDelta.Data)
if err != nil {
log.Fatal(err)
}
// Process the audio chunk (e.g. play it or write to a file)
_ = audioData
}
}
}
if err := stream.Err(); err != nil {
log.Fatal(err)
}
}
বিশ্রাম
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" }
]
}
}'
ভয়েস বিকল্পগুলি
জেমিনি ৩.৮ টিটিএস চারটি উপায়ে ভয়েস নির্বাচন বা তৈরি করার সুবিধা দেয়:
- পূর্ব-নির্মিত স্টুডিও ভয়েস: নিম্নলিখিত সারণীতে তালিকাভুক্ত ৩০টি নির্বাচিত ভয়েস।
- বর্ধিত ভয়েস লাইব্রেরি: বিভিন্ন ভাষা, উচ্চারণভঙ্গি এবং চরিত্রের ধরনের শত শত অতিরিক্ত কণ্ঠস্বর, যা
client.voices.list()(GET /v1beta/voices) ব্যবহার করে অ্যাক্সেস করা যায়। - ভয়েস ডিজাইন : গুগল এআই স্টুডিওতে স্বাভাবিক ভাষার বর্ণনা থেকে অথবা
POST /v1beta/voices(type="prompted"ব্যবহার করে একটি কাস্টম ভোকাল পার্সোনা তৈরি করুন, যা একটি স্থায়ীvoice_...ID এবংCreateVoiceওGetVoiceএ একটিsample_audioWAV প্রিভিউ রিটার্ন করে। - ভয়েস রেপ্লিকেশন : গুগল এআই স্টুডিওতে রেফারেন্স এবং কনসেন্ট অডিও থেকে অথবা
POST /v1beta/voicesব্যবহার করে একজন স্পিকারের ভয়েস রেপ্লিকেট করুন (type="replicated", ডিফল্টরূপে persistentstore=Trueঅথবা ঐচ্ছিক statelessstore=False)।
কাস্টম ভয়েস সীমা এবং TTL
| কণ্ঠস্বরের ধরণ | স্টোরেজ মোড | কোটা / সীমা | ধরে রাখা (TTL) |
|---|---|---|---|
স্টেটফুল ভয়েস ( voice_... , প্রম্পটেড বা রেপ্লিকেটেড) | store=True | প্রতিটি প্রকল্পে ২০০টি কণ্ঠস্বর (প্রেরিত এবং অনুলিখিত কণ্ঠস্বরের মধ্যে ভাগ করা) | ১ বছর |
স্টেটলেস ভয়েস কী ( voicekey_... , প্রতিলিপিকৃত) | store=False | ক্লায়েন্ট-পরিচালিত | ৭ দিন |
পূর্ব-নির্মিত কণ্ঠস্বর
| জেফির -- ব্রাইট | পাক -- উচ্ছ্বসিত | চারন -- তথ্যমূলক |
| কোর -- ফার্ম | ফেনরির -- উত্তেজিত | লেডা -- যুবতী |
| ওরুস -- ফার্ম | Aoede -- Breezy | ক্যালিরো -- সহজ-সরল |
| Autonoe -- Bright | এনসেলাডাস -- শ্বাসপ্রশ্বাসযুক্ত | আইপেটাস -- পরিষ্কার |
| উমব্রিয়েল -- সহজ-সরল | আলজিবা -- মসৃণ | ডেসপিনা -- মসৃণ |
| এরিনোম -- পরিষ্কার | অ্যালজেনিব -- গ্র্যাভেলি | রসলগেথি -- তথ্যমূলক |
| লাওমেডিয়া -- উচ্ছ্বসিত | আখেরনার -- নরম | আলনিলাম -- ফার্ম |
| শেডার -- এমনকি | গ্যাক্রাক্স -- পরিপক্ক | পুলচেরিমা -- ফরোয়ার্ড |
| আচির্ড -- বন্ধুত্বপূর্ণ | Zubenelgenubi -- Casual | ভিন্ডেমিয়াট্রিক্স -- কোমল |
| সাদাচবিয়া -- প্রাণবন্ত | সাদালটেগার -- জ্ঞানী | সুলাফাত -- উষ্ণ |
বর্ধিত ভয়েস লাইব্রেরি এবং ফিল্টারিং
পূর্ববর্তী সারণীতে উল্লেখিত ৩০টি স্টুডিও ভয়েস ছাড়াও, এক্সটেন্ডেড ভয়েস লাইব্রেরিতে বিভিন্ন ভাষা, আঞ্চলিক উচ্চারণ, চরিত্রের ধরণ এবং ডোমেন জুড়ে শত শত অতিরিক্ত ভয়েস রয়েছে। আপনি গুগল এআই স্টুডিও -তে সম্পূর্ণ ভয়েস লাইব্রেরিটি ইন্টারেক্টিভভাবে ব্রাউজ, ফিল্টার এবং অডিশন করতে পারেন, অথবা 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 (পাইথনে type_ ) | list[str] | ভয়েস সোর্স অনুযায়ী ফিল্টার করুন: "prebuilt" , "prompted" ( ভয়েস ডিজাইন ), অথবা "replicated" ( ভয়েস রেপ্লিকেশন )। |
search | str | ফ্রি-টেক্সট সাবস্ট্রিং সার্চ display_name এবং description উভয়ের ক্ষেত্রেই কেস-ইনসেনসিটিভভাবে ম্যাচ করেছে। |
page_size | int | প্রতি পৃষ্ঠায় ফেরত আসা কণ্ঠস্বরের সর্বোচ্চ সংখ্যা (ডিফল্ট 50 , সর্বোচ্চ 1000 )। |
page_token | str | ফলাফলের পরবর্তী পৃষ্ঠা আনার জন্য response.next_page_token থেকে টোকেন। |
পাইথন
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"
সমর্থিত ভাষা
টিটিএস মডেলগুলো ইনপুট ভাষা স্বয়ংক্রিয়ভাবে শনাক্ত করে। জেমিনি ৩.৮ ফ্ল্যাশ টিটিএস ( gemini-3.8-flash-tts ) ১৩০টিরও বেশি ভাষা সমর্থন করে এবং জেমিনি ৩.৮ ফ্ল্যাশ-লাইট টিটিএস ( gemini-3.8-flash-lite-tts ) ১০০টিরও বেশি ভাষা সমর্থন করে।
| ভাষা | জেমিনি ৩.৮ ফ্ল্যাশ টিটিএস | জেমিনি ৩.৮ ফ্ল্যাশ-লাইট টিটিএস |
|---|---|---|
| আচেহনিজ (আরবি লিপি) | ✔️ | ✔️ |
| আফ্রিকান | ✔️ | ✔️ |
| আকান | ✔️ | ✔️ |
| আমহারিক | ✔️ | ✔️ |
| আর্মেনীয় | ✔️ | ✔️ |
| অসমীয়া | ✔️ | ✔️ |
| অবধী | ✔️ | ✔️ |
| বালিনিজ | ✔️ | ✔️ |
| বাংলা | ✔️ | ✔️ |
| বানজার (আরবি লিপি) | ✔️ | — |
| বানজার (ল্যাটিন লিপি) | ✔️ | ✔️ |
| বাশকির | ✔️ | — |
| বাস্ক | ✔️ | ✔️ |
| বেলারুশীয় | ✔️ | ✔️ |
| বেম্বা | ✔️ | — |
| ভোজপুরি | ✔️ | ✔️ |
| বসনীয় | ✔️ | ✔️ |
| বুগিনিজ | ✔️ | ✔️ |
| বুলগেরীয় | ✔️ | ✔️ |
| বর্মী | ✔️ | — |
| ক্যান্টনিজ | ✔️ | ✔️ |
| কাতালান | ✔️ | ✔️ |
| সেবুয়ানো | ✔️ | ✔️ |
| কেন্দ্রীয় কুর্দিশ | ✔️ | ✔️ |
| ছত্তিশগড়ী | ✔️ | ✔️ |
| চীনা (হ্যান্স লিপি) | ✔️ | ✔️ |
| চীনা (হান্ট লিপি) | ✔️ | ✔️ |
| ক্রিমিয়ান তাতার | ✔️ | — |
| ক্রোয়েশীয় | ✔️ | ✔️ |
| চেক | ✔️ | ✔️ |
| ড্যানিশ | ✔️ | ✔️ |
| ডাচ | ✔️ | ✔️ |
| ডাইলা | ✔️ | — |
| জংখা | ✔️ | — |
| মিশরীয় আরবি | ✔️ | ✔️ |
| ইংরেজি | ✔️ | ✔️ |
| এস্তোনিয়ান | ✔️ | ✔️ |
| ফিলিপিনো | ✔️ | ✔️ |
| ফিনিশ | ✔️ | — |
| ফরাসি | ✔️ | ✔️ |
| গ্যালিসিয়ান | ✔️ | ✔️ |
| গান্ডা | ✔️ | ✔️ |
| জর্জিয়ান | ✔️ | ✔️ |
| জার্মান | ✔️ | ✔️ |
| গ্রীক | ✔️ | ✔️ |
| গুয়ারানি | ✔️ | — |
| গুজরাটি | ✔️ | ✔️ |
| হাইতিয়ান ক্রেওল | ✔️ | ✔️ |
| হালহ মঙ্গোলিয়ান | ✔️ | ✔️ |
| হাউসা | ✔️ | ✔️ |
| হিব্রু | ✔️ | ✔️ |
| হিন্দি | ✔️ | ✔️ |
| হাঙ্গেরীয় | ✔️ | ✔️ |
| আইসল্যান্ডীয় | ✔️ | ✔️ |
| ইগবো | ✔️ | — |
| ইলোকো | ✔️ | ✔️ |
| ইন্দোনেশিয়ান | ✔️ | ✔️ |
| ইরানি ফার্সি | ✔️ | ✔️ |
| ইতালীয় | ✔️ | ✔️ |
| জাপানি | ✔️ | ✔️ |
| জাভানিজ | ✔️ | ✔️ |
| কাবাইল | ✔️ | — |
| কাম্বা | ✔️ | ✔️ |
| কন্নড় | ✔️ | ✔️ |
| কাশ্মীরি (আরবি লিপি) | ✔️ | ✔️ |
| কাশ্মীরি (দেব লিপি) | ✔️ | ✔️ |
| কাজাখ | ✔️ | ✔️ |
| খেমার | ✔️ | ✔️ |
| কিকুয়ু | ✔️ | ✔️ |
| কিনিয়ারওয়ান্ডা | ✔️ | ✔️ |
| কঙ্গো | ✔️ | ✔️ |
| কোরিয়ান | ✔️ | ✔️ |
| কিরগিজ | ✔️ | ✔️ |
| লাও | ✔️ | ✔️ |
| লাটগালিয়ান | ✔️ | — |
| লিঙ্গালা | ✔️ | ✔️ |
| লিথুয়ানিয়ান | ✔️ | — |
| লুক্সেমবার্গীয় | ✔️ | — |
| ম্যাসিডোনিয়ান | ✔️ | ✔️ |
| মাগাহি | ✔️ | ✔️ |
| মৈথিলী | ✔️ | ✔️ |
| মালয়ালম | ✔️ | ✔️ |
| মাল্টিজ | ✔️ | ✔️ |
| মণিপুরি | ✔️ | ✔️ |
| মারাঠি | ✔️ | ✔️ |
| মিনাংকাবাউ (আরবি লিপি) | ✔️ | ✔️ |
| মিনাংকাবাউ (ল্যাটিন লিপি) | ✔️ | — |
| মিজো | ✔️ | ✔️ |
| নেপালি (ব্যক্তিগত ভাষা) | ✔️ | ✔️ |
| নাইজেরিয়ান ফুলফুলডে | ✔️ | ✔️ |
| উত্তর আজারবাইজানীয় | ✔️ | ✔️ |
| উত্তর সোথো | ✔️ | ✔️ |
| উত্তর উজবেক | ✔️ | ✔️ |
| নরওয়েজিয়ান বোকমাল | ✔️ | ✔️ |
| নরওয়েজিয়ান নিনরস্ক | ✔️ | ✔️ |
| নিয়ানজা | ✔️ | ✔️ |
| অক্সিটান | ✔️ | — |
| ওড়িয়া (ব্যক্তিগত ভাষা) | ✔️ | ✔️ |
| পাঙ্গাসিনান | ✔️ | — |
| ফার্সি (আফগানিস্তান) | ✔️ | ✔️ |
| পোলিশ | ✔️ | ✔️ |
| পর্তুগিজ | ✔️ | ✔️ |
| পাঞ্জাবি | ✔️ | ✔️ |
| রোমানিয়ান | ✔️ | ✔️ |
| রাশিয়ান | ✔️ | ✔️ |
| সাঁওতালি | ✔️ | ✔️ |
| সার্বিয়ান | ✔️ | ✔️ |
| সিন্ধি | ✔️ | — |
| সিংহলী | ✔️ | ✔️ |
| স্লোভাক | ✔️ | ✔️ |
| স্লোভেনীয় | ✔️ | — |
| সোমালি | ✔️ | — |
| দক্ষিণ আজারবাইজানীয় | ✔️ | ✔️ |
| দক্ষিণ পশতু | ✔️ | ✔️ |
| দক্ষিণ সোথো | ✔️ | — |
| স্প্যানিশ | ✔️ | ✔️ |
| প্রমিত আরবি (আরবি লিপি) | ✔️ | ✔️ |
| প্রমিত আরবি (ল্যাটিন লিপি) | ✔️ | ✔️ |
| প্রমিত লাতভিয়ান | ✔️ | ✔️ |
| প্রমিত মালয় | ✔️ | ✔️ |
| সোয়াহিলি (ব্যক্তিগত ভাষা) | ✔️ | — |
| স্বাতী | ✔️ | — |
| সুইডিশ | ✔️ | — |
| তাজিক | ✔️ | — |
| তামিল | ✔️ | ✔️ |
| তেলুগু | ✔️ | ✔️ |
| থাই | ✔️ | — |
| তিগ্রিনিয়া | ✔️ | — |
| তোস্ক আলবেনিয়ান | ✔️ | — |
| তুর্কি | ✔️ | ✔️ |
| উইঘুর | ✔️ | — |
| ভিয়েতনামী | ✔️ | ✔️ |
সমর্থিত মডেল
| মডেল | একক বক্তা | মাল্টি-স্পিকার | ভয়েস ডিজাইন | কণ্ঠস্বর প্রতিলিপি |
|---|---|---|---|---|
জেমিনি ৩.৮ ফ্ল্যাশ টিটিএস ( gemini-3.8-flash-tts ) | ✔️ | ✔️ | ✔️ | ✔️ |
জেমিনি ৩.৮ ফ্ল্যাশ-লাইট টিটিএস ( gemini-3.8-flash-lite-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-এ স্থানান্তরিত হন:
- টার্ন-লেভেল নির্দেশনাগুলো
speech_metadata-তে স্থানান্তর করুন: জেমিনি ৩.৮ টিটিএস ইনপুট টেক্সটকে কঠোরভাবে একটি হুবহু ট্রান্সক্রিপ্ট হিসেবে বিবেচনা করে। দীর্ঘায়িত ডেলিভারি নির্দেশাবলী (style—যেমন"whispering","out of breath", বা"speaking slowly") এবং স্পিকার লেবেল (speaker) ট্রান্সক্রিপ্ট টেক্সটে স্টেজ নির্দেশনা এম্বেড করার পরিবর্তে স্ট্রাকচার্ডspeech_metadataঅ্যানোটেশনে স্থানান্তর করুন। - শুধুমাত্র নির্দিষ্ট সময়ের বাচনিক ঘটনার জন্য অ্যাঙ্গেল-ব্র্যাকেট ইনলাইন ট্যাগ ব্যবহার করুন: ক্ষণস্থায়ী অ-কথ্য শব্দ এবং বিরতিগুলোকে ট্রান্সক্রিপ্টের মধ্যে অ্যাঙ্গেল ব্র্যাকেট ব্যবহার করে ইনলাইনে রাখুন (যেমন
<laugh>,<sigh>,<cough>,<breath>, বা<short pause>)। সাউন্ড-ইফেক্ট ট্যাগ (যেমন হাততালি বা ধপাস শব্দ) পরিহার করুন এবং ডেলিভারি স্টাইলspeech_metadata.styleএ রাখুন। - একাধিক বক্তার অনুরোধে প্রতিটি ধাপে
speakerনির্দিষ্ট করুন: একাধিক বক্তার অনুরোধের প্রতিটি ধাপে, কনফিগার করা বক্তাদের মধ্যে একজনের সাথে মিল রেখেspeech_metadataভিতরেspeakerস্পষ্টভাবে অন্তর্ভুক্ত করতে হবে। - ভয়েস ডিজাইন ব্যবহার করে শুরুতেই পারসোনা ডিজাইন করুন: একাধিক অনুচ্ছেদযুক্ত
"Audio Profile"বা"Director's Notes"ব্লকগুলিকে ভয়েস ডিজাইনে তৈরি একটি কাস্টম ভয়েস দিয়ে প্রতিস্থাপন করুন, তারপর ন্যূনতম বা খালিstyleস্ট্রিং ব্যবহার করে আপনার টিটিএস অনুরোধগুলিতে সেইvoice_...আইডিটি প্রয়োগ করুন। - ইউনারি রিকোয়েস্টের ক্ষেত্রে ডিফল্ট WAV (
audio/wav) আউটপুটের বিষয়টি বিবেচনা করুন:gemini-3.1-flash-tts-previewএবং পূর্ববর্তী TTS মডেলগুলির (যেগুলি ডিফল্টরূপে হেডারবিহীন র PCMaudio/l16রিটার্ন করত) থেকে ভিন্ন, Gemini 3.8 TTS ইউনারি রিকোয়েস্টের জন্য ডিফল্টরূপে একটি স্ট্যান্ডার্ড RIFF হেডার সহ WAV অডিও (audio/wav) রিটার্ন করে।- যদি আপনার কোড আগে সরাসরি PCM বাইটগুলোকে একটি WAV হেডারে মুড়ে দিয়ে থাকে (উদাহরণস্বরূপ, পাইথনের
waveমডিউল বাffmpegব্যবহার করে), তাহলে সেই ম্যানুয়াল হেডার র্যাপারটি সরিয়ে ফেলুন এবং ফেরত আসা বাইটগুলো সরাসরি একটি.wavফাইলে লিখুন। - আপনার পাইপলাইনে যদি হেডারবিহীন র PCM, mu-law, বা A-law অডিওর প্রয়োজন হয়, তাহলে স্পষ্টভাবে
response_format"audio/l16","audio/mulaw", বা"audio/alaw"এ সেট করুন। অডিও আউটপুট ফরম্যাটগুলো দেখুন।
- যদি আপনার কোড আগে সরাসরি PCM বাইটগুলোকে একটি WAV হেডারে মুড়ে দিয়ে থাকে (উদাহরণস্বরূপ, পাইথনের
প্রম্পটিং গাইড
জেমিনি ৩.৮ টিটিএস মডেলগুলো ইনপুট টেক্সটকে কঠোরভাবে একটি হুবহু প্রতিলিপি হিসেবে বিবেচনা করে। পূর্ববর্তী প্রিভিউ মডেলগুলোর মতো নয়, যেখানে মঞ্চ নির্দেশনাগুলো সাধারণ টেক্সটের মধ্যে এমবেড করা থাকতো, জেমিনি ৩.৮ টিটিএস ধারাবাহিক টার্ন-লেভেল নির্দেশনা ( speech_metadata ) এবং নির্দিষ্ট সময়ের ইনলাইন ভোকাল ট্যাগগুলোকে আলাদা করে।
স্টাইল ফিল্ড বনাম ইনলাইন ট্যাগ
আপনার কর্মসম্পাদন নির্দেশাবলী পরিধি অনুসারে ভাগ করুন:
- পালা-ভিত্তিক বাচনভঙ্গি (
speech_metadata.style): বাচনভঙ্গির ধারাবাহিক বৈশিষ্ট্যগুলো—যেমন আবেগ, স্বরভঙ্গি, সামগ্রিক গতি, বা বাচনভঙ্গি (যেমন"whispering","out of breath","muttering", বা"sarcastic")—speech_metadataএরstyleফিল্ডে রাখুন। বিভিন্ন পালা জুড়ে একটি স্থিতিশীল চরিত্র এবং পারফরম্যান্স তৈরি করতে, ভয়েস ডিজাইনে শুরুতেই পার্সোনাটি ডিজাইন করুন এবং শুধুমাত্র পালা-ভিত্তিক ঐচ্ছিক ছোটখাটো পরিবর্তনের জন্য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"সেট করুন।
স্বরবিন্যাস এবং পিচ
একটি টার্ন জুড়ে স্বরপ্রক্ষেপ, পিচ এবং স্বরভঙ্গি নিয়ন্ত্রণ করতে speech_metadata.style ব্যবহার করুন (উদাহরণস্বরূপ, "style": "high pitch, cheerful and excited inflection" অথবা "style": "monotone and flat" )। যদি সংলাপের মাঝখানে আবেগ বা স্বরপ্রক্ষেপ পরিবর্তিত হয়, তবে স্ক্রিপ্টটিকে আলাদা টার্নে ভাগ করুন এবং প্রতিটি টার্নের জন্য স্বতন্ত্র 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_...তৈরি করুন, এবং তারপর আপনার টিটিএস কলগুলোতে সেই ভয়েস আইডিটি ব্যবহার করুন। - স্থিতিশীলতার জন্য ভয়েস রেফারেন্সের উপর নির্ভর করুন (মেটা-নির্দেশাবলী বাদ দিন): জেমিনি ৩.৮ টিটিএস মডেলগুলোকে প্রথমে অডিও রেফারেন্সের উপর ভিত্তি করে স্থির হতে প্রশিক্ষণ দেওয়া হয়। মডেলকে কণ্ঠস্বর স্থির রাখতে বলার মতো কোনো নির্দেশাবলী অন্তর্ভুক্ত করবেন না (যেমন
"do not switch speaker identity"বা"maintain identical timbre")—অতিরিক্ত প্রম্পট টেক্সট কণ্ঠস্বরের বিচ্যুতি বাড়ায়। অপ্রয়োজনীয় স্টাইল নির্দেশাবলী বাদ দিন এবং ভয়েস রেফারেন্স দ্বারা প্রদত্ত স্থিতিশীল বিন্দুর চারপাশে মডেলকে স্বাভাবিকভাবে পরিবর্তিত হতে দিন। -
styleমাধ্যমে বক্তার অপরিবর্তনীয় বৈশিষ্ট্য পরিবর্তন করার চেষ্টা করবেন না:speech_metadata.styleএ বয়স, লিঙ্গ, নাম বা স্থায়ী উচ্চারণ পরিবর্তন অন্তর্ভুক্ত করা থেকে বিরত থাকুন। এর পরিবর্তে, এক্সটেন্ডেড ভয়েস লাইব্রেরি থেকে একটি আঞ্চলিক কণ্ঠস্বর বেছে নিন অথবা ভয়েস ডিজাইন ব্যবহার করে একটি তৈরি করুন।
প্রস্তাবিত কর্মপ্রবাহ
- চরিত্রটি একবারই তৈরি করুন: ভয়েস ডিজাইনে আপনার চরিত্রটি তৈরি করুন অথবা এক্সটেন্ডেড ভয়েস লাইব্রেরি থেকে আপনার লক্ষ্য ভাষা ও ব্যক্তিত্বের সাথে মেলে এমন একটি আঞ্চলিক ভয়েস বেছে নিন।
- কথার জড়তা সহ স্বাভাবিক কথোপকথনের প্রতিলিপি লিখুন: সর্বোচ্চ স্বাভাবিকতার জন্য,
textএকটি বাস্তব কথোপকথনের প্রতিলিপির মতো করে লিখুন—যার মধ্যে স্বাভাবিক কথোপকথনের জড়তা এবং দ্বিধা অন্তর্ভুক্ত থাকবে (উদাহরণস্বরূপ,"Oh uh yeah I think... hm, so that's interesting")। - প্রথমে সাধারণ টিটিএস (TTS) পরীক্ষা করুন: প্রথমে একটি খালি
styleফিল্ড ব্যবহার করে আপনার ট্রান্সক্রিপ্টটি তৈরি করুন—বেশিরভাগ অনুরোধের জন্য কোনোstyleনির্দেশনার প্রয়োজন হয় না। - শুধুমাত্র ছোটখাটো পরিবর্তনের জন্য সংক্ষিপ্ত
styleপ্রম্পট যোগ করুন: শুধুমাত্র যে টার্নগুলোতে নির্দিষ্ট ডেলিভারি সমন্বয়ের প্রয়োজন, সেগুলোর জন্য একটি সংক্ষিপ্তstyleস্ট্রিং (যেমন"casual, friendly"বা"muttering, then reassuring") যোগ করুন, এবং যখন আপনি একটি সামঞ্জস্যপূর্ণ বেসলাইন চান, তখন টার্নজুড়ে ঠিক সেই সংক্ষিপ্ত স্ট্রিংটিই পুনরায় ব্যবহার করুন।
একাধিক পালা সংলাপ এবং ভয়েস এজেন্ট
রিয়েল-টাইম কথোপকথনমূলক ভয়েস এজেন্ট বা মাল্টি-টার্ন অ্যাপ্লিকেশন তৈরি করার সময়:
- এলএলএম টেক্সট খণ্ডগুলো আসার সাথে সাথে প্রতি পালায় একটি করে টিটিএস কল করুন।
- কনফিগার করা
voice(পূর্ব-নির্মিত, ডিজাইন করাvoice_..., অথবা প্রতিলিপিকৃতvoice_.../voicekey_...) পালাক্রমে বক্তার পরিচয় বহন করুক—প্রতি পালায় কখনও একটি দীর্ঘ চরিত্রের অবয়ব পুনরায় পাঠাবেন না। - প্রতি-পালা
styleক্ষেত্রটি খালি রাখুন, অথবা পুরো কথোপকথনের জন্য একটি সংক্ষিপ্ত ধ্রুবক স্ট্রিং (যেমন"casual, friendly") পাঠান। - আরও জোরালো শৈলীগত নির্দেশনার সাহায্য না নিয়ে, এজেন্টের দীর্ঘ প্রতিক্রিয়াগুলোকে ছোট ছোট অংশে ভাগ করুন।
সীমাবদ্ধতা
- টিটিএস মডেলগুলো শুধুমাত্র টেক্সট ইনপুট গ্রহণ করে এবং শুধুমাত্র অডিও আউটপুট তৈরি করে।
- একক-অনুরোধে একাধিক-স্পিকার তৈরি (
speech_config.speakers) পূর্ব-নির্মিত ভয়েস ব্যবহার করে ২ জন পর্যন্ত স্পিকারকে সমর্থন করে। একাধিক চরিত্রের সংলাপে কাস্টম ডিজাইন করা (voice_...) বা প্রতিলিপিকৃত (voice_.../voicekey_...) ভয়েস একত্রিত করতে, প্রতিটি স্পিকারের পালা আলাদাভাবে সংশ্লেষণ করুন। যেহেতু ইউনিটারি অনুরোধগুলি ডিফল্টরূপে একটি ৪৪-বাইট RIFF হেডার সহaudio/wavফেরত দেয়, তাই র PCM ({"type": "audio", "mime_type": "audio/l16"}) অনুরোধ করুন অথবা ২৪kHz PCM অডিও ফ্রেমগুলি সংযুক্ত করার আগে প্রতিটি পালা থেকে WAV হেডারটি সরিয়ে ফেলুন। - কাস্টম ভয়েস স্টোরেজ সীমা এবং TTL:
- স্টেটফুল ভয়েস (
store=True, প্রম্পটেড বা রেপ্লিকেটেড): প্রতি প্রজেক্টে সর্বোচ্চ ২০০টি ভয়েস, যার টিটিএল (টাইম-টু-লিভ) ১ বছর । - স্টেটলেস ভয়েস কী (
store=False,voicekey_...): ৭-দিনের টিটিএল (টাইম-টু-লিভ)।
- স্টেটফুল ভয়েস (
- ভাষাগত কভারেজ জানতে সমর্থিত ভাষা বিভাগটি পর্যালোচনা করুন।
এরপর কী?
- ভয়েস ডিজাইন-এর সাহায্যে স্বাভাবিক ভাষা থেকে নিজস্ব ভোকাল পারসোনা তৈরি করুন।
- ভয়েস রেপ্লিকেশন- এর মাধ্যমে বিদ্যমান কোনো বক্তার কণ্ঠস্বর অনুকরণ করুন।
- Gemini 3.8 Flash TTS এবং Gemini 3.8 Flash-Lite TTS মডেল পেজগুলোতে মডেলের স্পেসিফিকেশন তুলনা করুন।
- Live API- এর মাধ্যমে ইন্টারেক্টিভ দ্বিমুখী অডিও অন্বেষণ করুন।
জেমিনি এপিআই, জেমিনির টেক্সট-টু-স্পিচ (টিটিএস) জেনারেশন ক্ষমতা ব্যবহার করে টেক্সট ইনপুটকে একক-বক্তা বা একাধিক-বক্তার অডিওতে রূপান্তর করতে পারে। টেক্সট-টু-স্পিচ জেনারেশন নিয়ন্ত্রণযোগ্য , যার অর্থ হলো আপনি অডিওর স্টাইল , উচ্চারণ , গতি এবং সুর নিয়ন্ত্রণ করার জন্য স্ট্রাকচার্ড টার্ন মেটাডেটা ( speech_metadata ) এবং ইনলাইন ভোকাল ট্যাগ একত্রিত করতে পারেন।
টিটিএস (TTS) সক্ষমতাটি লাইভ এপিআই (Live API) -এর মাধ্যমে প্রদত্ত স্পিচ জেনারেশন থেকে ভিন্ন, যা ইন্টারেক্টিভ, কাঠামোবিহীন অডিও এবং মাল্টিমোডাল ইনপুট ও আউটপুটের জন্য ডিজাইন করা হয়েছে। যেখানে লাইভ এপিআই গতিশীল কথোপকথনের প্রেক্ষাপটে বিশেষভাবে পারদর্শী, সেখানে জেমিনি এপিআই (Gemini API)-এর মাধ্যমে টিটিএস এমন সব পরিস্থিতির জন্য বিশেষভাবে তৈরি করা হয়েছে যেখানে স্টাইল ও সাউন্ডের উপর সূক্ষ্ম নিয়ন্ত্রণের সাথে হুবহু টেক্সট আবৃত্তির প্রয়োজন হয়, যেমন পডকাস্ট বা অডিওবুক তৈরি।
এই নির্দেশিকাটি আপনাকে দেখাবে কিভাবে 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 TTS মডেল ব্যবহার করে টেক্সটকে একক-বক্তার অডিওতে রূপান্তর করতে, input হুবহু ট্রান্সক্রিপ্টটি দিন, speech_metadata অ্যানোটেশন ব্যবহার করে টার্ন-লেভেল স্টাইলিং সংযুক্ত করুন এবং generation_config.speech_config ফাইলে আপনার ভয়েস কনফিগার করুন। আপনি আগে থেকে তৈরি ভয়েস অপশন , এক্সটেন্ডেড ভয়েস লাইব্রেরি ( GET /v1beta/voices ), একটি কাস্টম ভয়েস ডিজাইন আইডি ( voice_... ), অথবা একটি ভয়েস রেপ্লিকেশন আইডি ( voice_... , বা ঐচ্ছিক স্টেটলেস voicekey_... ) থেকে একটি ভয়েস বেছে নিতে পারেন।
এই উদাহরণটি মডেল থেকে ডিফল্ট WAV আউটপুট অডিও ( audio/wav ) সরাসরি একটি ফাইলে সংরক্ষণ করে:
পাইথন
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();
যান
package main
import (
"context"
"encoding/base64"
"encoding/binary"
"log"
"os"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func saveWaveFile(filename string, pcmData []byte) error {
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
sampleRate := uint32(24000)
numChannels := uint16(1)
bitsPerSample := uint16(16)
byteRate := sampleRate * uint32(numChannels) * uint32(bitsPerSample/8)
blockAlign := numChannels * (bitsPerSample / 8)
dataSize := uint32(len(pcmData))
f.WriteString("RIFF")
binary.Write(f, binary.LittleEndian, uint32(36+dataSize))
f.WriteString("WAVEfmt ")
binary.Write(f, binary.LittleEndian, uint32(16))
binary.Write(f, binary.LittleEndian, uint16(1))
binary.Write(f, binary.LittleEndian, numChannels)
binary.Write(f, binary.LittleEndian, sampleRate)
binary.Write(f, binary.LittleEndian, byteRate)
binary.Write(f, binary.LittleEndian, blockAlign)
binary.Write(f, binary.LittleEndian, bitsPerSample)
f.WriteString("data")
binary.Write(f, binary.LittleEndian, dataSize)
_, err = f.Write(pcmData)
return err
}
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Voice: genai.Ptr("Kore")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput("Say cheerfully: Have a wonderful day!"),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
if res.Interaction.OutputAudio != nil && res.Interaction.OutputAudio.Data != nil {
pcmBytes, err := base64.StdEncoding.DecodeString(*res.Interaction.OutputAudio.Data)
if err != nil {
log.Fatal(err)
}
if err := saveWaveFile("out.wav", pcmBytes); err != nil {
log.Fatal(err)
}
}
}
বিশ্রাম
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
পাইথন এবং জাভাস্ক্রিপ্ট SDK-তে, আপনি interaction.output_audio কনভেনিয়েন্স প্রপার্টি ব্যবহার করে জেনারেট করা অডিও ডেটা পুনরুদ্ধার করতে পারেন, যা সর্বশেষ জেনারেট করা অডিও ব্লকটি রিটার্ন করে (র REST JSON রেসপন্সে, base64-এনকোডেড অডিও steps[].content[].data তে স্টোর করা থাকে)। কনভেনিয়েন্স প্রপার্টি সম্পর্কে বিস্তারিত জানতে, ইন্টারঅ্যাকশন ওভারভিউ দেখুন।
মাল্টি-স্পিকার টিটিএস
একাধিক বক্তার কথোপকথনের জন্য, speech_config.speakers ফাইলে দুজন বক্তাকে কনফিগার করুন এবং প্রতিটি পালাকে একটি পৃথক টেক্সট আইটেম হিসাবে পাঠান, যার সাথে speech_metadata অ্যানোটেশন ব্যবহার করে speaker এবং ঐচ্ছিক পালা-স্তরের style নির্দিষ্ট করতে হবে। স্বাভাবিক পালাবদলের ছন্দের জন্য "mode": "conversational" ব্যবহার করুন।
পাইথন
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": {
"mode": "conversational",
"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: {
mode: 'conversational',
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();
যান
package main
import (
"context"
"encoding/base64"
"encoding/binary"
"log"
"os"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func saveWaveFile(filename string, pcmData []byte) error {
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
sampleRate := uint32(24000)
numChannels := uint16(1)
bitsPerSample := uint16(16)
byteRate := sampleRate * uint32(numChannels) * uint32(bitsPerSample/8)
blockAlign := numChannels * (bitsPerSample / 8)
dataSize := uint32(len(pcmData))
f.WriteString("RIFF")
binary.Write(f, binary.LittleEndian, uint32(36+dataSize))
f.WriteString("WAVEfmt ")
binary.Write(f, binary.LittleEndian, uint32(16))
binary.Write(f, binary.LittleEndian, uint16(1))
binary.Write(f, binary.LittleEndian, numChannels)
binary.Write(f, binary.LittleEndian, sampleRate)
binary.Write(f, binary.LittleEndian, byteRate)
binary.Write(f, binary.LittleEndian, blockAlign)
binary.Write(f, binary.LittleEndian, bitsPerSample)
f.WriteString("data")
binary.Write(f, binary.LittleEndian, dataSize)
_, err = f.Write(pcmData)
return err
}
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
prompt := "TTS the following conversation between Joe and Jane:\n" +
"Joe: How's it going today Jane?\n" +
"Jane: Not too bad, how about you?"
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Speaker: genai.Ptr("Joe"), Voice: genai.Ptr("Kore")},
{Speaker: genai.Ptr("Jane"), Voice: genai.Ptr("Puck")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput(prompt),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
if res.Interaction.OutputAudio != nil && res.Interaction.OutputAudio.Data != nil {
pcmBytes, err := base64.StdEncoding.DecodeString(*res.Interaction.OutputAudio.Data)
if err != nil {
log.Fatal(err)
}
if err := saveWaveFile("out.wav", pcmBytes); err != nil {
log.Fatal(err)
}
}
}
বিশ্রাম
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" }
]
}
}
}'
মেটাডেটা এবং ট্যাগ ব্যবহার করে বক্তৃতার ধরণ নিয়ন্ত্রণ করুন
জেমিনি ৩.৮ টিটিএস 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...")।
বিস্তারিত সর্বোত্তম অনুশীলন জানতে প্রম্পটিং নির্দেশিকা দেখুন।
যান
package main
import (
"context"
"log"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
transcriptRes, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.8-flash"),
Input: interactions.NewInteractionsInput(
"Generate a short transcript around 100 words that reads " +
"like it was clipped from a podcast by excited herpetologists. " +
"The hosts names are Dr. Anya and Liam.",
),
}),
})
if err != nil {
log.Fatal(err)
}
var transcript string
if transcriptRes.Interaction.OutputText != nil {
transcript = *transcriptRes.Interaction.OutputText
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Speaker: genai.Ptr("Dr. Anya"), Voice: genai.Ptr("Kore")},
{Speaker: genai.Ptr("Liam"), Voice: genai.Ptr("Puck")},
})),
}
ttsRes, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput(transcript),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
_ = ttsRes
}
স্ট্রিমিং স্পিচ জেনারেশন
আপনি stream: true সেট করে সিন্থেসাইজ হওয়ার সময়েই তৈরি হওয়া অডিও স্ট্রিম করতে পারেন। ইউনিটারি রিকোয়েস্টের (যা একটি RIFF হেডার সহ একটি সম্পূর্ণ WAV ফাইল রিটার্ন করে) বিপরীতে, স্ট্রিমিং রিকোয়েস্ট ডিফল্টরূপে হেডারবিহীন র 16-বিট সাইনড লিটল-এন্ডিয়ান লিনিয়ার PCM ( audio/l16 , 24 kHz, mono) চাঙ্ক রিটার্ন করে, ফলে কন্টেইনার হেডার ছাড়াই অডিও চাঙ্কগুলো অবিচ্ছিন্নভাবে প্লে বা কনক্যাটিনেট করা যায়।
পাইথন
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
}'
অডিও আউটপুট ফরম্যাট
অনুরোধটি ইউনারি নাকি স্ট্রিমিং, তার উপর নির্ভর করে জেমিনি ৩.৮ টিটিএস মডেলগুলো ভিন্ন ভিন্ন ডিফল্ট অডিও ফরম্যাট ব্যবহার করে:
- একক অনুরোধ (
stream=False): একটি স্ট্যান্ডার্ড RIFF হেডার সহ সম্পূর্ণ WAV (audio/wav) অডিও ফেরত দেয় (২৪ কিলোহার্টজ, মোনো, ১৬-বিট সাইনড লিটল-এন্ডিয়ান পিসিএম)। আপনি ম্যানুয়ালি শুরুতে WAV হেডার যোগ না করেই ডিকোড করা অডিও বাইটগুলো সরাসরি একটি.wavফাইলে সংরক্ষণ করতে পারেন। - স্ট্রিমিং অনুরোধ (
stream=True): ডিফল্টরূপে হেডারবিহীন কাঁচা লিনিয়ার পিসিএম (audio/l16) চাঙ্ক (২৪ কিলোহার্টজ, মোনো, ১৬-বিট সাইনড লিটল-এন্ডিয়ান পিসিএম) ফেরত দেয়, যাতে প্রতিটি চাঙ্কে কন্টেইনার হেডার ছাড়াই চাঙ্কগুলো অবিচ্ছিন্নভাবে স্ট্রিম বা সংযুক্ত করা যায়।
ভিন্ন অডিও এনকোডিং বা স্যাম্পল রেট অনুরোধ করতে, response_format ভিতরে mime_type এবং ঐচ্ছিক sample_rate কনফিগার করুন:
| ফর্ম্যাট | mime_type মান | বর্ণনা |
|---|---|---|
| WAV (একক ডিফল্ট) | "audio/wav" | RIFF হেডার সহ অসংকুচিত WAV ফাইল (১৬-বিট সাইনড লিটল-এন্ডিয়ান PCM, মোনো, ডিফল্ট ২৪ kHz)। ইউনিটারি অনুরোধের জন্য এটিই ডিফল্ট। |
| কাঁচা পিসিএম (এল১৬) (স্ট্রিমিং ডিফল্ট) | "audio/l16" | অসংকুচিত, হেডারবিহীন ১৬-বিট সাইনড লিটল-এন্ডিয়ান লিনিয়ার পিসিএম অডিও (২৪ কিলোহার্টজ, মোনো)। স্ট্রিমিং অনুরোধের জন্য এটিই ডিফল্ট। |
| মু-ল | "audio/mulaw" | ৮-বিট জি.৭১১ মিউ-ল এনকোডেড অডিও (যা সাধারণত উত্তর আমেরিকান এবং জাপানি টেলিফোনি/আইভিআর সিস্টেমে ব্যবহৃত হয়)। |
| একটি আইন | "audio/alaw" | ৮-বিট জি.৭১১ এ-ল এনকোডেড অডিও (যা সাধারণত ইউরোপীয় ও আন্তর্জাতিক টেলিফোনি সিস্টেমে ব্যবহৃত হয়)। |
আপনি sample_rate হার্টজ-এও নির্দিষ্ট করতে পারেন (যেমন, 24000 , 16000 বা 8000 )।
পাইথন
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();
যান
package main
import (
"context"
"encoding/base64"
"log"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Voice: genai.Ptr("Kore")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput("Say cheerfully: Have a wonderful day!"),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
Stream: genai.Ptr(true),
}),
})
if err != nil {
log.Fatal(err)
}
stream := res.InteractionSSEStreamEvent
defer stream.Close()
for stream.Next() {
event := stream.Value()
if stepDelta := event.GetDataStepDelta(); stepDelta != nil {
if audioDelta := stepDelta.GetDeltaAudio(); audioDelta != nil && audioDelta.Data != nil {
audioData, err := base64.StdEncoding.DecodeString(*audioDelta.Data)
if err != nil {
log.Fatal(err)
}
// Process the audio chunk (e.g. play it or write to a file)
_ = audioData
}
}
}
if err := stream.Err(); err != nil {
log.Fatal(err)
}
}
বিশ্রাম
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" }
]
}
}'
ভয়েস বিকল্পগুলি
জেমিনি ৩.৮ টিটিএস চারটি উপায়ে ভয়েস নির্বাচন বা তৈরি করার সুবিধা দেয়:
- পূর্ব-নির্মিত স্টুডিও ভয়েস: নিম্নলিখিত সারণীতে তালিকাভুক্ত ৩০টি নির্বাচিত ভয়েস।
- বর্ধিত ভয়েস লাইব্রেরি: বিভিন্ন ভাষা, উচ্চারণভঙ্গি এবং চরিত্রের ধরনের শত শত অতিরিক্ত কণ্ঠস্বর, যা
client.voices.list()(GET /v1beta/voices) ব্যবহার করে অ্যাক্সেস করা যায়। - ভয়েস ডিজাইন : গুগল এআই স্টুডিওতে স্বাভাবিক ভাষার বর্ণনা থেকে অথবা
POST /v1beta/voices(type="prompted"ব্যবহার করে একটি কাস্টম ভোকাল পার্সোনা তৈরি করুন, যা একটি স্থায়ীvoice_...ID এবংCreateVoiceওGetVoiceএ একটিsample_audioWAV প্রিভিউ রিটার্ন করে। - ভয়েস রেপ্লিকেশন : গুগল এআই স্টুডিওতে রেফারেন্স এবং কনসেন্ট অডিও থেকে অথবা
POST /v1beta/voicesব্যবহার করে একজন স্পিকারের ভয়েস রেপ্লিকেট করুন (type="replicated", ডিফল্টরূপে persistentstore=Trueঅথবা ঐচ্ছিক statelessstore=False)।
কাস্টম ভয়েস সীমা এবং TTL
| কণ্ঠস্বরের ধরণ | স্টোরেজ মোড | কোটা / সীমা | ধরে রাখা (TTL) |
|---|---|---|---|
স্টেটফুল ভয়েস ( voice_... , প্রম্পটেড বা রেপ্লিকেটেড) | store=True | প্রতিটি প্রকল্পে ২০০টি কণ্ঠস্বর (প্রেরিত এবং অনুলিখিত কণ্ঠস্বরের মধ্যে ভাগ করা) | ১ বছর |
স্টেটলেস ভয়েস কী ( voicekey_... , প্রতিলিপিকৃত) | store=False | ক্লায়েন্ট-পরিচালিত | ৭ দিন |
পূর্ব-নির্মিত কণ্ঠস্বর
| জেফির -- ব্রাইট | পাক -- উচ্ছ্বসিত | চারন -- তথ্যমূলক |
| কোর -- ফার্ম | ফেনরির -- উত্তেজিত | লেডা -- যুবতী |
| ওরুস -- ফার্ম | Aoede -- Breezy | ক্যালিরো -- সহজ-সরল |
| Autonoe -- Bright | এনসেলাডাস -- শ্বাসপ্রশ্বাসযুক্ত | আইপেটাস -- পরিষ্কার |
| উমব্রিয়েল -- সহজ-সরল | আলজিবা -- মসৃণ | ডেসপিনা -- মসৃণ |
| এরিনোম -- পরিষ্কার | অ্যালজেনিব -- গ্র্যাভেলি | রসলগেথি -- তথ্যমূলক |
| লাওমেডিয়া -- উচ্ছ্বসিত | আখেরনার -- নরম | আলনিলাম -- ফার্ম |
| শেডার -- এমনকি | গ্যাক্রাক্স -- পরিপক্ক | পুলচেরিমা -- ফরোয়ার্ড |
| আচির্ড -- বন্ধুত্বপূর্ণ | Zubenelgenubi -- Casual | ভিন্ডেমিয়াট্রিক্স -- কোমল |
| সাদাচবিয়া -- প্রাণবন্ত | সাদালটেগার -- জ্ঞানী | সুলাফাত -- উষ্ণ |
বর্ধিত ভয়েস লাইব্রেরি এবং ফিল্টারিং
পূর্ববর্তী সারণীতে উল্লেখিত ৩০টি স্টুডিও ভয়েস ছাড়াও, এক্সটেন্ডেড ভয়েস লাইব্রেরিতে বিভিন্ন ভাষা, আঞ্চলিক উচ্চারণ, চরিত্রের ধরণ এবং ডোমেন জুড়ে শত শত অতিরিক্ত ভয়েস রয়েছে। আপনি গুগল এআই স্টুডিও -তে সম্পূর্ণ ভয়েস লাইব্রেরিটি ইন্টারেক্টিভভাবে ব্রাউজ, ফিল্টার এবং অডিশন করতে পারেন, অথবা 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 (পাইথনে type_ ) | list[str] | ভয়েস সোর্স অনুযায়ী ফিল্টার করুন: "prebuilt" , "prompted" ( ভয়েস ডিজাইন ), অথবা "replicated" ( ভয়েস রেপ্লিকেশন )। |
search | str | ফ্রি-টেক্সট সাবস্ট্রিং সার্চ display_name এবং description উভয়ের ক্ষেত্রেই কেস-ইনসেনসিটিভভাবে ম্যাচ করেছে। |
page_size | int | প্রতি পৃষ্ঠায় ফেরত আসা কণ্ঠস্বরের সর্বোচ্চ সংখ্যা (ডিফল্ট 50 , সর্বোচ্চ 1000 )। |
page_token | str | ফলাফলের পরবর্তী পৃষ্ঠা আনার জন্য response.next_page_token থেকে টোকেন। |
পাইথন
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"
সমর্থিত ভাষা
টিটিএস মডেলগুলো ইনপুট ভাষা স্বয়ংক্রিয়ভাবে শনাক্ত করে। জেমিনি ৩.৮ ফ্ল্যাশ টিটিএস ( gemini-3.8-flash-tts ) ১৩০টিরও বেশি ভাষা সমর্থন করে এবং জেমিনি ৩.৮ ফ্ল্যাশ-লাইট টিটিএস ( gemini-3.8-flash-lite-tts ) ১০০টিরও বেশি ভাষা সমর্থন করে।
| ভাষা | জেমিনি ৩.৮ ফ্ল্যাশ টিটিএস | জেমিনি ৩.৮ ফ্ল্যাশ-লাইট টিটিএস |
|---|---|---|
| আচেহনিজ (আরবি লিপি) | ✔️ | ✔️ |
| আফ্রিকান | ✔️ | ✔️ |
| আকান | ✔️ | ✔️ |
| আমহারিক | ✔️ | ✔️ |
| আর্মেনীয় | ✔️ | ✔️ |
| অসমীয়া | ✔️ | ✔️ |
| অবধী | ✔️ | ✔️ |
| বালিনিজ | ✔️ | ✔️ |
| বাংলা | ✔️ | ✔️ |
| বানজার (আরবি লিপি) | ✔️ | — |
| বানজার (ল্যাটিন লিপি) | ✔️ | ✔️ |
| বাশকির | ✔️ | — |
| বাস্ক | ✔️ | ✔️ |
| বেলারুশীয় | ✔️ | ✔️ |
| বেম্বা | ✔️ | — |
| ভোজপুরি | ✔️ | ✔️ |
| বসনীয় | ✔️ | ✔️ |
| বুগিনিজ | ✔️ | ✔️ |
| বুলগেরীয় | ✔️ | ✔️ |
| বর্মী | ✔️ | — |
| ক্যান্টনিজ | ✔️ | ✔️ |
| কাতালান | ✔️ | ✔️ |
| সেবুয়ানো | ✔️ | ✔️ |
| কেন্দ্রীয় কুর্দিশ | ✔️ | ✔️ |
| ছত্তিশগড়ী | ✔️ | ✔️ |
| চীনা (হ্যান্স লিপি) | ✔️ | ✔️ |
| চীনা (হান্ট লিপি) | ✔️ | ✔️ |
| ক্রিমিয়ান তাতার | ✔️ | — |
| ক্রোয়েশীয় | ✔️ | ✔️ |
| চেক | ✔️ | ✔️ |
| ড্যানিশ | ✔️ | ✔️ |
| ডাচ | ✔️ | ✔️ |
| ডাইলা | ✔️ | — |
| জংখা | ✔️ | — |
| মিশরীয় আরবি | ✔️ | ✔️ |
| ইংরেজি | ✔️ | ✔️ |
| এস্তোনিয়ান | ✔️ | ✔️ |
| ফিলিপিনো | ✔️ | ✔️ |
| ফিনিশ | ✔️ | — |
| ফরাসি | ✔️ | ✔️ |
| গ্যালিসিয়ান | ✔️ | ✔️ |
| গান্ডা | ✔️ | ✔️ |
| জর্জিয়ান | ✔️ | ✔️ |
| জার্মান | ✔️ | ✔️ |
| গ্রীক | ✔️ | ✔️ |
| গুয়ারানি | ✔️ | — |
| গুজরাটি | ✔️ | ✔️ |
| হাইতিয়ান ক্রেওল | ✔️ | ✔️ |
| হালহ মঙ্গোলিয়ান | ✔️ | ✔️ |
| হাউসা | ✔️ | ✔️ |
| হিব্রু | ✔️ | ✔️ |
| হিন্দি | ✔️ | ✔️ |
| হাঙ্গেরীয় | ✔️ | ✔️ |
| আইসল্যান্ডীয় | ✔️ | ✔️ |
| ইগবো | ✔️ | — |
| ইলোকো | ✔️ | ✔️ |
| ইন্দোনেশিয়ান | ✔️ | ✔️ |
| ইরানি ফার্সি | ✔️ | ✔️ |
| ইতালীয় | ✔️ | ✔️ |
| জাপানি | ✔️ | ✔️ |
| জাভানিজ | ✔️ | ✔️ |
| কাবাইল | ✔️ | — |
| কাম্বা | ✔️ | ✔️ |
| কন্নড় | ✔️ | ✔️ |
| কাশ্মীরি (আরবি লিপি) | ✔️ | ✔️ |
| কাশ্মীরি (দেব লিপি) | ✔️ | ✔️ |
| কাজাখ | ✔️ | ✔️ |
| খেমার | ✔️ | ✔️ |
| কিকুয়ু | ✔️ | ✔️ |
| কিনিয়ারওয়ান্ডা | ✔️ | ✔️ |
| কঙ্গো | ✔️ | ✔️ |
| কোরিয়ান | ✔️ | ✔️ |
| কিরগিজ | ✔️ | ✔️ |
| লাও | ✔️ | ✔️ |
| লাটগালিয়ান | ✔️ | — |
| লিঙ্গালা | ✔️ | ✔️ |
| লিথুয়ানিয়ান | ✔️ | — |
| লুক্সেমবার্গীয় | ✔️ | — |
| ম্যাসিডোনিয়ান | ✔️ | ✔️ |
| মাগাহি | ✔️ | ✔️ |
| মৈথিলী | ✔️ | ✔️ |
| মালয়ালম | ✔️ | ✔️ |
| মাল্টিজ | ✔️ | ✔️ |
| মণিপুরি | ✔️ | ✔️ |
| মারাঠি | ✔️ | ✔️ |
| মিনাংকাবাউ (আরবি লিপি) | ✔️ | ✔️ |
| মিনাংকাবাউ (ল্যাটিন লিপি) | ✔️ | — |
| মিজো | ✔️ | ✔️ |
| নেপালি (ব্যক্তিগত ভাষা) | ✔️ | ✔️ |
| নাইজেরিয়ান ফুলফুলডে | ✔️ | ✔️ |
| উত্তর আজারবাইজানীয় | ✔️ | ✔️ |
| উত্তর সোথো | ✔️ | ✔️ |
| উত্তর উজবেক | ✔️ | ✔️ |
| নরওয়েজিয়ান বোকমাল | ✔️ | ✔️ |
| নরওয়েজিয়ান নিনরস্ক | ✔️ | ✔️ |
| নিয়ানজা | ✔️ | ✔️ |
| অক্সিটান | ✔️ | — |
| ওড়িয়া (ব্যক্তিগত ভাষা) | ✔️ | ✔️ |
| পাঙ্গাসিনান | ✔️ | — |
| ফার্সি (আফগানিস্তান) | ✔️ | ✔️ |
| পোলিশ | ✔️ | ✔️ |
| পর্তুগিজ | ✔️ | ✔️ |
| পাঞ্জাবি | ✔️ | ✔️ |
| রোমানিয়ান | ✔️ | ✔️ |
| রাশিয়ান | ✔️ | ✔️ |
| সাঁওতালি | ✔️ | ✔️ |
| সার্বিয়ান | ✔️ | ✔️ |
| সিন্ধি | ✔️ | — |
| সিংহলী | ✔️ | ✔️ |
| স্লোভাক | ✔️ | ✔️ |
| স্লোভেনীয় | ✔️ | — |
| সোমালি | ✔️ | — |
| দক্ষিণ আজারবাইজানীয় | ✔️ | ✔️ |
| দক্ষিণ পশতু | ✔️ | ✔️ |
| দক্ষিণ সোথো | ✔️ | — |
| স্প্যানিশ | ✔️ | ✔️ |
| প্রমিত আরবি (আরবি লিপি) | ✔️ | ✔️ |
| প্রমিত আরবি (ল্যাটিন লিপি) | ✔️ | ✔️ |
| প্রমিত লাতভিয়ান | ✔️ | ✔️ |
| প্রমিত মালয় | ✔️ | ✔️ |
| সোয়াহিলি (ব্যক্তিগত ভাষা) | ✔️ | — |
| স্বাতী | ✔️ | — |
| সুইডিশ | ✔️ | — |
| তাজিক | ✔️ | — |
| তামিল | ✔️ | ✔️ |
| তেলুগু | ✔️ | ✔️ |
| থাই | ✔️ | — |
| তিগ্রিনিয়া | ✔️ | — |
| তোস্ক আলবেনিয়ান | ✔️ | — |
| তুর্কি | ✔️ | ✔️ |
| উইঘুর | ✔️ | — |
| ভিয়েতনামী | ✔️ | ✔️ |
সমর্থিত মডেল
| মডেল | একক বক্তা | মাল্টি-স্পিকার | ভয়েস ডিজাইন | কণ্ঠস্বর প্রতিলিপি |
|---|---|---|---|---|
জেমিনি ৩.৮ ফ্ল্যাশ টিটিএস ( gemini-3.8-flash-tts ) | ✔️ | ✔️ | ✔️ | ✔️ |
জেমিনি ৩.৮ ফ্ল্যাশ-লাইট টিটিএস ( gemini-3.8-flash-lite-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-এ স্থানান্তরিত হন:
- টার্ন-লেভেল নির্দেশনাগুলো
speech_metadata-তে স্থানান্তর করুন: জেমিনি ৩.৮ টিটিএস ইনপুট টেক্সটকে কঠোরভাবে একটি হুবহু ট্রান্সক্রিপ্ট হিসেবে বিবেচনা করে। দীর্ঘায়িত ডেলিভারি নির্দেশাবলী (style—যেমন"whispering","out of breath", বা"speaking slowly") এবং স্পিকার লেবেল (speaker) ট্রান্সক্রিপ্ট টেক্সটে স্টেজ নির্দেশনা এম্বেড করার পরিবর্তে স্ট্রাকচার্ডspeech_metadataঅ্যানোটেশনে স্থানান্তর করুন। - শুধুমাত্র নির্দিষ্ট সময়ের বাচনিক ঘটনার জন্য অ্যাঙ্গেল-ব্র্যাকেট ইনলাইন ট্যাগ ব্যবহার করুন: ক্ষণস্থায়ী অ-কথ্য শব্দ এবং বিরতিগুলোকে ট্রান্সক্রিপ্টের মধ্যে অ্যাঙ্গেল ব্র্যাকেট ব্যবহার করে ইনলাইনে রাখুন (যেমন
<laugh>,<sigh>,<cough>,<breath>, বা<short pause>)। সাউন্ড-ইফেক্ট ট্যাগ (যেমন হাততালি বা ধপাস শব্দ) পরিহার করুন এবং ডেলিভারি স্টাইলspeech_metadata.styleএ রাখুন। - একাধিক বক্তার অনুরোধে প্রতিটি ধাপে
speakerনির্দিষ্ট করুন: একাধিক বক্তার অনুরোধের প্রতিটি ধাপে, কনফিগার করা বক্তাদের মধ্যে একজনের সাথে মিল রেখেspeech_metadataভিতরেspeakerস্পষ্টভাবে অন্তর্ভুক্ত করতে হবে। - ভয়েস ডিজাইন ব্যবহার করে শুরুতেই পারসোনা ডিজাইন করুন: একাধিক অনুচ্ছেদযুক্ত
"Audio Profile"বা"Director's Notes"ব্লকগুলিকে ভয়েস ডিজাইনে তৈরি একটি কাস্টম ভয়েস দিয়ে প্রতিস্থাপন করুন, তারপর ন্যূনতম বা খালিstyleস্ট্রিং ব্যবহার করে আপনার টিটিএস অনুরোধগুলিতে সেইvoice_...আইডিটি প্রয়োগ করুন। - ইউনারি রিকোয়েস্টের ক্ষেত্রে ডিফল্ট WAV (
audio/wav) আউটপুটের বিষয়টি বিবেচনা করুন:gemini-3.1-flash-tts-previewএবং পূর্ববর্তী TTS মডেলগুলির (যেগুলি ডিফল্টরূপে হেডারবিহীন র PCMaudio/l16রিটার্ন করত) থেকে ভিন্ন, Gemini 3.8 TTS ইউনারি রিকোয়েস্টের জন্য ডিফল্টরূপে একটি স্ট্যান্ডার্ড RIFF হেডার সহ WAV অডিও (audio/wav) রিটার্ন করে।- যদি আপনার কোড আগে সরাসরি PCM বাইটগুলোকে একটি WAV হেডারে মুড়ে দিয়ে থাকে (উদাহরণস্বরূপ, পাইথনের
waveমডিউল বাffmpegব্যবহার করে), তাহলে সেই ম্যানুয়াল হেডার র্যাপারটি সরিয়ে ফেলুন এবং ফেরত আসা বাইটগুলো সরাসরি একটি.wavফাইলে লিখুন। - আপনার পাইপলাইনে যদি হেডারবিহীন র PCM, mu-law, বা A-law অডিওর প্রয়োজন হয়, তাহলে স্পষ্টভাবে
response_format"audio/l16","audio/mulaw", বা"audio/alaw"এ সেট করুন। অডিও আউটপুট ফরম্যাটগুলো দেখুন।
- যদি আপনার কোড আগে সরাসরি PCM বাইটগুলোকে একটি WAV হেডারে মুড়ে দিয়ে থাকে (উদাহরণস্বরূপ, পাইথনের
প্রম্পটিং গাইড
জেমিনি ৩.৮ টিটিএস মডেলগুলো ইনপুট টেক্সটকে কঠোরভাবে একটি হুবহু প্রতিলিপি হিসেবে বিবেচনা করে। পূর্ববর্তী প্রিভিউ মডেলগুলোর মতো নয়, যেখানে মঞ্চ নির্দেশনাগুলো সাধারণ টেক্সটের মধ্যে এমবেড করা থাকতো, জেমিনি ৩.৮ টিটিএস ধারাবাহিক টার্ন-লেভেল নির্দেশনা ( speech_metadata ) এবং নির্দিষ্ট সময়ের ইনলাইন ভোকাল ট্যাগগুলোকে আলাদা করে।
স্টাইল ফিল্ড বনাম ইনলাইন ট্যাগ
আপনার কর্মসম্পাদন নির্দেশাবলী পরিধি অনুসারে ভাগ করুন:
- পালা-ভিত্তিক বাচনভঙ্গি (
speech_metadata.style): বাচনভঙ্গির ধারাবাহিক বৈশিষ্ট্যগুলো—যেমন আবেগ, স্বরভঙ্গি, সামগ্রিক গতি, বা বাচনভঙ্গি (যেমন"whispering","out of breath","muttering", বা"sarcastic")—speech_metadataএরstyleফিল্ডে রাখুন। বিভিন্ন পালা জুড়ে একটি স্থিতিশীল চরিত্র এবং পারফরম্যান্স তৈরি করতে, ভয়েস ডিজাইনে শুরুতেই পার্সোনাটি ডিজাইন করুন এবং শুধুমাত্র পালা-ভিত্তিক ঐচ্ছিক ছোটখাটো পরিবর্তনের জন্য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"সেট করুন।
স্বরবিন্যাস এবং পিচ
একটি টার্ন জুড়ে স্বরপ্রক্ষেপ, পিচ এবং স্বরভঙ্গি নিয়ন্ত্রণ করতে speech_metadata.style ব্যবহার করুন (উদাহরণস্বরূপ, "style": "high pitch, cheerful and excited inflection" অথবা "style": "monotone and flat" )। যদি সংলাপের মাঝখানে আবেগ বা স্বরপ্রক্ষেপ পরিবর্তিত হয়, তবে স্ক্রিপ্টটিকে আলাদা টার্নে ভাগ করুন এবং প্রতিটি টার্নের জন্য স্বতন্ত্র 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_...তৈরি করুন, এবং তারপর আপনার টিটিএস কলগুলোতে সেই ভয়েস আইডিটি ব্যবহার করুন। - স্থিতিশীলতার জন্য ভয়েস রেফারেন্সের উপর নির্ভর করুন (মেটা-নির্দেশাবলী বাদ দিন): জেমিনি ৩.৮ টিটিএস মডেলগুলোকে প্রথমে অডিও রেফারেন্সের উপর ভিত্তি করে স্থির হতে প্রশিক্ষণ দেওয়া হয়। মডেলকে কণ্ঠস্বর স্থির রাখতে বলার মতো কোনো নির্দেশাবলী অন্তর্ভুক্ত করবেন না (যেমন
"do not switch speaker identity"বা"maintain identical timbre")—অতিরিক্ত প্রম্পট টেক্সট কণ্ঠস্বরের বিচ্যুতি বাড়ায়। অপ্রয়োজনীয় স্টাইল নির্দেশাবলী বাদ দিন এবং ভয়েস রেফারেন্স দ্বারা প্রদত্ত স্থিতিশীল বিন্দুর চারপাশে মডেলকে স্বাভাবিকভাবে পরিবর্তিত হতে দিন। -
styleমাধ্যমে বক্তার অপরিবর্তনীয় বৈশিষ্ট্য পরিবর্তন করার চেষ্টা করবেন না:speech_metadata.styleএ বয়স, লিঙ্গ, নাম বা স্থায়ী উচ্চারণ পরিবর্তন অন্তর্ভুক্ত করা থেকে বিরত থাকুন। এর পরিবর্তে, এক্সটেন্ডেড ভয়েস লাইব্রেরি থেকে একটি আঞ্চলিক কণ্ঠস্বর বেছে নিন অথবা ভয়েস ডিজাইন ব্যবহার করে একটি তৈরি করুন।
প্রস্তাবিত কর্মপ্রবাহ
- চরিত্রটি একবারই তৈরি করুন: ভয়েস ডিজাইনে আপনার চরিত্রটি তৈরি করুন অথবা এক্সটেন্ডেড ভয়েস লাইব্রেরি থেকে আপনার লক্ষ্য ভাষা ও ব্যক্তিত্বের সাথে মেলে এমন একটি আঞ্চলিক ভয়েস বেছে নিন।
- কথার জড়তা সহ স্বাভাবিক কথোপকথনের প্রতিলিপি লিখুন: সর্বোচ্চ স্বাভাবিকতার জন্য,
textএকটি বাস্তব কথোপকথনের প্রতিলিপির মতো করে লিখুন—যার মধ্যে স্বাভাবিক কথোপকথনের জড়তা এবং দ্বিধা অন্তর্ভুক্ত থাকবে (উদাহরণস্বরূপ,"Oh uh yeah I think... hm, so that's interesting")। - প্রথমে সাধারণ টিটিএস (TTS) পরীক্ষা করুন: প্রথমে একটি খালি
styleফিল্ড ব্যবহার করে আপনার ট্রান্সক্রিপ্টটি তৈরি করুন—বেশিরভাগ অনুরোধের জন্য কোনোstyleনির্দেশনার প্রয়োজন হয় না। - শুধুমাত্র ছোটখাটো পরিবর্তনের জন্য সংক্ষিপ্ত
styleপ্রম্পট যোগ করুন: শুধুমাত্র যে টার্নগুলোতে নির্দিষ্ট ডেলিভারি সমন্বয়ের প্রয়োজন, সেগুলোর জন্য একটি সংক্ষিপ্তstyleস্ট্রিং (যেমন"casual, friendly"বা"muttering, then reassuring") যোগ করুন, এবং যখন আপনি একটি সামঞ্জস্যপূর্ণ বেসলাইন চান, তখন টার্নজুড়ে ঠিক সেই সংক্ষিপ্ত স্ট্রিংটিই পুনরায় ব্যবহার করুন।
একাধিক পালা সংলাপ এবং ভয়েস এজেন্ট
রিয়েল-টাইম কথোপকথনমূলক ভয়েস এজেন্ট বা মাল্টি-টার্ন অ্যাপ্লিকেশন তৈরি করার সময়:
- এলএলএম টেক্সট খণ্ডগুলো আসার সাথে সাথে প্রতি পালায় একটি করে টিটিএস কল করুন।
- কনফিগার করা
voice(পূর্ব-নির্মিত, ডিজাইন করাvoice_..., অথবা প্রতিলিপিকৃতvoice_.../voicekey_...) পালাক্রমে বক্তার পরিচয় বহন করুক—প্রতি পালায় কখনও একটি দীর্ঘ চরিত্রের অবয়ব পুনরায় পাঠাবেন না। - প্রতি-পালা
styleক্ষেত্রটি খালি রাখুন, অথবা পুরো কথোপকথনের জন্য একটি সংক্ষিপ্ত ধ্রুবক স্ট্রিং (যেমন"casual, friendly") পাঠান। - আরও জোরালো শৈলীগত নির্দেশনার সাহায্য না নিয়ে, এজেন্টের দীর্ঘ প্রতিক্রিয়াগুলোকে ছোট ছোট অংশে ভাগ করুন।
সীমাবদ্ধতা
- টিটিএস মডেলগুলো শুধুমাত্র টেক্সট ইনপুট গ্রহণ করে এবং শুধুমাত্র অডিও আউটপুট তৈরি করে।
- একক-অনুরোধে একাধিক-স্পিকার তৈরি (
speech_config.speakers) পূর্ব-নির্মিত ভয়েস ব্যবহার করে ২ জন পর্যন্ত স্পিকারকে সমর্থন করে। একাধিক চরিত্রের সংলাপে কাস্টম ডিজাইন করা (voice_...) বা প্রতিলিপিকৃত (voice_.../voicekey_...) ভয়েস একত্রিত করতে, প্রতিটি স্পিকারের পালা আলাদাভাবে সংশ্লেষণ করুন। যেহেতু ইউনিটারি অনুরোধগুলি ডিফল্টরূপে একটি ৪৪-বাইট RIFF হেডার সহaudio/wavফেরত দেয়, তাই র PCM ({"type": "audio", "mime_type": "audio/l16"}) অনুরোধ করুন অথবা ২৪kHz PCM অডিও ফ্রেমগুলি সংযুক্ত করার আগে প্রতিটি পালা থেকে WAV হেডারটি সরিয়ে ফেলুন। - কাস্টম ভয়েস স্টোরেজ সীমা এবং TTL:
- স্টেটফুল ভয়েস (
store=True, প্রম্পটেড বা রেপ্লিকেটেড): প্রতি প্রজেক্টে সর্বোচ্চ ২০০টি ভয়েস, যার টিটিএল (টাইম-টু-লিভ) ১ বছর । - স্টেটলেস ভয়েস কী (
store=False,voicekey_...): ৭-দিনের টিটিএল (টাইম-টু-লিভ)।
- স্টেটফুল ভয়েস (
- ভাষাগত কভারেজ জানতে সমর্থিত ভাষা বিভাগটি পর্যালোচনা করুন।
এরপর কী?
- ভয়েস ডিজাইন-এর সাহায্যে স্বাভাবিক ভাষা থেকে নিজস্ব ভোকাল পারসোনা তৈরি করুন।
- ভয়েস রেপ্লিকেশন- এর মাধ্যমে বিদ্যমান কোনো বক্তার কণ্ঠস্বর অনুকরণ করুন।
- Gemini 3.8 Flash TTS এবং Gemini 3.8 Flash-Lite TTS মডেল পেজগুলোতে মডেলের স্পেসিফিকেশন তুলনা করুন।
- Live API- এর মাধ্যমে ইন্টারেক্টিভ দ্বিমুখী অডিও অন্বেষণ করুন।
জেমিনি এপিআই, জেমিনির টেক্সট-টু-স্পিচ (টিটিএস) জেনারেশন ক্ষমতা ব্যবহার করে টেক্সট ইনপুটকে একক-বক্তা বা একাধিক-বক্তার অডিওতে রূপান্তর করতে পারে। টেক্সট-টু-স্পিচ জেনারেশন নিয়ন্ত্রণযোগ্য , যার অর্থ হলো আপনি অডিওর স্টাইল , উচ্চারণ , গতি এবং সুর নিয়ন্ত্রণ করার জন্য স্ট্রাকচার্ড টার্ন মেটাডেটা ( speech_metadata ) এবং ইনলাইন ভোকাল ট্যাগ একত্রিত করতে পারেন।
টিটিএস (TTS) সক্ষমতাটি লাইভ এপিআই (Live API) -এর মাধ্যমে প্রদত্ত স্পিচ জেনারেশন থেকে ভিন্ন, যা ইন্টারেক্টিভ, কাঠামোবিহীন অডিও এবং মাল্টিমোডাল ইনপুট ও আউটপুটের জন্য ডিজাইন করা হয়েছে। যেখানে লাইভ এপিআই গতিশীল কথোপকথনের প্রেক্ষাপটে বিশেষভাবে পারদর্শী, সেখানে জেমিনি এপিআই (Gemini API)-এর মাধ্যমে টিটিএস এমন সব পরিস্থিতির জন্য বিশেষভাবে তৈরি করা হয়েছে যেখানে স্টাইল ও সাউন্ডের উপর সূক্ষ্ম নিয়ন্ত্রণের সাথে হুবহু টেক্সট আবৃত্তির প্রয়োজন হয়, যেমন পডকাস্ট বা অডিওবুক তৈরি।
এই নির্দেশিকাটি আপনাকে দেখাবে কিভাবে 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 TTS মডেল ব্যবহার করে টেক্সটকে একক-বক্তার অডিওতে রূপান্তর করতে, input হুবহু ট্রান্সক্রিপ্টটি দিন, speech_metadata অ্যানোটেশন ব্যবহার করে টার্ন-লেভেল স্টাইলিং সংযুক্ত করুন এবং generation_config.speech_config ফাইলে আপনার ভয়েস কনফিগার করুন। আপনি আগে থেকে তৈরি ভয়েস অপশন , এক্সটেন্ডেড ভয়েস লাইব্রেরি ( GET /v1beta/voices ), একটি কাস্টম ভয়েস ডিজাইন আইডি ( voice_... ), অথবা একটি ভয়েস রেপ্লিকেশন আইডি ( voice_... , বা ঐচ্ছিক স্টেটলেস voicekey_... ) থেকে একটি ভয়েস বেছে নিতে পারেন।
এই উদাহরণটি মডেল থেকে ডিফল্ট WAV আউটপুট অডিও ( audio/wav ) সরাসরি একটি ফাইলে সংরক্ষণ করে:
পাইথন
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();
যান
package main
import (
"context"
"encoding/base64"
"encoding/binary"
"log"
"os"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func saveWaveFile(filename string, pcmData []byte) error {
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
sampleRate := uint32(24000)
numChannels := uint16(1)
bitsPerSample := uint16(16)
byteRate := sampleRate * uint32(numChannels) * uint32(bitsPerSample/8)
blockAlign := numChannels * (bitsPerSample / 8)
dataSize := uint32(len(pcmData))
f.WriteString("RIFF")
binary.Write(f, binary.LittleEndian, uint32(36+dataSize))
f.WriteString("WAVEfmt ")
binary.Write(f, binary.LittleEndian, uint32(16))
binary.Write(f, binary.LittleEndian, uint16(1))
binary.Write(f, binary.LittleEndian, numChannels)
binary.Write(f, binary.LittleEndian, sampleRate)
binary.Write(f, binary.LittleEndian, byteRate)
binary.Write(f, binary.LittleEndian, blockAlign)
binary.Write(f, binary.LittleEndian, bitsPerSample)
f.WriteString("data")
binary.Write(f, binary.LittleEndian, dataSize)
_, err = f.Write(pcmData)
return err
}
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Voice: genai.Ptr("Kore")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput("Say cheerfully: Have a wonderful day!"),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
if res.Interaction.OutputAudio != nil && res.Interaction.OutputAudio.Data != nil {
pcmBytes, err := base64.StdEncoding.DecodeString(*res.Interaction.OutputAudio.Data)
if err != nil {
log.Fatal(err)
}
if err := saveWaveFile("out.wav", pcmBytes); err != nil {
log.Fatal(err)
}
}
}
বিশ্রাম
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
পাইথন এবং জাভাস্ক্রিপ্ট SDK-তে, আপনি interaction.output_audio কনভেনিয়েন্স প্রপার্টি ব্যবহার করে জেনারেট করা অডিও ডেটা পুনরুদ্ধার করতে পারেন, যা সর্বশেষ জেনারেট করা অডিও ব্লকটি রিটার্ন করে (র REST JSON রেসপন্সে, base64-এনকোডেড অডিও steps[].content[].data তে স্টোর করা থাকে)। কনভেনিয়েন্স প্রপার্টি সম্পর্কে বিস্তারিত জানতে, ইন্টারঅ্যাকশন ওভারভিউ দেখুন।
মাল্টি-স্পিকার টিটিএস
একাধিক বক্তার কথোপকথনের জন্য, speech_config.speakers ফাইলে দুজন বক্তাকে কনফিগার করুন এবং প্রতিটি পালাকে একটি পৃথক টেক্সট আইটেম হিসাবে পাঠান, যার সাথে speech_metadata অ্যানোটেশন ব্যবহার করে speaker এবং ঐচ্ছিক পালা-স্তরের style নির্দিষ্ট করতে হবে। স্বাভাবিক পালাবদলের ছন্দের জন্য "mode": "conversational" ব্যবহার করুন।
পাইথন
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": {
"mode": "conversational",
"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: {
mode: 'conversational',
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();
যান
package main
import (
"context"
"encoding/base64"
"encoding/binary"
"log"
"os"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func saveWaveFile(filename string, pcmData []byte) error {
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
sampleRate := uint32(24000)
numChannels := uint16(1)
bitsPerSample := uint16(16)
byteRate := sampleRate * uint32(numChannels) * uint32(bitsPerSample/8)
blockAlign := numChannels * (bitsPerSample / 8)
dataSize := uint32(len(pcmData))
f.WriteString("RIFF")
binary.Write(f, binary.LittleEndian, uint32(36+dataSize))
f.WriteString("WAVEfmt ")
binary.Write(f, binary.LittleEndian, uint32(16))
binary.Write(f, binary.LittleEndian, uint16(1))
binary.Write(f, binary.LittleEndian, numChannels)
binary.Write(f, binary.LittleEndian, sampleRate)
binary.Write(f, binary.LittleEndian, byteRate)
binary.Write(f, binary.LittleEndian, blockAlign)
binary.Write(f, binary.LittleEndian, bitsPerSample)
f.WriteString("data")
binary.Write(f, binary.LittleEndian, dataSize)
_, err = f.Write(pcmData)
return err
}
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
prompt := "TTS the following conversation between Joe and Jane:\n" +
"Joe: How's it going today Jane?\n" +
"Jane: Not too bad, how about you?"
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Speaker: genai.Ptr("Joe"), Voice: genai.Ptr("Kore")},
{Speaker: genai.Ptr("Jane"), Voice: genai.Ptr("Puck")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput(prompt),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
if res.Interaction.OutputAudio != nil && res.Interaction.OutputAudio.Data != nil {
pcmBytes, err := base64.StdEncoding.DecodeString(*res.Interaction.OutputAudio.Data)
if err != nil {
log.Fatal(err)
}
if err := saveWaveFile("out.wav", pcmBytes); err != nil {
log.Fatal(err)
}
}
}
বিশ্রাম
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" }
]
}
}
}'
মেটাডেটা এবং ট্যাগ ব্যবহার করে বক্তৃতার ধরণ নিয়ন্ত্রণ করুন
জেমিনি ৩.৮ টিটিএস 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...")।
বিস্তারিত সর্বোত্তম অনুশীলন জানতে প্রম্পটিং নির্দেশিকা দেখুন।
যান
package main
import (
"context"
"log"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
transcriptRes, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.8-flash"),
Input: interactions.NewInteractionsInput(
"Generate a short transcript around 100 words that reads " +
"like it was clipped from a podcast by excited herpetologists. " +
"The hosts names are Dr. Anya and Liam.",
),
}),
})
if err != nil {
log.Fatal(err)
}
var transcript string
if transcriptRes.Interaction.OutputText != nil {
transcript = *transcriptRes.Interaction.OutputText
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Speaker: genai.Ptr("Dr. Anya"), Voice: genai.Ptr("Kore")},
{Speaker: genai.Ptr("Liam"), Voice: genai.Ptr("Puck")},
})),
}
ttsRes, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput(transcript),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
_ = ttsRes
}
স্ট্রিমিং স্পিচ জেনারেশন
আপনি stream: true সেট করে সিন্থেসাইজ হওয়ার সময়েই তৈরি হওয়া অডিও স্ট্রিম করতে পারেন। ইউনিটারি রিকোয়েস্টের (যা একটি RIFF হেডার সহ একটি সম্পূর্ণ WAV ফাইল রিটার্ন করে) বিপরীতে, স্ট্রিমিং রিকোয়েস্ট ডিফল্টরূপে হেডারবিহীন র 16-বিট সাইনড লিটল-এন্ডিয়ান লিনিয়ার PCM ( audio/l16 , 24 kHz, mono) চাঙ্ক রিটার্ন করে, ফলে কন্টেইনার হেডার ছাড়াই অডিও চাঙ্কগুলো অবিচ্ছিন্নভাবে প্লে বা কনক্যাটিনেট করা যায়।
পাইথন
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
}'
অডিও আউটপুট ফরম্যাট
অনুরোধটি ইউনারি নাকি স্ট্রিমিং, তার উপর নির্ভর করে জেমিনি ৩.৮ টিটিএস মডেলগুলো ভিন্ন ভিন্ন ডিফল্ট অডিও ফরম্যাট ব্যবহার করে:
- একক অনুরোধ (
stream=False): একটি স্ট্যান্ডার্ড RIFF হেডার সহ সম্পূর্ণ WAV (audio/wav) অডিও ফেরত দেয় (২৪ কিলোহার্টজ, মোনো, ১৬-বিট সাইনড লিটল-এন্ডিয়ান পিসিএম)। আপনি ম্যানুয়ালি শুরুতে WAV হেডার যোগ না করেই ডিকোড করা অডিও বাইটগুলো সরাসরি একটি.wavফাইলে সংরক্ষণ করতে পারেন। - স্ট্রিমিং অনুরোধ (
stream=True): ডিফল্টরূপে হেডারবিহীন কাঁচা লিনিয়ার পিসিএম (audio/l16) চাঙ্ক (২৪ কিলোহার্টজ, মোনো, ১৬-বিট সাইনড লিটল-এন্ডিয়ান পিসিএম) ফেরত দেয়, যাতে প্রতিটি চাঙ্কে কন্টেইনার হেডার ছাড়াই চাঙ্কগুলো অবিচ্ছিন্নভাবে স্ট্রিম বা সংযুক্ত করা যায়।
ভিন্ন অডিও এনকোডিং বা স্যাম্পল রেট অনুরোধ করতে, response_format ভিতরে mime_type এবং ঐচ্ছিক sample_rate কনফিগার করুন:
| ফর্ম্যাট | mime_type মান | বর্ণনা |
|---|---|---|
| WAV (একক ডিফল্ট) | "audio/wav" | RIFF হেডার সহ অসংকুচিত WAV ফাইল (১৬-বিট সাইনড লিটল-এন্ডিয়ান PCM, মোনো, ডিফল্ট ২৪ kHz)। ইউনিটারি অনুরোধের জন্য এটিই ডিফল্ট। |
| কাঁচা পিসিএম (এল১৬) (স্ট্রিমিং ডিফল্ট) | "audio/l16" | অসংকুচিত, হেডারবিহীন ১৬-বিট সাইনড লিটল-এন্ডিয়ান লিনিয়ার পিসিএম অডিও (২৪ কিলোহার্টজ, মোনো)। স্ট্রিমিং অনুরোধের জন্য এটিই ডিফল্ট। |
| মু-ল | "audio/mulaw" | ৮-বিট জি.৭১১ মিউ-ল এনকোডেড অডিও (যা সাধারণত উত্তর আমেরিকান এবং জাপানি টেলিফোনি/আইভিআর সিস্টেমে ব্যবহৃত হয়)। |
| একটি আইন | "audio/alaw" | ৮-বিট জি.৭১১ এ-ল এনকোডেড অডিও (যা সাধারণত ইউরোপীয় ও আন্তর্জাতিক টেলিফোনি সিস্টেমে ব্যবহৃত হয়)। |
আপনি sample_rate হার্টজ-এও নির্দিষ্ট করতে পারেন (যেমন, 24000 , 16000 বা 8000 )।
পাইথন
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();
যান
package main
import (
"context"
"encoding/base64"
"log"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Voice: genai.Ptr("Kore")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput("Say cheerfully: Have a wonderful day!"),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
Stream: genai.Ptr(true),
}),
})
if err != nil {
log.Fatal(err)
}
stream := res.InteractionSSEStreamEvent
defer stream.Close()
for stream.Next() {
event := stream.Value()
if stepDelta := event.GetDataStepDelta(); stepDelta != nil {
if audioDelta := stepDelta.GetDeltaAudio(); audioDelta != nil && audioDelta.Data != nil {
audioData, err := base64.StdEncoding.DecodeString(*audioDelta.Data)
if err != nil {
log.Fatal(err)
}
// Process the audio chunk (e.g. play it or write to a file)
_ = audioData
}
}
}
if err := stream.Err(); err != nil {
log.Fatal(err)
}
}
বিশ্রাম
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" }
]
}
}'
ভয়েস বিকল্পগুলি
জেমিনি ৩.৮ টিটিএস চারটি উপায়ে ভয়েস নির্বাচন বা তৈরি করার সুবিধা দেয়:
- পূর্ব-নির্মিত স্টুডিও ভয়েস: নিম্নলিখিত সারণীতে তালিকাভুক্ত ৩০টি নির্বাচিত ভয়েস।
- বর্ধিত ভয়েস লাইব্রেরি: বিভিন্ন ভাষা, উচ্চারণভঙ্গি এবং চরিত্রের ধরনের শত শত অতিরিক্ত কণ্ঠস্বর, যা
client.voices.list()(GET /v1beta/voices) ব্যবহার করে অ্যাক্সেস করা যায়। - ভয়েস ডিজাইন : গুগল এআই স্টুডিওতে স্বাভাবিক ভাষার বর্ণনা থেকে অথবা
POST /v1beta/voices(type="prompted"ব্যবহার করে একটি কাস্টম ভোকাল পার্সোনা তৈরি করুন, যা একটি স্থায়ীvoice_...ID এবংCreateVoiceওGetVoiceএ একটিsample_audioWAV প্রিভিউ রিটার্ন করে। - ভয়েস রেপ্লিকেশন : গুগল এআই স্টুডিওতে রেফারেন্স এবং কনসেন্ট অডিও থেকে অথবা
POST /v1beta/voicesব্যবহার করে একজন স্পিকারের ভয়েস রেপ্লিকেট করুন (type="replicated", ডিফল্টরূপে persistentstore=Trueঅথবা ঐচ্ছিক statelessstore=False)।
কাস্টম ভয়েস সীমা এবং TTL
| কণ্ঠস্বরের ধরণ | স্টোরেজ মোড | কোটা / সীমা | ধরে রাখা (TTL) |
|---|---|---|---|
স্টেটফুল ভয়েস ( voice_... , প্রম্পটেড বা রেপ্লিকেটেড) | store=True | প্রতিটি প্রকল্পে ২০০টি কণ্ঠস্বর (প্রেরিত এবং অনুলিখিত কণ্ঠস্বরের মধ্যে ভাগ করা) | ১ বছর |
স্টেটলেস ভয়েস কী ( voicekey_... , প্রতিলিপিকৃত) | store=False | ক্লায়েন্ট-পরিচালিত | ৭ দিন |
পূর্ব-নির্মিত কণ্ঠস্বর
| জেফির -- ব্রাইট | পাক -- উচ্ছ্বসিত | চারন -- তথ্যমূলক |
| কোর -- ফার্ম | ফেনরির -- উত্তেজিত | লেডা -- যুবতী |
| ওরুস -- ফার্ম | Aoede -- Breezy | ক্যালিরো -- সহজ-সরল |
| Autonoe -- Bright | এনসেলাডাস -- শ্বাসপ্রশ্বাসযুক্ত | আইপেটাস -- পরিষ্কার |
| উমব্রিয়েল -- সহজ-সরল | আলজিবা -- মসৃণ | ডেসপিনা -- মসৃণ |
| এরিনোম -- পরিষ্কার | অ্যালজেনিব -- গ্র্যাভেলি | রসলগেথি -- তথ্যমূলক |
| লাওমেডিয়া -- উচ্ছ্বসিত | আখেরনার -- নরম | আলনিলাম -- ফার্ম |
| শেডার -- এমনকি | গ্যাক্রাক্স -- পরিপক্ক | পুলচেরিমা -- ফরোয়ার্ড |
| আচির্ড -- বন্ধুত্বপূর্ণ | Zubenelgenubi -- Casual | ভিন্ডেমিয়াট্রিক্স -- কোমল |
| সাদাচবিয়া -- প্রাণবন্ত | সাদালটেগার -- জ্ঞানী | সুলাফাত -- উষ্ণ |
বর্ধিত ভয়েস লাইব্রেরি এবং ফিল্টারিং
পূর্ববর্তী সারণীতে উল্লেখিত ৩০টি স্টুডিও ভয়েস ছাড়াও, এক্সটেন্ডেড ভয়েস লাইব্রেরিতে বিভিন্ন ভাষা, আঞ্চলিক উচ্চারণ, চরিত্রের ধরণ এবং ডোমেন জুড়ে শত শত অতিরিক্ত ভয়েস রয়েছে। আপনি গুগল এআই স্টুডিও -তে সম্পূর্ণ ভয়েস লাইব্রেরিটি ইন্টারেক্টিভভাবে ব্রাউজ, ফিল্টার এবং অডিশন করতে পারেন, অথবা 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 (পাইথনে type_ ) | list[str] | ভয়েস সোর্স অনুযায়ী ফিল্টার করুন: "prebuilt" , "prompted" ( ভয়েস ডিজাইন ), অথবা "replicated" ( ভয়েস রেপ্লিকেশন )। |
search | str | ফ্রি-টেক্সট সাবস্ট্রিং সার্চ display_name এবং description উভয়ের ক্ষেত্রেই কেস-ইনসেনসিটিভভাবে ম্যাচ করেছে। |
page_size | int | প্রতি পৃষ্ঠায় ফেরত আসা কণ্ঠস্বরের সর্বোচ্চ সংখ্যা (ডিফল্ট 50 , সর্বোচ্চ 1000 )। |
page_token | str | ফলাফলের পরবর্তী পৃষ্ঠা আনার জন্য response.next_page_token থেকে টোকেন। |
পাইথন
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"
সমর্থিত ভাষা
টিটিএস মডেলগুলো ইনপুট ভাষা স্বয়ংক্রিয়ভাবে শনাক্ত করে। জেমিনি ৩.৮ ফ্ল্যাশ টিটিএস ( gemini-3.8-flash-tts ) ১৩০টিরও বেশি ভাষা সমর্থন করে এবং জেমিনি ৩.৮ ফ্ল্যাশ-লাইট টিটিএস ( gemini-3.8-flash-lite-tts ) ১০০টিরও বেশি ভাষা সমর্থন করে।
| ভাষা | জেমিনি ৩.৮ ফ্ল্যাশ টিটিএস | জেমিনি ৩.৮ ফ্ল্যাশ-লাইট টিটিএস |
|---|---|---|
| আচেহনিজ (আরবি লিপি) | ✔️ | ✔️ |
| আফ্রিকান | ✔️ | ✔️ |
| আকান | ✔️ | ✔️ |
| আমহারিক | ✔️ | ✔️ |
| আর্মেনীয় | ✔️ | ✔️ |
| অসমীয়া | ✔️ | ✔️ |
| অবধী | ✔️ | ✔️ |
| বালিনিজ | ✔️ | ✔️ |
| বাংলা | ✔️ | ✔️ |
| বানজার (আরবি লিপি) | ✔️ | — |
| বানজার (ল্যাটিন লিপি) | ✔️ | ✔️ |
| বাশকির | ✔️ | — |
| বাস্ক | ✔️ | ✔️ |
| বেলারুশীয় | ✔️ | ✔️ |
| বেম্বা | ✔️ | — |
| ভোজপুরি | ✔️ | ✔️ |
| বসনীয় | ✔️ | ✔️ |
| বুগিনিজ | ✔️ | ✔️ |
| বুলগেরীয় | ✔️ | ✔️ |
| বর্মী | ✔️ | — |
| ক্যান্টনিজ | ✔️ | ✔️ |
| কাতালান | ✔️ | ✔️ |
| সেবুয়ানো | ✔️ | ✔️ |
| কেন্দ্রীয় কুর্দিশ | ✔️ | ✔️ |
| ছত্তিশগড়ী | ✔️ | ✔️ |
| চীনা (হ্যান্স লিপি) | ✔️ | ✔️ |
| চীনা (হান্ট লিপি) | ✔️ | ✔️ |
| ক্রিমিয়ান তাতার | ✔️ | — |
| ক্রোয়েশীয় | ✔️ | ✔️ |
| চেক | ✔️ | ✔️ |
| ড্যানিশ | ✔️ | ✔️ |
| ডাচ | ✔️ | ✔️ |
| ডাইলা | ✔️ | — |
| জংখা | ✔️ | — |
| মিশরীয় আরবি | ✔️ | ✔️ |
| ইংরেজি | ✔️ | ✔️ |
| এস্তোনিয়ান | ✔️ | ✔️ |
| ফিলিপিনো | ✔️ | ✔️ |
| ফিনিশ | ✔️ | — |
| ফরাসি | ✔️ | ✔️ |
| গ্যালিসিয়ান | ✔️ | ✔️ |
| গান্ডা | ✔️ | ✔️ |
| জর্জিয়ান | ✔️ | ✔️ |
| জার্মান | ✔️ | ✔️ |
| গ্রীক | ✔️ | ✔️ |
| গুয়ারানি | ✔️ | — |
| গুজরাটি | ✔️ | ✔️ |
| হাইতিয়ান ক্রেওল | ✔️ | ✔️ |
| হালহ মঙ্গোলিয়ান | ✔️ | ✔️ |
| হাউসা | ✔️ | ✔️ |
| হিব্রু | ✔️ | ✔️ |
| হিন্দি | ✔️ | ✔️ |
| হাঙ্গেরীয় | ✔️ | ✔️ |
| আইসল্যান্ডীয় | ✔️ | ✔️ |
| ইগবো | ✔️ | — |
| ইলোকো | ✔️ | ✔️ |
| ইন্দোনেশিয়ান | ✔️ | ✔️ |
| ইরানি ফার্সি | ✔️ | ✔️ |
| ইতালীয় | ✔️ | ✔️ |
| জাপানি | ✔️ | ✔️ |
| জাভানিজ | ✔️ | ✔️ |
| কাবাইল | ✔️ | — |
| কাম্বা | ✔️ | ✔️ |
| কন্নড় | ✔️ | ✔️ |
| কাশ্মীরি (আরবি লিপি) | ✔️ | ✔️ |
| কাশ্মীরি (দেব লিপি) | ✔️ | ✔️ |
| কাজাখ | ✔️ | ✔️ |
| খেমার | ✔️ | ✔️ |
| কিকুয়ু | ✔️ | ✔️ |
| কিনিয়ারওয়ান্ডা | ✔️ | ✔️ |
| কঙ্গো | ✔️ | ✔️ |
| কোরিয়ান | ✔️ | ✔️ |
| কিরগিজ | ✔️ | ✔️ |
| লাও | ✔️ | ✔️ |
| লাটগালিয়ান | ✔️ | — |
| লিঙ্গালা | ✔️ | ✔️ |
| লিথুয়ানিয়ান | ✔️ | — |
| লুক্সেমবার্গীয় | ✔️ | — |
| ম্যাসিডোনিয়ান | ✔️ | ✔️ |
| মাগাহি | ✔️ | ✔️ |
| মৈথিলী | ✔️ | ✔️ |
| মালয়ালম | ✔️ | ✔️ |
| মাল্টিজ | ✔️ | ✔️ |
| মণিপুরি | ✔️ | ✔️ |
| মারাঠি | ✔️ | ✔️ |
| মিনাংকাবাউ (আরবি লিপি) | ✔️ | ✔️ |
| মিনাংকাবাউ (ল্যাটিন লিপি) | ✔️ | — |
| মিজো | ✔️ | ✔️ |
| নেপালি (ব্যক্তিগত ভাষা) | ✔️ | ✔️ |
| নাইজেরিয়ান ফুলফুলডে | ✔️ | ✔️ |
| উত্তর আজারবাইজানীয় | ✔️ | ✔️ |
| উত্তর সোথো | ✔️ | ✔️ |
| উত্তর উজবেক | ✔️ | ✔️ |
| নরওয়েজিয়ান বোকমাল | ✔️ | ✔️ |
| নরওয়েজিয়ান নিনরস্ক | ✔️ | ✔️ |
| নিয়ানজা | ✔️ | ✔️ |
| অক্সিটান | ✔️ | — |
| ওড়িয়া (ব্যক্তিগত ভাষা) | ✔️ | ✔️ |
| পাঙ্গাসিনান | ✔️ | — |
| ফার্সি (আফগানিস্তান) | ✔️ | ✔️ |
| পোলিশ | ✔️ | ✔️ |
| পর্তুগিজ | ✔️ | ✔️ |
| পাঞ্জাবি | ✔️ | ✔️ |
| রোমানিয়ান | ✔️ | ✔️ |
| রাশিয়ান | ✔️ | ✔️ |
| সাঁওতালি | ✔️ | ✔️ |
| সার্বিয়ান | ✔️ | ✔️ |
| সিন্ধি | ✔️ | — |
| সিংহলী | ✔️ | ✔️ |
| স্লোভাক | ✔️ | ✔️ |
| স্লোভেনীয় | ✔️ | — |
| সোমালি | ✔️ | — |
| দক্ষিণ আজারবাইজানীয় | ✔️ | ✔️ |
| দক্ষিণ পশতু | ✔️ | ✔️ |
| দক্ষিণ সোথো | ✔️ | — |
| স্প্যানিশ | ✔️ | ✔️ |
| প্রমিত আরবি (আরবি লিপি) | ✔️ | ✔️ |
| প্রমিত আরবি (ল্যাটিন লিপি) | ✔️ | ✔️ |
| প্রমিত লাতভিয়ান | ✔️ | ✔️ |
| প্রমিত মালয় | ✔️ | ✔️ |
| সোয়াহিলি (ব্যক্তিগত ভাষা) | ✔️ | — |
| স্বাতী | ✔️ | — |
| সুইডিশ | ✔️ | — |
| তাজিক | ✔️ | — |
| তামিল | ✔️ | ✔️ |
| তেলুগু | ✔️ | ✔️ |
| থাই | ✔️ | — |
| তিগ্রিনিয়া | ✔️ | — |
| তোস্ক আলবেনিয়ান | ✔️ | — |
| তুর্কি | ✔️ | ✔️ |
| উইঘুর | ✔️ | — |
| ভিয়েতনামী | ✔️ | ✔️ |
সমর্থিত মডেল
| মডেল | একক বক্তা | মাল্টি-স্পিকার | ভয়েস ডিজাইন | কণ্ঠস্বর প্রতিলিপি |
|---|---|---|---|---|
জেমিনি ৩.৮ ফ্ল্যাশ টিটিএস ( gemini-3.8-flash-tts ) | ✔️ | ✔️ | ✔️ | ✔️ |
জেমিনি ৩.৮ ফ্ল্যাশ-লাইট টিটিএস ( gemini-3.8-flash-lite-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-এ স্থানান্তরিত হন:
- টার্ন-লেভেল নির্দেশনাগুলো
speech_metadata-তে স্থানান্তর করুন: জেমিনি ৩.৮ টিটিএস ইনপুট টেক্সটকে কঠোরভাবে একটি হুবহু ট্রান্সক্রিপ্ট হিসেবে বিবেচনা করে। দীর্ঘায়িত ডেলিভারি নির্দেশাবলী (style—যেমন"whispering","out of breath", বা"speaking slowly") এবং স্পিকার লেবেল (speaker) ট্রান্সক্রিপ্ট টেক্সটে স্টেজ নির্দেশনা এম্বেড করার পরিবর্তে স্ট্রাকচার্ডspeech_metadataঅ্যানোটেশনে স্থানান্তর করুন। - শুধুমাত্র নির্দিষ্ট সময়ের বাচনিক ঘটনার জন্য অ্যাঙ্গেল-ব্র্যাকেট ইনলাইন ট্যাগ ব্যবহার করুন: ক্ষণস্থায়ী অ-কথ্য শব্দ এবং বিরতিগুলোকে ট্রান্সক্রিপ্টের মধ্যে অ্যাঙ্গেল ব্র্যাকেট ব্যবহার করে ইনলাইনে রাখুন (যেমন
<laugh>,<sigh>,<cough>,<breath>, বা<short pause>)। সাউন্ড-ইফেক্ট ট্যাগ (যেমন হাততালি বা ধপাস শব্দ) পরিহার করুন এবং ডেলিভারি স্টাইলspeech_metadata.styleএ রাখুন। - একাধিক বক্তার অনুরোধে প্রতিটি ধাপে
speakerনির্দিষ্ট করুন: একাধিক বক্তার অনুরোধের প্রতিটি ধাপে, কনফিগার করা বক্তাদের মধ্যে একজনের সাথে মিল রেখেspeech_metadataভিতরেspeakerস্পষ্টভাবে অন্তর্ভুক্ত করতে হবে। - ভয়েস ডিজাইন ব্যবহার করে শুরুতেই পারসোনা ডিজাইন করুন: একাধিক অনুচ্ছেদযুক্ত
"Audio Profile"বা"Director's Notes"ব্লকগুলিকে ভয়েস ডিজাইনে তৈরি একটি কাস্টম ভয়েস দিয়ে প্রতিস্থাপন করুন, তারপর ন্যূনতম বা খালিstyleস্ট্রিং ব্যবহার করে আপনার টিটিএস অনুরোধগুলিতে সেইvoice_...আইডিটি প্রয়োগ করুন। - ইউনারি রিকোয়েস্টের ক্ষেত্রে ডিফল্ট WAV (
audio/wav) আউটপুটের বিষয়টি বিবেচনা করুন:gemini-3.1-flash-tts-previewএবং পূর্ববর্তী TTS মডেলগুলির (যেগুলি ডিফল্টরূপে হেডারবিহীন র PCMaudio/l16রিটার্ন করত) থেকে ভিন্ন, Gemini 3.8 TTS ইউনারি রিকোয়েস্টের জন্য ডিফল্টরূপে একটি স্ট্যান্ডার্ড RIFF হেডার সহ WAV অডিও (audio/wav) রিটার্ন করে।- যদি আপনার কোড আগে সরাসরি PCM বাইটগুলোকে একটি WAV হেডারে মুড়ে দিয়ে থাকে (উদাহরণস্বরূপ, পাইথনের
waveমডিউল বাffmpegব্যবহার করে), তাহলে সেই ম্যানুয়াল হেডার র্যাপারটি সরিয়ে ফেলুন এবং ফেরত আসা বাইটগুলো সরাসরি একটি.wavফাইলে লিখুন। - আপনার পাইপলাইনে যদি হেডারবিহীন র PCM, mu-law, বা A-law অডিওর প্রয়োজন হয়, তাহলে স্পষ্টভাবে
response_format"audio/l16","audio/mulaw", বা"audio/alaw"এ সেট করুন। অডিও আউটপুট ফরম্যাটগুলো দেখুন।
- যদি আপনার কোড আগে সরাসরি PCM বাইটগুলোকে একটি WAV হেডারে মুড়ে দিয়ে থাকে (উদাহরণস্বরূপ, পাইথনের
প্রম্পটিং গাইড
জেমিনি ৩.৮ টিটিএস মডেলগুলো ইনপুট টেক্সটকে কঠোরভাবে একটি হুবহু প্রতিলিপি হিসেবে বিবেচনা করে। পূর্ববর্তী প্রিভিউ মডেলগুলোর মতো নয়, যেখানে মঞ্চ নির্দেশনাগুলো সাধারণ টেক্সটের মধ্যে এমবেড করা থাকতো, জেমিনি ৩.৮ টিটিএস ধারাবাহিক টার্ন-লেভেল নির্দেশনা ( speech_metadata ) এবং নির্দিষ্ট সময়ের ইনলাইন ভোকাল ট্যাগগুলোকে আলাদা করে।
স্টাইল ফিল্ড বনাম ইনলাইন ট্যাগ
আপনার কর্মসম্পাদন নির্দেশাবলী পরিধি অনুসারে ভাগ করুন:
- পালা-ভিত্তিক বাচনভঙ্গি (
speech_metadata.style): বাচনভঙ্গির ধারাবাহিক বৈশিষ্ট্যগুলো—যেমন আবেগ, স্বরভঙ্গি, সামগ্রিক গতি, বা বাচনভঙ্গি (যেমন"whispering","out of breath","muttering", বা"sarcastic")—speech_metadataএরstyleফিল্ডে রাখুন। বিভিন্ন পালা জুড়ে একটি স্থিতিশীল চরিত্র এবং পারফরম্যান্স তৈরি করতে, ভয়েস ডিজাইনে শুরুতেই পার্সোনাটি ডিজাইন করুন এবং শুধুমাত্র পালা-ভিত্তিক ঐচ্ছিক ছোটখাটো পরিবর্তনের জন্য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"সেট করুন।
স্বরবিন্যাস এবং পিচ
একটি টার্ন জুড়ে স্বরপ্রক্ষেপ, পিচ এবং স্বরভঙ্গি নিয়ন্ত্রণ করতে speech_metadata.style ব্যবহার করুন (উদাহরণস্বরূপ, "style": "high pitch, cheerful and excited inflection" অথবা "style": "monotone and flat" )। যদি সংলাপের মাঝখানে আবেগ বা স্বরপ্রক্ষেপ পরিবর্তিত হয়, তবে স্ক্রিপ্টটিকে আলাদা টার্নে ভাগ করুন এবং প্রতিটি টার্নের জন্য স্বতন্ত্র 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_...তৈরি করুন, এবং তারপর আপনার টিটিএস কলগুলোতে সেই ভয়েস আইডিটি ব্যবহার করুন। - স্থিতিশীলতার জন্য ভয়েস রেফারেন্সের উপর নির্ভর করুন (মেটা-নির্দেশাবলী বাদ দিন): জেমিনি ৩.৮ টিটিএস মডেলগুলোকে প্রথমে অডিও রেফারেন্সের উপর ভিত্তি করে স্থির হতে প্রশিক্ষণ দেওয়া হয়। মডেলকে কণ্ঠস্বর স্থির রাখতে বলার মতো কোনো নির্দেশাবলী অন্তর্ভুক্ত করবেন না (যেমন
"do not switch speaker identity"বা"maintain identical timbre")—অতিরিক্ত প্রম্পট টেক্সট কণ্ঠস্বরের বিচ্যুতি বাড়ায়। অপ্রয়োজনীয় স্টাইল নির্দেশাবলী বাদ দিন এবং ভয়েস রেফারেন্স দ্বারা প্রদত্ত স্থিতিশীল বিন্দুর চারপাশে মডেলকে স্বাভাবিকভাবে পরিবর্তিত হতে দিন। -
styleমাধ্যমে বক্তার অপরিবর্তনীয় বৈশিষ্ট্য পরিবর্তন করার চেষ্টা করবেন না:speech_metadata.styleএ বয়স, লিঙ্গ, নাম বা স্থায়ী উচ্চারণ পরিবর্তন অন্তর্ভুক্ত করা থেকে বিরত থাকুন। এর পরিবর্তে, এক্সটেন্ডেড ভয়েস লাইব্রেরি থেকে একটি আঞ্চলিক কণ্ঠস্বর বেছে নিন অথবা ভয়েস ডিজাইন ব্যবহার করে একটি তৈরি করুন।
প্রস্তাবিত কর্মপ্রবাহ
- চরিত্রটি একবারই তৈরি করুন: ভয়েস ডিজাইনে আপনার চরিত্রটি তৈরি করুন অথবা এক্সটেন্ডেড ভয়েস লাইব্রেরি থেকে আপনার লক্ষ্য ভাষা ও ব্যক্তিত্বের সাথে মেলে এমন একটি আঞ্চলিক ভয়েস বেছে নিন।
- কথার জড়তা সহ স্বাভাবিক কথোপকথনের প্রতিলিপি লিখুন: সর্বোচ্চ স্বাভাবিকতার জন্য,
textএকটি বাস্তব কথোপকথনের প্রতিলিপির মতো করে লিখুন—যার মধ্যে স্বাভাবিক কথোপকথনের জড়তা এবং দ্বিধা অন্তর্ভুক্ত থাকবে (উদাহরণস্বরূপ,"Oh uh yeah I think... hm, so that's interesting")। - প্রথমে সাধারণ টিটিএস (TTS) পরীক্ষা করুন: প্রথমে একটি খালি
styleফিল্ড ব্যবহার করে আপনার ট্রান্সক্রিপ্টটি তৈরি করুন—বেশিরভাগ অনুরোধের জন্য কোনোstyleনির্দেশনার প্রয়োজন হয় না। - শুধুমাত্র ছোটখাটো পরিবর্তনের জন্য সংক্ষিপ্ত
styleপ্রম্পট যোগ করুন: শুধুমাত্র যে টার্নগুলোতে নির্দিষ্ট ডেলিভারি সমন্বয়ের প্রয়োজন, সেগুলোর জন্য একটি সংক্ষিপ্তstyleস্ট্রিং (যেমন"casual, friendly"বা"muttering, then reassuring") যোগ করুন, এবং যখন আপনি একটি সামঞ্জস্যপূর্ণ বেসলাইন চান, তখন টার্নজুড়ে ঠিক সেই সংক্ষিপ্ত স্ট্রিংটিই পুনরায় ব্যবহার করুন।
একাধিক পালা সংলাপ এবং ভয়েস এজেন্ট
রিয়েল-টাইম কথোপকথনমূলক ভয়েস এজেন্ট বা মাল্টি-টার্ন অ্যাপ্লিকেশন তৈরি করার সময়:
- এলএলএম টেক্সট খণ্ডগুলো আসার সাথে সাথে প্রতি পালায় একটি করে টিটিএস কল করুন।
- কনফিগার করা
voice(পূর্ব-নির্মিত, ডিজাইন করাvoice_..., অথবা প্রতিলিপিকৃতvoice_.../voicekey_...) পালাক্রমে বক্তার পরিচয় বহন করুক—প্রতি পালায় কখনও একটি দীর্ঘ চরিত্রের অবয়ব পুনরায় পাঠাবেন না। - প্রতি-পালা
styleক্ষেত্রটি খালি রাখুন, অথবা পুরো কথোপকথনের জন্য একটি সংক্ষিপ্ত ধ্রুবক স্ট্রিং (যেমন"casual, friendly") পাঠান। - আরও জোরালো শৈলীগত নির্দেশনার সাহায্য না নিয়ে, এজেন্টের দীর্ঘ প্রতিক্রিয়াগুলোকে ছোট ছোট অংশে ভাগ করুন।
সীমাবদ্ধতা
- টিটিএস মডেলগুলো শুধুমাত্র টেক্সট ইনপুট গ্রহণ করে এবং শুধুমাত্র অডিও আউটপুট তৈরি করে।
- একক-অনুরোধে একাধিক-স্পিকার তৈরি (
speech_config.speakers) পূর্ব-নির্মিত ভয়েস ব্যবহার করে ২ জন পর্যন্ত স্পিকারকে সমর্থন করে। একাধিক চরিত্রের সংলাপে কাস্টম ডিজাইন করা (voice_...) বা প্রতিলিপিকৃত (voice_.../voicekey_...) ভয়েস একত্রিত করতে, প্রতিটি স্পিকারের পালা আলাদাভাবে সংশ্লেষণ করুন। যেহেতু ইউনিটারি অনুরোধগুলি ডিফল্টরূপে একটি ৪৪-বাইট RIFF হেডার সহaudio/wavফেরত দেয়, তাই র PCM ({"type": "audio", "mime_type": "audio/l16"}) অনুরোধ করুন অথবা ২৪kHz PCM অডিও ফ্রেমগুলি সংযুক্ত করার আগে প্রতিটি পালা থেকে WAV হেডারটি সরিয়ে ফেলুন। - কাস্টম ভয়েস স্টোরেজ সীমা এবং TTL:
- স্টেটফুল ভয়েস (
store=True, প্রম্পটেড বা রেপ্লিকেটেড): প্রতি প্রজেক্টে সর্বোচ্চ ২০০টি ভয়েস, যার টিটিএল (টাইম-টু-লিভ) ১ বছর । - স্টেটলেস ভয়েস কী (
store=False,voicekey_...): ৭-দিনের টিটিএল (টাইম-টু-লিভ)।
- স্টেটফুল ভয়েস (
- ভাষাগত কভারেজ জানতে সমর্থিত ভাষা বিভাগটি পর্যালোচনা করুন।
এরপর কী?
- ভয়েস ডিজাইন-এর সাহায্যে স্বাভাবিক ভাষা থেকে নিজস্ব ভোকাল পারসোনা তৈরি করুন।
- ভয়েস রেপ্লিকেশন- এর মাধ্যমে বিদ্যমান কোনো বক্তার কণ্ঠস্বর অনুকরণ করুন।
- Gemini 3.8 Flash TTS এবং Gemini 3.8 Flash-Lite TTS মডেল পেজগুলোতে মডেলের স্পেসিফিকেশন তুলনা করুন।
- Live API- এর মাধ্যমে ইন্টারেক্টিভ দ্বিমুখী অডিও অন্বেষণ করুন।
জেমিনি এপিআই, জেমিনির টেক্সট-টু-স্পিচ (টিটিএস) জেনারেশন ক্ষমতা ব্যবহার করে টেক্সট ইনপুটকে একক-বক্তা বা একাধিক-বক্তার অডিওতে রূপান্তর করতে পারে। টেক্সট-টু-স্পিচ জেনারেশন নিয়ন্ত্রণযোগ্য , যার অর্থ হলো আপনি অডিওর স্টাইল , উচ্চারণ , গতি এবং সুর নিয়ন্ত্রণ করার জন্য স্ট্রাকচার্ড টার্ন মেটাডেটা ( speech_metadata ) এবং ইনলাইন ভোকাল ট্যাগ একত্রিত করতে পারেন।
টিটিএস (TTS) সক্ষমতাটি লাইভ এপিআই (Live API) -এর মাধ্যমে প্রদত্ত স্পিচ জেনারেশন থেকে ভিন্ন, যা ইন্টারেক্টিভ, কাঠামোবিহীন অডিও এবং মাল্টিমোডাল ইনপুট ও আউটপুটের জন্য ডিজাইন করা হয়েছে। যেখানে লাইভ এপিআই গতিশীল কথোপকথনের প্রেক্ষাপটে বিশেষভাবে পারদর্শী, সেখানে জেমিনি এপিআই (Gemini API)-এর মাধ্যমে টিটিএস এমন সব পরিস্থিতির জন্য বিশেষভাবে তৈরি করা হয়েছে যেখানে স্টাইল ও সাউন্ডের উপর সূক্ষ্ম নিয়ন্ত্রণের সাথে হুবহু টেক্সট আবৃত্তির প্রয়োজন হয়, যেমন পডকাস্ট বা অডিওবুক তৈরি।
এই নির্দেশিকাটি আপনাকে দেখাবে কিভাবে 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 TTS মডেল ব্যবহার করে টেক্সটকে একক-বক্তার অডিওতে রূপান্তর করতে, input হুবহু ট্রান্সক্রিপ্টটি দিন, speech_metadata অ্যানোটেশন ব্যবহার করে টার্ন-লেভেল স্টাইলিং সংযুক্ত করুন এবং generation_config.speech_config ফাইলে আপনার ভয়েস কনফিগার করুন। আপনি আগে থেকে তৈরি ভয়েস অপশন , এক্সটেন্ডেড ভয়েস লাইব্রেরি ( GET /v1beta/voices ), একটি কাস্টম ভয়েস ডিজাইন আইডি ( voice_... ), অথবা একটি ভয়েস রেপ্লিকেশন আইডি ( voice_... , বা ঐচ্ছিক স্টেটলেস voicekey_... ) থেকে একটি ভয়েস বেছে নিতে পারেন।
এই উদাহরণটি মডেল থেকে ডিফল্ট WAV আউটপুট অডিও ( audio/wav ) সরাসরি একটি ফাইলে সংরক্ষণ করে:
পাইথন
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();
যান
package main
import (
"context"
"encoding/base64"
"encoding/binary"
"log"
"os"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func saveWaveFile(filename string, pcmData []byte) error {
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
sampleRate := uint32(24000)
numChannels := uint16(1)
bitsPerSample := uint16(16)
byteRate := sampleRate * uint32(numChannels) * uint32(bitsPerSample/8)
blockAlign := numChannels * (bitsPerSample / 8)
dataSize := uint32(len(pcmData))
f.WriteString("RIFF")
binary.Write(f, binary.LittleEndian, uint32(36+dataSize))
f.WriteString("WAVEfmt ")
binary.Write(f, binary.LittleEndian, uint32(16))
binary.Write(f, binary.LittleEndian, uint16(1))
binary.Write(f, binary.LittleEndian, numChannels)
binary.Write(f, binary.LittleEndian, sampleRate)
binary.Write(f, binary.LittleEndian, byteRate)
binary.Write(f, binary.LittleEndian, blockAlign)
binary.Write(f, binary.LittleEndian, bitsPerSample)
f.WriteString("data")
binary.Write(f, binary.LittleEndian, dataSize)
_, err = f.Write(pcmData)
return err
}
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Voice: genai.Ptr("Kore")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput("Say cheerfully: Have a wonderful day!"),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
if res.Interaction.OutputAudio != nil && res.Interaction.OutputAudio.Data != nil {
pcmBytes, err := base64.StdEncoding.DecodeString(*res.Interaction.OutputAudio.Data)
if err != nil {
log.Fatal(err)
}
if err := saveWaveFile("out.wav", pcmBytes); err != nil {
log.Fatal(err)
}
}
}
বিশ্রাম
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
পাইথন এবং জাভাস্ক্রিপ্ট SDK-তে, আপনি interaction.output_audio কনভেনিয়েন্স প্রপার্টি ব্যবহার করে জেনারেট করা অডিও ডেটা পুনরুদ্ধার করতে পারেন, যা সর্বশেষ জেনারেট করা অডিও ব্লকটি রিটার্ন করে (র REST JSON রেসপন্সে, base64-এনকোডেড অডিও steps[].content[].data তে স্টোর করা থাকে)। কনভেনিয়েন্স প্রপার্টি সম্পর্কে বিস্তারিত জানতে, ইন্টারঅ্যাকশন ওভারভিউ দেখুন।
মাল্টি-স্পিকার টিটিএস
একাধিক বক্তার কথোপকথনের জন্য, speech_config.speakers ফাইলে দুজন বক্তাকে কনফিগার করুন এবং প্রতিটি পালাকে একটি পৃথক টেক্সট আইটেম হিসাবে পাঠান, যার সাথে speech_metadata অ্যানোটেশন ব্যবহার করে speaker এবং ঐচ্ছিক পালা-স্তরের style নির্দিষ্ট করতে হবে। স্বাভাবিক পালাবদলের ছন্দের জন্য "mode": "conversational" ব্যবহার করুন।
পাইথন
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": {
"mode": "conversational",
"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: {
mode: 'conversational',
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();
যান
package main
import (
"context"
"encoding/base64"
"encoding/binary"
"log"
"os"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func saveWaveFile(filename string, pcmData []byte) error {
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
sampleRate := uint32(24000)
numChannels := uint16(1)
bitsPerSample := uint16(16)
byteRate := sampleRate * uint32(numChannels) * uint32(bitsPerSample/8)
blockAlign := numChannels * (bitsPerSample / 8)
dataSize := uint32(len(pcmData))
f.WriteString("RIFF")
binary.Write(f, binary.LittleEndian, uint32(36+dataSize))
f.WriteString("WAVEfmt ")
binary.Write(f, binary.LittleEndian, uint32(16))
binary.Write(f, binary.LittleEndian, uint16(1))
binary.Write(f, binary.LittleEndian, numChannels)
binary.Write(f, binary.LittleEndian, sampleRate)
binary.Write(f, binary.LittleEndian, byteRate)
binary.Write(f, binary.LittleEndian, blockAlign)
binary.Write(f, binary.LittleEndian, bitsPerSample)
f.WriteString("data")
binary.Write(f, binary.LittleEndian, dataSize)
_, err = f.Write(pcmData)
return err
}
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
prompt := "TTS the following conversation between Joe and Jane:\n" +
"Joe: How's it going today Jane?\n" +
"Jane: Not too bad, how about you?"
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Speaker: genai.Ptr("Joe"), Voice: genai.Ptr("Kore")},
{Speaker: genai.Ptr("Jane"), Voice: genai.Ptr("Puck")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput(prompt),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
if res.Interaction.OutputAudio != nil && res.Interaction.OutputAudio.Data != nil {
pcmBytes, err := base64.StdEncoding.DecodeString(*res.Interaction.OutputAudio.Data)
if err != nil {
log.Fatal(err)
}
if err := saveWaveFile("out.wav", pcmBytes); err != nil {
log.Fatal(err)
}
}
}
বিশ্রাম
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" }
]
}
}
}'
মেটাডেটা এবং ট্যাগ ব্যবহার করে বক্তৃতার ধরণ নিয়ন্ত্রণ করুন
জেমিনি ৩.৮ টিটিএস 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...")।
বিস্তারিত সর্বোত্তম অনুশীলন জানতে প্রম্পটিং নির্দেশিকা দেখুন।
যান
package main
import (
"context"
"log"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
transcriptRes, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.8-flash"),
Input: interactions.NewInteractionsInput(
"Generate a short transcript around 100 words that reads " +
"like it was clipped from a podcast by excited herpetologists. " +
"The hosts names are Dr. Anya and Liam.",
),
}),
})
if err != nil {
log.Fatal(err)
}
var transcript string
if transcriptRes.Interaction.OutputText != nil {
transcript = *transcriptRes.Interaction.OutputText
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Speaker: genai.Ptr("Dr. Anya"), Voice: genai.Ptr("Kore")},
{Speaker: genai.Ptr("Liam"), Voice: genai.Ptr("Puck")},
})),
}
ttsRes, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput(transcript),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
_ = ttsRes
}
স্ট্রিমিং স্পিচ জেনারেশন
আপনি stream: true সেট করে সিন্থেসাইজ হওয়ার সময়েই তৈরি হওয়া অডিও স্ট্রিম করতে পারেন। ইউনিটারি রিকোয়েস্টের (যা একটি RIFF হেডার সহ একটি সম্পূর্ণ WAV ফাইল রিটার্ন করে) বিপরীতে, স্ট্রিমিং রিকোয়েস্ট ডিফল্টরূপে হেডারবিহীন র 16-বিট সাইনড লিটল-এন্ডিয়ান লিনিয়ার PCM ( audio/l16 , 24 kHz, mono) চাঙ্ক রিটার্ন করে, ফলে কন্টেইনার হেডার ছাড়াই অডিও চাঙ্কগুলো অবিচ্ছিন্নভাবে প্লে বা কনক্যাটিনেট করা যায়।
পাইথন
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
}'
অডিও আউটপুট ফরম্যাট
অনুরোধটি ইউনারি নাকি স্ট্রিমিং, তার উপর নির্ভর করে জেমিনি ৩.৮ টিটিএস মডেলগুলো ভিন্ন ভিন্ন ডিফল্ট অডিও ফরম্যাট ব্যবহার করে:
- একক অনুরোধ (
stream=False): একটি স্ট্যান্ডার্ড RIFF হেডার সহ সম্পূর্ণ WAV (audio/wav) অডিও ফেরত দেয় (২৪ কিলোহার্টজ, মোনো, ১৬-বিট সাইনড লিটল-এন্ডিয়ান পিসিএম)। আপনি ম্যানুয়ালি শুরুতে WAV হেডার যোগ না করেই ডিকোড করা অডিও বাইটগুলো সরাসরি একটি.wavফাইলে সংরক্ষণ করতে পারেন। - স্ট্রিমিং অনুরোধ (
stream=True): ডিফল্টরূপে হেডারবিহীন কাঁচা লিনিয়ার পিসিএম (audio/l16) চাঙ্ক (২৪ কিলোহার্টজ, মোনো, ১৬-বিট সাইনড লিটল-এন্ডিয়ান পিসিএম) ফেরত দেয়, যাতে প্রতিটি চাঙ্কে কন্টেইনার হেডার ছাড়াই চাঙ্কগুলো অবিচ্ছিন্নভাবে স্ট্রিম বা সংযুক্ত করা যায়।
ভিন্ন অডিও এনকোডিং বা স্যাম্পল রেট অনুরোধ করতে, response_format ভিতরে mime_type এবং ঐচ্ছিক sample_rate কনফিগার করুন:
| ফর্ম্যাট | mime_type মান | বর্ণনা |
|---|---|---|
| WAV (একক ডিফল্ট) | "audio/wav" | RIFF হেডার সহ অসংকুচিত WAV ফাইল (১৬-বিট সাইনড লিটল-এন্ডিয়ান PCM, মোনো, ডিফল্ট ২৪ kHz)। ইউনিটারি অনুরোধের জন্য এটিই ডিফল্ট। |
| কাঁচা পিসিএম (এল১৬) (স্ট্রিমিং ডিফল্ট) | "audio/l16" | অসংকুচিত, হেডারবিহীন ১৬-বিট সাইনড লিটল-এন্ডিয়ান লিনিয়ার পিসিএম অডিও (২৪ কিলোহার্টজ, মোনো)। স্ট্রিমিং অনুরোধের জন্য এটিই ডিফল্ট। |
| মু-ল | "audio/mulaw" | ৮-বিট জি.৭১১ মিউ-ল এনকোডেড অডিও (যা সাধারণত উত্তর আমেরিকান এবং জাপানি টেলিফোনি/আইভিআর সিস্টেমে ব্যবহৃত হয়)। |
| একটি আইন | "audio/alaw" | ৮-বিট জি.৭১১ এ-ল এনকোডেড অডিও (যা সাধারণত ইউরোপীয় ও আন্তর্জাতিক টেলিফোনি সিস্টেমে ব্যবহৃত হয়)। |
আপনি sample_rate হার্টজ-এও নির্দিষ্ট করতে পারেন (যেমন, 24000 , 16000 বা 8000 )।
পাইথন
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();
যান
package main
import (
"context"
"encoding/base64"
"log"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Voice: genai.Ptr("Kore")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput("Say cheerfully: Have a wonderful day!"),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
Stream: genai.Ptr(true),
}),
})
if err != nil {
log.Fatal(err)
}
stream := res.InteractionSSEStreamEvent
defer stream.Close()
for stream.Next() {
event := stream.Value()
if stepDelta := event.GetDataStepDelta(); stepDelta != nil {
if audioDelta := stepDelta.GetDeltaAudio(); audioDelta != nil && audioDelta.Data != nil {
audioData, err := base64.StdEncoding.DecodeString(*audioDelta.Data)
if err != nil {
log.Fatal(err)
}
// Process the audio chunk (e.g. play it or write to a file)
_ = audioData
}
}
}
if err := stream.Err(); err != nil {
log.Fatal(err)
}
}
বিশ্রাম
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" }
]
}
}'
ভয়েস বিকল্পগুলি
জেমিনি ৩.৮ টিটিএস চারটি উপায়ে ভয়েস নির্বাচন বা তৈরি করার সুবিধা দেয়:
- পূর্ব-নির্মিত স্টুডিও ভয়েস: নিম্নলিখিত সারণীতে তালিকাভুক্ত ৩০টি নির্বাচিত ভয়েস।
- বর্ধিত ভয়েস লাইব্রেরি: বিভিন্ন ভাষা, উচ্চারণভঙ্গি এবং চরিত্রের ধরনের শত শত অতিরিক্ত কণ্ঠস্বর, যা
client.voices.list()(GET /v1beta/voices) ব্যবহার করে অ্যাক্সেস করা যায়। - ভয়েস ডিজাইন : গুগল এআই স্টুডিওতে স্বাভাবিক ভাষার বর্ণনা থেকে অথবা
POST /v1beta/voices(type="prompted"ব্যবহার করে একটি কাস্টম ভোকাল পার্সোনা তৈরি করুন, যা একটি স্থায়ীvoice_...ID এবংCreateVoiceওGetVoiceএ একটিsample_audioWAV প্রিভিউ রিটার্ন করে। - ভয়েস রেপ্লিকেশন : গুগল এআই স্টুডিওতে রেফারেন্স এবং কনসেন্ট অডিও থেকে অথবা
POST /v1beta/voicesব্যবহার করে একজন স্পিকারের ভয়েস রেপ্লিকেট করুন (type="replicated", ডিফল্টরূপে persistentstore=Trueঅথবা ঐচ্ছিক statelessstore=False)।
কাস্টম ভয়েস সীমা এবং TTL
| কণ্ঠস্বরের ধরণ | স্টোরেজ মোড | কোটা / সীমা | ধরে রাখা (TTL) |
|---|---|---|---|
স্টেটফুল ভয়েস ( voice_... , প্রম্পটেড বা রেপ্লিকেটেড) | store=True | প্রতিটি প্রকল্পে ২০০টি কণ্ঠস্বর (প্রেরিত এবং অনুলিখিত কণ্ঠস্বরের মধ্যে ভাগ করা) | ১ বছর |
স্টেটলেস ভয়েস কী ( voicekey_... , প্রতিলিপিকৃত) | store=False | ক্লায়েন্ট-পরিচালিত | ৭ দিন |
পূর্ব-নির্মিত কণ্ঠস্বর
| জেফির -- ব্রাইট | পাক -- উচ্ছ্বসিত | চারন -- তথ্যমূলক |
| কোর -- ফার্ম | ফেনরির -- উত্তেজিত | লেডা -- যুবতী |
| ওরুস -- ফার্ম | Aoede -- Breezy | ক্যালিরো -- সহজ-সরল |
| Autonoe -- Bright | এনসেলাডাস -- শ্বাসপ্রশ্বাসযুক্ত | আইপেটাস -- পরিষ্কার |
| উমব্রিয়েল -- সহজ-সরল | আলজিবা -- মসৃণ | ডেসপিনা -- মসৃণ |
| এরিনোম -- পরিষ্কার | অ্যালজেনিব -- গ্র্যাভেলি | রসলগেথি -- তথ্যমূলক |
| লাওমেডিয়া -- উচ্ছ্বসিত | আখেরনার -- নরম | আলনিলাম -- ফার্ম |
| শেডার -- এমনকি | গ্যাক্রাক্স -- পরিপক্ক | পুলচেরিমা -- ফরোয়ার্ড |
| আচির্ড -- বন্ধুত্বপূর্ণ | Zubenelgenubi -- Casual | ভিন্ডেমিয়াট্রিক্স -- কোমল |
| সাদাচবিয়া -- প্রাণবন্ত | সাদালটেগার -- জ্ঞানী | সুলাফাত -- উষ্ণ |
বর্ধিত ভয়েস লাইব্রেরি এবং ফিল্টারিং
পূর্ববর্তী সারণীতে উল্লেখিত ৩০টি স্টুডিও ভয়েস ছাড়াও, এক্সটেন্ডেড ভয়েস লাইব্রেরিতে বিভিন্ন ভাষা, আঞ্চলিক উচ্চারণ, চরিত্রের ধরণ এবং ডোমেন জুড়ে শত শত অতিরিক্ত ভয়েস রয়েছে। আপনি গুগল এআই স্টুডিও -তে সম্পূর্ণ ভয়েস লাইব্রেরিটি ইন্টারেক্টিভভাবে ব্রাউজ, ফিল্টার এবং অডিশন করতে পারেন, অথবা 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 (পাইথনে type_ ) | list[str] | ভয়েস সোর্স অনুযায়ী ফিল্টার করুন: "prebuilt" , "prompted" ( ভয়েস ডিজাইন ), অথবা "replicated" ( ভয়েস রেপ্লিকেশন )। |
search | str | ফ্রি-টেক্সট সাবস্ট্রিং সার্চ display_name এবং description উভয়ের ক্ষেত্রেই কেস-ইনসেনসিটিভভাবে ম্যাচ করেছে। |
page_size | int | প্রতি পৃষ্ঠায় ফেরত আসা কণ্ঠস্বরের সর্বোচ্চ সংখ্যা (ডিফল্ট 50 , সর্বোচ্চ 1000 )। |
page_token | str | ফলাফলের পরবর্তী পৃষ্ঠা আনার জন্য response.next_page_token থেকে টোকেন। |
পাইথন
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"
সমর্থিত ভাষা
টিটিএস মডেলগুলো ইনপুট ভাষা স্বয়ংক্রিয়ভাবে শনাক্ত করে। জেমিনি ৩.৮ ফ্ল্যাশ টিটিএস ( gemini-3.8-flash-tts ) ১৩০টিরও বেশি ভাষা সমর্থন করে এবং জেমিনি ৩.৮ ফ্ল্যাশ-লাইট টিটিএস ( gemini-3.8-flash-lite-tts ) ১০০টিরও বেশি ভাষা সমর্থন করে।
| ভাষা | জেমিনি ৩.৮ ফ্ল্যাশ টিটিএস | জেমিনি ৩.৮ ফ্ল্যাশ-লাইট টিটিএস |
|---|---|---|
| আচেহনিজ (আরবি লিপি) | ✔️ | ✔️ |
| আফ্রিকান | ✔️ | ✔️ |
| আকান | ✔️ | ✔️ |
| আমহারিক | ✔️ | ✔️ |
| আর্মেনীয় | ✔️ | ✔️ |
| অসমীয়া | ✔️ | ✔️ |
| অবধী | ✔️ | ✔️ |
| বালিনিজ | ✔️ | ✔️ |
| বাংলা | ✔️ | ✔️ |
| বানজার (আরবি লিপি) | ✔️ | — |
| বানজার (ল্যাটিন লিপি) | ✔️ | ✔️ |
| বাশকির | ✔️ | — |
| বাস্ক | ✔️ | ✔️ |
| বেলারুশীয় | ✔️ | ✔️ |
| বেম্বা | ✔️ | — |
| ভোজপুরি | ✔️ | ✔️ |
| বসনীয় | ✔️ | ✔️ |
| বুগিনিজ | ✔️ | ✔️ |
| বুলগেরীয় | ✔️ | ✔️ |
| বর্মী | ✔️ | — |
| ক্যান্টনিজ | ✔️ | ✔️ |
| কাতালান | ✔️ | ✔️ |
| সেবুয়ানো | ✔️ | ✔️ |
| কেন্দ্রীয় কুর্দিশ | ✔️ | ✔️ |
| ছত্তিশগড়ী | ✔️ | ✔️ |
| চীনা (হ্যান্স লিপি) | ✔️ | ✔️ |
| চীনা (হান্ট লিপি) | ✔️ | ✔️ |
| ক্রিমিয়ান তাতার | ✔️ | — |
| ক্রোয়েশীয় | ✔️ | ✔️ |
| চেক | ✔️ | ✔️ |
| ড্যানিশ | ✔️ | ✔️ |
| ডাচ | ✔️ | ✔️ |
| ডাইলা | ✔️ | — |
| জংখা | ✔️ | — |
| মিশরীয় আরবি | ✔️ | ✔️ |
| ইংরেজি | ✔️ | ✔️ |
| এস্তোনিয়ান | ✔️ | ✔️ |
| ফিলিপিনো | ✔️ | ✔️ |
| ফিনিশ | ✔️ | — |
| ফরাসি | ✔️ | ✔️ |
| গ্যালিসিয়ান | ✔️ | ✔️ |
| গান্ডা | ✔️ | ✔️ |
| জর্জিয়ান | ✔️ | ✔️ |
| জার্মান | ✔️ | ✔️ |
| গ্রীক | ✔️ | ✔️ |
| গুয়ারানি | ✔️ | — |
| গুজরাটি | ✔️ | ✔️ |
| হাইতিয়ান ক্রেওল | ✔️ | ✔️ |
| হালহ মঙ্গোলিয়ান | ✔️ | ✔️ |
| হাউসা | ✔️ | ✔️ |
| হিব্রু | ✔️ | ✔️ |
| হিন্দি | ✔️ | ✔️ |
| হাঙ্গেরীয় | ✔️ | ✔️ |
| আইসল্যান্ডীয় | ✔️ | ✔️ |
| ইগবো | ✔️ | — |
| ইলোকো | ✔️ | ✔️ |
| ইন্দোনেশিয়ান | ✔️ | ✔️ |
| ইরানি ফার্সি | ✔️ | ✔️ |
| ইতালীয় | ✔️ | ✔️ |
| জাপানি | ✔️ | ✔️ |
| জাভানিজ | ✔️ | ✔️ |
| কাবাইল | ✔️ | — |
| কাম্বা | ✔️ | ✔️ |
| কন্নড় | ✔️ | ✔️ |
| কাশ্মীরি (আরবি লিপি) | ✔️ | ✔️ |
| কাশ্মীরি (দেব লিপি) | ✔️ | ✔️ |
| কাজাখ | ✔️ | ✔️ |
| খেমার | ✔️ | ✔️ |
| কিকুয়ু | ✔️ | ✔️ |
| কিনিয়ারওয়ান্ডা | ✔️ | ✔️ |
| কঙ্গো | ✔️ | ✔️ |
| কোরিয়ান | ✔️ | ✔️ |
| কিরগিজ | ✔️ | ✔️ |
| লাও | ✔️ | ✔️ |
| লাটগালিয়ান | ✔️ | — |
| লিঙ্গালা | ✔️ | ✔️ |
| লিথুয়ানিয়ান | ✔️ | — |
| লুক্সেমবার্গীয় | ✔️ | — |
| ম্যাসিডোনিয়ান | ✔️ | ✔️ |
| মাগাহি | ✔️ | ✔️ |
| মৈথিলী | ✔️ | ✔️ |
| মালয়ালম | ✔️ | ✔️ |
| মাল্টিজ | ✔️ | ✔️ |
| মণিপুরি | ✔️ | ✔️ |
| মারাঠি | ✔️ | ✔️ |
| মিনাংকাবাউ (আরবি লিপি) | ✔️ | ✔️ |
| মিনাংকাবাউ (ল্যাটিন লিপি) | ✔️ | — |
| মিজো | ✔️ | ✔️ |
| নেপালি (ব্যক্তিগত ভাষা) | ✔️ | ✔️ |
| নাইজেরিয়ান ফুলফুলডে | ✔️ | ✔️ |
| উত্তর আজারবাইজানীয় | ✔️ | ✔️ |
| উত্তর সোথো | ✔️ | ✔️ |
| উত্তর উজবেক | ✔️ | ✔️ |
| নরওয়েজিয়ান বোকমাল | ✔️ | ✔️ |
| নরওয়েজিয়ান নিনরস্ক | ✔️ | ✔️ |
| নিয়ানজা | ✔️ | ✔️ |
| অক্সিটান | ✔️ | — |
| ওড়িয়া (ব্যক্তিগত ভাষা) | ✔️ | ✔️ |
| পাঙ্গাসিনান | ✔️ | — |
| ফার্সি (আফগানিস্তান) | ✔️ | ✔️ |
| পোলিশ | ✔️ | ✔️ |
| পর্তুগিজ | ✔️ | ✔️ |
| পাঞ্জাবি | ✔️ | ✔️ |
| রোমানিয়ান | ✔️ | ✔️ |
| রাশিয়ান | ✔️ | ✔️ |
| সাঁওতালি | ✔️ | ✔️ |
| সার্বিয়ান | ✔️ | ✔️ |
| সিন্ধি | ✔️ | — |
| সিংহলী | ✔️ | ✔️ |
| স্লোভাক | ✔️ | ✔️ |
| স্লোভেনীয় | ✔️ | — |
| সোমালি | ✔️ | — |
| দক্ষিণ আজারবাইজানীয় | ✔️ | ✔️ |
| দক্ষিণ পশতু | ✔️ | ✔️ |
| দক্ষিণ সোথো | ✔️ | — |
| স্প্যানিশ | ✔️ | ✔️ |
| প্রমিত আরবি (আরবি লিপি) | ✔️ | ✔️ |
| প্রমিত আরবি (ল্যাটিন লিপি) | ✔️ | ✔️ |
| প্রমিত লাতভিয়ান | ✔️ | ✔️ |
| প্রমিত মালয় | ✔️ | ✔️ |
| সোয়াহিলি (ব্যক্তিগত ভাষা) | ✔️ | — |
| স্বাতী | ✔️ | — |
| সুইডিশ | ✔️ | — |
| তাজিক | ✔️ | — |
| তামিল | ✔️ | ✔️ |
| তেলুগু | ✔️ | ✔️ |
| থাই | ✔️ | — |
| তিগ্রিনিয়া | ✔️ | — |
| তোস্ক আলবেনিয়ান | ✔️ | — |
| তুর্কি | ✔️ | ✔️ |
| উইঘুর | ✔️ | — |
| ভিয়েতনামী | ✔️ | ✔️ |
সমর্থিত মডেল
| মডেল | একক বক্তা | মাল্টি-স্পিকার | ভয়েস ডিজাইন | কণ্ঠস্বর প্রতিলিপি |
|---|---|---|---|---|
জেমিনি ৩.৮ ফ্ল্যাশ টিটিএস ( gemini-3.8-flash-tts ) | ✔️ | ✔️ | ✔️ | ✔️ |
জেমিনি ৩.৮ ফ্ল্যাশ-লাইট টিটিএস ( gemini-3.8-flash-lite-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-এ স্থানান্তরিত হন:
- টার্ন-লেভেল নির্দেশনাগুলো
speech_metadata-তে স্থানান্তর করুন: জেমিনি ৩.৮ টিটিএস ইনপুট টেক্সটকে কঠোরভাবে একটি হুবহু ট্রান্সক্রিপ্ট হিসেবে বিবেচনা করে। দীর্ঘায়িত ডেলিভারি নির্দেশাবলী (style—যেমন"whispering","out of breath", বা"speaking slowly") এবং স্পিকার লেবেল (speaker) ট্রান্সক্রিপ্ট টেক্সটে স্টেজ নির্দেশনা এম্বেড করার পরিবর্তে স্ট্রাকচার্ডspeech_metadataঅ্যানোটেশনে স্থানান্তর করুন। - শুধুমাত্র নির্দিষ্ট সময়ের বাচনিক ঘটনার জন্য অ্যাঙ্গেল-ব্র্যাকেট ইনলাইন ট্যাগ ব্যবহার করুন: ক্ষণস্থায়ী অ-কথ্য শব্দ এবং বিরতিগুলোকে ট্রান্সক্রিপ্টের মধ্যে অ্যাঙ্গেল ব্র্যাকেট ব্যবহার করে ইনলাইনে রাখুন (যেমন
<laugh>,<sigh>,<cough>,<breath>, বা<short pause>)। সাউন্ড-ইফেক্ট ট্যাগ (যেমন হাততালি বা ধপাস শব্দ) পরিহার করুন এবং ডেলিভারি স্টাইলspeech_metadata.styleএ রাখুন। - একাধিক বক্তার অনুরোধে প্রতিটি ধাপে
speakerনির্দিষ্ট করুন: একাধিক বক্তার অনুরোধের প্রতিটি ধাপে, কনফিগার করা বক্তাদের মধ্যে একজনের সাথে মিল রেখেspeech_metadataভিতরেspeakerস্পষ্টভাবে অন্তর্ভুক্ত করতে হবে। - ভয়েস ডিজাইন ব্যবহার করে শুরুতেই পারসোনা ডিজাইন করুন: একাধিক অনুচ্ছেদযুক্ত
"Audio Profile"বা"Director's Notes"ব্লকগুলিকে ভয়েস ডিজাইনে তৈরি একটি কাস্টম ভয়েস দিয়ে প্রতিস্থাপন করুন, তারপর ন্যূনতম বা খালিstyleস্ট্রিং ব্যবহার করে আপনার টিটিএস অনুরোধগুলিতে সেইvoice_...আইডিটি প্রয়োগ করুন। - ইউনারি রিকোয়েস্টের ক্ষেত্রে ডিফল্ট WAV (
audio/wav) আউটপুটের বিষয়টি বিবেচনা করুন:gemini-3.1-flash-tts-previewএবং পূর্ববর্তী TTS মডেলগুলির (যেগুলি ডিফল্টরূপে হেডারবিহীন র PCMaudio/l16রিটার্ন করত) থেকে ভিন্ন, Gemini 3.8 TTS ইউনারি রিকোয়েস্টের জন্য ডিফল্টরূপে একটি স্ট্যান্ডার্ড RIFF হেডার সহ WAV অডিও (audio/wav) রিটার্ন করে।- যদি আপনার কোড আগে সরাসরি PCM বাইটগুলোকে একটি WAV হেডারে মুড়ে দিয়ে থাকে (উদাহরণস্বরূপ, পাইথনের
waveমডিউল বাffmpegব্যবহার করে), তাহলে সেই ম্যানুয়াল হেডার র্যাপারটি সরিয়ে ফেলুন এবং ফেরত আসা বাইটগুলো সরাসরি একটি.wavফাইলে লিখুন। - আপনার পাইপলাইনে যদি হেডারবিহীন র PCM, mu-law, বা A-law অডিওর প্রয়োজন হয়, তাহলে স্পষ্টভাবে
response_format"audio/l16","audio/mulaw", বা"audio/alaw"এ সেট করুন। অডিও আউটপুট ফরম্যাটগুলো দেখুন।
- যদি আপনার কোড আগে সরাসরি PCM বাইটগুলোকে একটি WAV হেডারে মুড়ে দিয়ে থাকে (উদাহরণস্বরূপ, পাইথনের
প্রম্পটিং গাইড
জেমিনি ৩.৮ টিটিএস মডেলগুলো ইনপুট টেক্সটকে কঠোরভাবে একটি হুবহু প্রতিলিপি হিসেবে বিবেচনা করে। পূর্ববর্তী প্রিভিউ মডেলগুলোর মতো নয়, যেখানে মঞ্চ নির্দেশনাগুলো সাধারণ টেক্সটের মধ্যে এমবেড করা থাকতো, জেমিনি ৩.৮ টিটিএস ধারাবাহিক টার্ন-লেভেল নির্দেশনা ( speech_metadata ) এবং নির্দিষ্ট সময়ের ইনলাইন ভোকাল ট্যাগগুলোকে আলাদা করে।
স্টাইল ফিল্ড বনাম ইনলাইন ট্যাগ
আপনার কর্মসম্পাদন নির্দেশাবলী পরিধি অনুসারে ভাগ করুন:
- পালা-ভিত্তিক বাচনভঙ্গি (
speech_metadata.style): বাচনভঙ্গির ধারাবাহিক বৈশিষ্ট্যগুলো—যেমন আবেগ, স্বরভঙ্গি, সামগ্রিক গতি, বা বাচনভঙ্গি (যেমন"whispering","out of breath","muttering", বা"sarcastic")—speech_metadataএরstyleফিল্ডে রাখুন। বিভিন্ন পালা জুড়ে একটি স্থিতিশীল চরিত্র এবং পারফরম্যান্স তৈরি করতে, ভয়েস ডিজাইনে শুরুতেই পার্সোনাটি ডিজাইন করুন এবং শুধুমাত্র পালা-ভিত্তিক ঐচ্ছিক ছোটখাটো পরিবর্তনের জন্য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"সেট করুন।
স্বরবিন্যাস এবং পিচ
একটি টার্ন জুড়ে স্বরপ্রক্ষেপ, পিচ এবং স্বরভঙ্গি নিয়ন্ত্রণ করতে speech_metadata.style ব্যবহার করুন (উদাহরণস্বরূপ, "style": "high pitch, cheerful and excited inflection" অথবা "style": "monotone and flat" )। যদি সংলাপের মাঝখানে আবেগ বা স্বরপ্রক্ষেপ পরিবর্তিত হয়, তবে স্ক্রিপ্টটিকে আলাদা টার্নে ভাগ করুন এবং প্রতিটি টার্নের জন্য স্বতন্ত্র 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_...তৈরি করুন, এবং তারপর আপনার টিটিএস কলগুলোতে সেই ভয়েস আইডিটি ব্যবহার করুন। - স্থিতিশীলতার জন্য ভয়েস রেফারেন্সের উপর নির্ভর করুন (মেটা-নির্দেশাবলী বাদ দিন): জেমিনি ৩.৮ টিটিএস মডেলগুলোকে প্রথমে অডিও রেফারেন্সের উপর ভিত্তি করে স্থির হতে প্রশিক্ষণ দেওয়া হয়। মডেলকে কণ্ঠস্বর স্থির রাখতে বলার মতো কোনো নির্দেশাবলী অন্তর্ভুক্ত করবেন না (যেমন
"do not switch speaker identity"বা"maintain identical timbre")—অতিরিক্ত প্রম্পট টেক্সট কণ্ঠস্বরের বিচ্যুতি বাড়ায়। অপ্রয়োজনীয় স্টাইল নির্দেশাবলী বাদ দিন এবং ভয়েস রেফারেন্স দ্বারা প্রদত্ত স্থিতিশীল বিন্দুর চারপাশে মডেলকে স্বাভাবিকভাবে পরিবর্তিত হতে দিন। -
styleমাধ্যমে বক্তার অপরিবর্তনীয় বৈশিষ্ট্য পরিবর্তন করার চেষ্টা করবেন না:speech_metadata.styleএ বয়স, লিঙ্গ, নাম বা স্থায়ী উচ্চারণ পরিবর্তন অন্তর্ভুক্ত করা থেকে বিরত থাকুন। এর পরিবর্তে, এক্সটেন্ডেড ভয়েস লাইব্রেরি থেকে একটি আঞ্চলিক কণ্ঠস্বর বেছে নিন অথবা ভয়েস ডিজাইন ব্যবহার করে একটি তৈরি করুন।
প্রস্তাবিত কর্মপ্রবাহ
- চরিত্রটি একবারই তৈরি করুন: ভয়েস ডিজাইনে আপনার চরিত্রটি তৈরি করুন অথবা এক্সটেন্ডেড ভয়েস লাইব্রেরি থেকে আপনার লক্ষ্য ভাষা ও ব্যক্তিত্বের সাথে মেলে এমন একটি আঞ্চলিক ভয়েস বেছে নিন।
- কথার জড়তা সহ স্বাভাবিক কথোপকথনের প্রতিলিপি লিখুন: সর্বোচ্চ স্বাভাবিকতার জন্য,
textএকটি বাস্তব কথোপকথনের প্রতিলিপির মতো করে লিখুন—যার মধ্যে স্বাভাবিক কথোপকথনের জড়তা এবং দ্বিধা অন্তর্ভুক্ত থাকবে (উদাহরণস্বরূপ,"Oh uh yeah I think... hm, so that's interesting")। - প্রথমে সাধারণ টিটিএস (TTS) পরীক্ষা করুন: প্রথমে একটি খালি
styleফিল্ড ব্যবহার করে আপনার ট্রান্সক্রিপ্টটি তৈরি করুন—বেশিরভাগ অনুরোধের জন্য কোনোstyleনির্দেশনার প্রয়োজন হয় না। - শুধুমাত্র ছোটখাটো পরিবর্তনের জন্য সংক্ষিপ্ত
styleপ্রম্পট যোগ করুন: শুধুমাত্র যে টার্নগুলোতে নির্দিষ্ট ডেলিভারি সমন্বয়ের প্রয়োজন, সেগুলোর জন্য একটি সংক্ষিপ্তstyleস্ট্রিং (যেমন"casual, friendly"বা"muttering, then reassuring") যোগ করুন, এবং যখন আপনি একটি সামঞ্জস্যপূর্ণ বেসলাইন চান, তখন টার্নজুড়ে ঠিক সেই সংক্ষিপ্ত স্ট্রিংটিই পুনরায় ব্যবহার করুন।
একাধিক পালা সংলাপ এবং ভয়েস এজেন্ট
রিয়েল-টাইম কথোপকথনমূলক ভয়েস এজেন্ট বা মাল্টি-টার্ন অ্যাপ্লিকেশন তৈরি করার সময়:
- এলএলএম টেক্সট খণ্ডগুলো আসার সাথে সাথে প্রতি পালায় একটি করে টিটিএস কল করুন।
- কনফিগার করা
voice(পূর্ব-নির্মিত, ডিজাইন করাvoice_..., অথবা প্রতিলিপিকৃতvoice_.../voicekey_...) পালাক্রমে বক্তার পরিচয় বহন করুক—প্রতি পালায় কখনও একটি দীর্ঘ চরিত্রের অবয়ব পুনরায় পাঠাবেন না। - প্রতি-পালা
styleক্ষেত্রটি খালি রাখুন, অথবা পুরো কথোপকথনের জন্য একটি সংক্ষিপ্ত ধ্রুবক স্ট্রিং (যেমন"casual, friendly") পাঠান। - আরও জোরালো শৈলীগত নির্দেশনার সাহায্য না নিয়ে, এজেন্টের দীর্ঘ প্রতিক্রিয়াগুলোকে ছোট ছোট অংশে ভাগ করুন।
সীমাবদ্ধতা
- টিটিএস মডেলগুলো শুধুমাত্র টেক্সট ইনপুট গ্রহণ করে এবং শুধুমাত্র অডিও আউটপুট তৈরি করে।
- একক-অনুরোধে একাধিক-স্পিকার তৈরি (
speech_config.speakers) পূর্ব-নির্মিত ভয়েস ব্যবহার করে ২ জন পর্যন্ত স্পিকারকে সমর্থন করে। একাধিক চরিত্রের সংলাপে কাস্টম ডিজাইন করা (voice_...) বা প্রতিলিপিকৃত (voice_.../voicekey_...) ভয়েস একত্রিত করতে, প্রতিটি স্পিকারের পালা আলাদাভাবে সংশ্লেষণ করুন। যেহেতু ইউনিটারি অনুরোধগুলি ডিফল্টরূপে একটি ৪৪-বাইট RIFF হেডার সহaudio/wavফেরত দেয়, তাই র PCM ({"type": "audio", "mime_type": "audio/l16"}) অনুরোধ করুন অথবা ২৪kHz PCM অডিও ফ্রেমগুলি সংযুক্ত করার আগে প্রতিটি পালা থেকে WAV হেডারটি সরিয়ে ফেলুন। - কাস্টম ভয়েস স্টোরেজ সীমা এবং TTL:
- স্টেটফুল ভয়েস (
store=True, প্রম্পটেড বা রেপ্লিকেটেড): প্রতি প্রজেক্টে সর্বোচ্চ ২০০টি ভয়েস, যার টিটিএল (টাইম-টু-লিভ) ১ বছর । - স্টেটলেস ভয়েস কী (
store=False,voicekey_...): ৭-দিনের টিটিএল (টাইম-টু-লিভ)।
- স্টেটফুল ভয়েস (
- ভাষাগত কভারেজ জানতে সমর্থিত ভাষা বিভাগটি পর্যালোচনা করুন।
এরপর কী?
- ভয়েস ডিজাইন-এর সাহায্যে স্বাভাবিক ভাষা থেকে নিজস্ব ভোকাল পারসোনা তৈরি করুন।
- ভয়েস রেপ্লিকেশন- এর মাধ্যমে বিদ্যমান কোনো বক্তার কণ্ঠস্বর অনুকরণ করুন।
- Gemini 3.8 Flash TTS এবং Gemini 3.8 Flash-Lite TTS মডেল পেজগুলোতে মডেলের স্পেসিফিকেশন তুলনা করুন।
- Live API- এর মাধ্যমে ইন্টারেক্টিভ দ্বিমুখী অডিও অন্বেষণ করুন।