تولید متن به گفتار (TTS) با استفاده از رابط برنامه‌نویسی نرم‌افزار Gemini


شما می‌توانید از یک مدل Gemini بخواهید که خروجی گفتار (صوتی) را از یک متن فوری تولید کند. وقتی از Firebase AI Logic استفاده می‌کنید، می‌توانید این درخواست را مستقیماً از برنامه خود انجام دهید.

تولید متن به گفتار (TTS) قابل کنترل است، به این معنی که شما متن دقیقی را برای ترکیب به گفتار ارائه می‌دهید . همچنین، می‌توانید از زبان طبیعی در دستورات خود برای هدایت سبک، لهجه، سرعت و لحن خروجی صدا استفاده کنید. می‌توانید TTS را نقطه مقابل رونویسی (گفتار به متن) در نظر بگیرید.

این ویژگی با استفاده از هر یک از مدل‌های Gemini -tts که برای تولید گفتار با کیفیت بالا و تأخیر کم بهینه شده‌اند، در دسترس است.

با این قابلیت، می‌توانید کارهایی مانند موارد زیر را انجام دهید:

  • داستان‌سرایی تعاملی : کتاب‌های صوتی فراگیر یا بازی‌های نقش‌آفرینی بسازید که در آن‌ها مدل صدای شخصیت‌های مختلف را عوض می‌کند یا لحن خود را (مثل زمزمه کردن در حالت تعلیق یا خندیدن به یک جوک) با روایت هماهنگ می‌کند.

  • یادگیری زبان : راهنماهای تلفظی بسازید که بتوانند متن را با لهجه‌های منطقه‌ای خاص یا با سرعت کمتر بخوانند تا به زبان‌آموزان در تمرین تلفظ‌های دشوار کمک کنند.

  • خوانندگان محتوای آگاه از متن : مقالات خبری، دستور پخت‌ها یا پست‌های وبلاگ را با صدای بلند و با استفاده از شخصیت صوتی و لحن احساسی متناسب با محتوا بخوانید (مانند لحنی جدی برای اخبار فوری یا لحنی گرم و صبور برای دستورالعمل‌های آشپزی گام به گام).

این راهنما نحوه تولید گفتار از ورودی متن با یک یا چند بلندگو و نحوه پخش جریانی پاسخ صوتی را نشان می‌دهد.

پرش به کد برای تک بلندگو پرش به کد برای چند بلندگو پرش به کد برای پاسخ‌های پخش‌شده

مقایسه بین TTS و Live API

هر دو مدل تبدیل متن به گفتار (TTS) و مدل‌های Live API ، مدل‌های تولید گفتار با تأخیر کم هستند که می‌توانند برای صداها و زبان‌های مختلف پاسخ پیکربندی شوند. با این حال، آنها موارد استفاده بسیار متفاوتی را ارائه می‌دهند.

  • تولید متن به گفتار (TTS) یک تعامل یک‌طرفه و درخواست-پاسخ (ورودی متن، خروجی صدا) است. این فناوری برای سناریوهایی طراحی شده است که نیاز به قرائت دقیق متن ارائه شده با کنترل دقیق بر سبک و صدا دارند، مانند روایت پادکست، کتاب‌های صوتی یا خواندن مقالات با صدای بلند.

  • تولید Live API از جریان دو طرفه برای مکالمات صوتی بلادرنگ (ورودی صدا، خروجی صدا) پشتیبانی می‌کند. این قابلیت در زمینه‌های مکالمه پویا که در آن مدل تصمیم می‌گیرد گفتار مربوطه را برگرداند، عالی عمل می‌کند. توجه داشته باشید که جدیدترین مدل‌های Live API از ورودی ویدیو و تصویر نیز پشتیبانی می‌کنند.

قبل از اینکه شروع کنی

برای مشاهده محتوا و کد مخصوص ارائه‌دهنده در این صفحه، روی ارائه‌دهنده API Gemini خود کلیک کنید.

پلتفرم عامل

اگر هنوز این کار را نکرده‌اید، راهنمای شروع به کار را تکمیل کنید، که نحوه راه‌اندازی پروژه Firebase، اتصال برنامه به Firebase، افزودن SDK، راه‌اندازی سرویس backend برای ارائه‌دهنده API انتخابی Gemini و ایجاد یک نمونه GenerativeModel شرح می‌دهد.

برای آزمایش و تکرار روی درخواست‌هایتان، توصیه می‌کنیم از Google AI Studio استفاده کنید.

مدل‌هایی که از این قابلیت پشتیبانی می‌کنند

  • gemini-3.1-flash-tts-preview

تولید گفتار از متن

شما می‌توانید با استفاده از مدل Gemini TTS، از متن ارائه شده، گفتار تولید کنید.

تولید گفتار با یک گوینده

قبل از امتحان کردن این نمونه، بخش «قبل از شروع» این راهنما را برای راه‌اندازی پروژه و برنامه خود تکمیل کنید.
در آن بخش، شما همچنین می‌توانید روی دکمه‌ای برای ارائه‌دهنده‌ی API Gemini انتخابی خود کلیک کنید تا محتوای خاص ارائه‌دهنده را در این صفحه مشاهده کنید .

شما می‌توانید مدل را طوری پیکربندی کنید که صدا را با استفاده از یک صدای واحد خروجی دهد.

در GenerationConfig خود، موارد زیر را وارد کنید:

تابع generateContent با متن درخواست خود فراخوانی کنید. مدل، داده‌های صوتی خام PCM را در بخش‌های پاسخ برمی‌گرداند.

سویفت


import FirebaseAILogic

// Initialize the Gemini Developer API backend service.
let ai = FirebaseAI.firebaseAI(backend: .googleAI())

// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
let config = GenerationConfig(
  responseModalities: [.audio],
  speechConfig: SpeechConfig(voiceName: "Kore", languageCode: "en-US")
)

// Create a `GenerativeModel` instance with a model that supports speech generation.
let model = ai.generativeModel(
  modelName: "gemini-3.1-flash-tts-preview",
  generationConfig: config
)

// Provide a text prompt.
let prompt = "Say cheerfully: Have a wonderful day!"

// Call `generateContent` to generate the speech output based on your text prompt.
let response = try await model.generateContent(prompt)

// Extract the audio data and handle it for downstream use. For example:
for part in response.inlineDataParts {
  let data = part.data          // Raw PCM audio bytes (24kHz, 1 channel, 16-bit)
  let mimeType = part.mimeType  // for example: "audio/pcm"
  print("Received audio data with MIME type: \(mimeType)")

  // To play back raw PCM audio bytes, you'll need to write your own `playRawPcm` function.
  playRawPcm(data: data)
}

Kotlin

برای کاتلین، متدهای موجود در این SDK توابع suspend هستند و باید از یک scope کوروتین فراخوانی شوند.

// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
val config = generationConfig {
    responseModalities = listOf(ResponseModality.AUDIO)
    speechConfig = SpeechConfig(
        voice = Voice("Kore"),
        languageCode = "en-US"
    )
}

// Initialize the Gemini Developer API backend service.
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-3.1-flash-tts-preview",
        generationConfig = config
    )

// Provide a text prompt.
val prompt = "Say cheerfully: Have a wonderful day!"

// Call `generateContent` to generate the speech output based on your text prompt.
val response = model.generateContent(prompt)

// Extract the audio data and handle it for downstream use. For example:
val part = response.candidates.firstOrNull()?.content?.parts?.firstOrNull()
if (part is InlineDataPart) {
    val pcmData = part.inlineData  // Raw PCM bytes (24kHz, 1 channel, 16-bit)
    val mimeType = part.mimeType   // for example: "audio/pcm"

    // To play back PCM audio data, you'll need to write your own `playAudio` function.
    playAudio(pcmData)
}

Java

برای جاوا، متدهای استریمینگ در این SDK یک نوع Publisher از کتابخانه Reactive Streams برمی‌گردانند.

// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
GenerationConfig config = new GenerationConfig.Builder()
    .setResponseModalities(Collections.singletonList(ResponseModality.AUDIO))
    .setSpeechConfig(new SpeechConfig(new Voice("Kore"), "en-US"))
    .build();

// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
        .generativeModel("gemini-3.1-flash-tts-preview", config);

// Use the GenerativeModelFutures Java compatibility layer.
GenerativeModelFutures model = GenerativeModelFutures.from(ai);

// Provide a text prompt.
String prompt = "Say cheerfully: Have a wonderful day!";
Content content = new Content.Builder().addText(prompt).build();
Executor executor = Executors.newSingleThreadExecutor();

// Call `generateContent` to generate the speech output based on your text prompt.
// Extract the audio data and handle it for downstream use.
ListenableFuture<GenerateContentResponse> response = model.generateContent(content);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        Part part = result.getCandidates().get(0).getContent().getParts().get(0);
        if (part instanceof InlineDataPart) {
            byte[] pcmData = ((InlineDataPart) part).getInlineData();
            String mimeType = ((InlineDataPart) part).getMimeType();

            // To play back PCM audio data, you'll need to write your own `playAudio` function.
            playAudio(pcmData);
        }
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

Web


import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend, ResponseModality } from "firebase/ai";

// TODO(developer): Replace with your app's Firebase configuration
const firebaseConfig = { /* ... */ };
const firebaseApp = initializeApp(firebaseConfig);

// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
const generationConfig = {
  responseModalities: [ResponseModality.AUDIO],
  speechConfig: {
    voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } },
    languageCode: "en-US"
  }
};

// Create a `GenerativeModel` instance with a model that supports speech generation.
const model = getGenerativeModel(ai, {
  model: "gemini-3.1-flash-tts-preview",
  generationConfig
});

// Provide a text prompt.
const prompt = "Say cheerfully: Have a wonderful day!";

// Call `generateContent` to generate the speech output based on your text prompt.
const result = await model.generateContent(prompt);
const inlineDataParts = result.response.inlineDataParts();

// Extract the audio data and handle it for downstream use. For example:
if (inlineDataParts?.[0]) {
  const pcmBase64 = inlineDataParts[0].inlineData.data;
  // Decode base64 to ArrayBuffer
  const pcmBuffer = Uint8Array.from(atob(pcmBase64), c => c.charCodeAt(0)).buffer;

  // To play back a PCM buffer, you'll need to write your own `playAudio` function.
  playAudio(pcmBuffer);
}

Dart


import 'package:firebase_ai/firebase_ai.dart';

// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
final config = GenerationConfig(
  responseModalities: [ResponseModality.audio],
  speechConfig: SpeechConfig(voiceName: 'Kore', languageCode: 'en-US'),
);

// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
final model = FirebaseAI.googleAI().generativeModel(
  model: 'gemini-3.1-flash-tts-preview',
  config: config,
);

// Provide a text prompt.
final prompt = 'Say cheerfully: Have a wonderful day!';

// Call `generateContent` to generate the speech output based on your text prompt.
final response = await model.generateContent([Content.text(prompt)]);

// Extract the audio data and handle it for downstream use. For example:
final part = response.candidates.first.content.parts.first;
if (part is InlineDataPart && part.mimeType.startsWith('audio/')) {
  final Uint8List pcmData = part.bytes;  // Raw PCM bytes (24kHz, 1 channel, 16-bit)

  // To play back PCM audio data, you'll need to write your own `playAudio` function.
  await playAudio(pcmData);
}

وحدت


using Firebase.AI;

// Set `responseModalities` to include `Audio`.
// Configure a `SpeechConfig` with your chosen voice name and language code.
var config = new GenerationConfig(
  responseModalities: new System.Collections.Generic.List<ResponseModality> { ResponseModality.Audio },
  speechConfig: SpeechConfig.UsePrebuiltVoice("Kore", "en-US")
);

// Initialize the Gemini Developer API backend service.
var ai = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());

// Create a `GenerativeModel` instance with a model that supports speech generation.
var model = ai.GetGenerativeModel(
  modelName: "gemini-3.1-flash-tts-preview",
  generationConfig: config
);

// Provide a text prompt.
var prompt = "Say cheerfully: Have a wonderful day!";

// Call `GenerateContentAsync` to generate the speech output based on your text prompt.
var response = await model.GenerateContentAsync(prompt);

// Extract the audio data and handle it for downstream use. For example:
if (response.Candidates.Count > 0) {
  foreach (var part in response.Candidates[0].Content.Parts) {
    if (part is ModelContent.InlineDataPart inlineData) {
      byte[] pcmData = inlineData.Data;  // Raw PCM bytes (24kHz, 1 channel, 16-bit)

      // To play back PCM audio data, you'll need to write your own `playAudio` function.
      playAudio(pcmData);
    }
  }
}

تولید گفتار با چندین گوینده

قبل از امتحان کردن این نمونه، بخش «قبل از شروع» این راهنما را برای راه‌اندازی پروژه و برنامه خود تکمیل کنید.
در آن بخش، شما همچنین می‌توانید روی دکمه‌ای برای ارائه‌دهنده‌ی API Gemini انتخابی خود کلیک کنید تا محتوای خاص ارائه‌دهنده را در این صفحه مشاهده کنید .

شما می‌توانید مدل را طوری پیکربندی کنید که از صداهای مختلف برای گویندگان مختلف در متن استفاده کند. این برای تولید صدا برای دیالوگ‌ها یا مکالمات مفید است.

  1. یک MultiSpeakerVoiceConfig ایجاد کنید که نام‌های گوینده (که در اعلان خود استفاده خواهید کرد) را به نام‌های صوتی پاسخ خاص (مثلاً Kore ) نگاشت کند.

    پیکربندی چند بلندگو دقیقاً از 2 بلندگو پشتیبانی می‌کند.

  2. در GenerationConfig خود، موارد زیر را وارد کنید:

  3. در سوال خود، با استفاده از نام گوینده به عنوان پیشوند، مشخص کنید چه کسی صحبت می‌کند (برای مثال، Joe: Hello. Jane: Hi. ).

تابع generateContent با متن درخواست خود فراخوانی کنید. مدل، داده‌های صوتی خام PCM را در بخش‌های پاسخ برمی‌گرداند.

سویفت


import FirebaseAILogic

// Initialize the Gemini Developer API backend service.
let ai = FirebaseAI.firebaseAI(backend: .googleAI())

// Configure a `SpeechConfig` for multiple speakers, assigning a voice to each speaker.
let multiSpeechConfig = SpeechConfig(
  multiSpeakerVoiceConfig: MultiSpeakerVoiceConfig(
    speakerVoiceConfigs: [
      SpeakerVoiceConfig(speaker: "Joe", voiceName: "Puck"),
      SpeakerVoiceConfig(speaker: "Jane", voiceName: "Kore")
    ]
  ),
  languageCode: "en-US"
)

// Set `responseModalities` to include `audio`.
let config = GenerationConfig(
  responseModalities: [.audio],
  speechConfig: multiSpeechConfig
)

// Create a `GenerativeModel` instance with a model that supports speech generation.
let model = ai.generativeModel(
  modelName: "gemini-3.1-flash-tts-preview",
  generationConfig: config
)

// Provide a text prompt that includes the names of the speakers.
let prompt = """
Joe: How's it going today Jane?
Jane: Not too bad, how about you?
"""

// Call `generateContent` to generate the speech output based on your text prompt.
let response = try await model.generateContent(prompt)

// Extract the audio data and handle it for downstream use. For example:
for part in response.inlineDataParts {
  let data = part.data          // Raw PCM audio bytes (24kHz, 1 channel, 16-bit)
  let mimeType = part.mimeType  // for example: "audio/pcm"
  print("Received audio data with MIME type: \(mimeType)")

  // To play back raw PCM audio bytes, you'll need to write your own `playRawPcm` function.
  playRawPcm(data: data)
}

Kotlin

برای کاتلین، متدهای موجود در این SDK توابع suspend هستند و باید از یک scope کوروتین فراخوانی شوند.

// Configure a `SpeechConfig` for multiple speakers, assigning a voice to each speaker.
val multiSpeechConfig = SpeechConfig(
    multiSpeakerVoiceConfig = MultiSpeakerVoiceConfig(
        speakerVoiceConfigs = listOf(
            SpeakerVoiceConfig(speaker = "Joe", voice = Voice("Puck")),
            SpeakerVoiceConfig(speaker = "Jane", voice = Voice("Kore"))
        )
    ),
    languageCode = "en-US"
)

// Set `responseModalities` to include `AUDIO`.
val config = generationConfig {
    responseModalities = listOf(ResponseModality.AUDIO)
    speechConfig = multiSpeechConfig
}

// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-3.1-flash-tts-preview",
        generationConfig = config
    )

// Provide a text prompt that includes the names of the speakers.
val prompt = """
Joe: How's it going today Jane?
Jane: Not too bad, how about you?
"""

// Call `generateContent` to generate the speech output based on your text prompt.
val response = model.generateContent(prompt)

// Extract the audio data and handle it for downstream use. For example:
val part = response.candidates.firstOrNull()?.content?.parts?.firstOrNull()
if (part is InlineDataPart) {
    val pcmData = part.inlineData  // Raw PCM bytes (24kHz, 1 channel, 16-bit)
    val mimeType = part.mimeType   // for example: "audio/pcm"

    // To play back PCM audio data, you'll need to write your own `playAudio` function.
    playAudio(pcmData)
}

Java

برای جاوا، متدهای استریمینگ در این SDK یک نوع Publisher از کتابخانه Reactive Streams برمی‌گردانند.

// Configure a `SpeechConfig` for multiple speakers, assigning a voice to each speaker.
MultiSpeakerVoiceConfig multiSpeakerVoiceConfig = new MultiSpeakerVoiceConfig(
    Arrays.asList(
        new SpeakerVoiceConfig("Joe", new Voice("Puck")),
        new SpeakerVoiceConfig("Jane", new Voice("Kore"))
    )
);

SpeechConfig multiSpeechConfig = new SpeechConfig(multiSpeakerVoiceConfig);

// Set `responseModalities` to include `AUDIO`.
GenerationConfig config = new GenerationConfig.Builder()
    .setResponseModalities(Collections.singletonList(ResponseModality.AUDIO))
    .setSpeechConfig(multiSpeechConfig)
    .build();

// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
         .generativeModel("gemini-3.1-flash-tts-preview", config);

GenerativeModelFutures model = GenerativeModelFutures.from(ai);

// Provide a text prompt that includes the names of the speakers.
String prompt = "Joe: How's it going today Jane?\nJane: Not too bad, how about you?";
Content content = new Content.Builder().addText(prompt).build();
Executor executor = Executors.newSingleThreadExecutor();

// Call `generateContent` to generate the speech output based on your text prompt.
// Extract the audio data and handle it for downstream use.
ListenableFuture<GenerateContentResponse> response = model.generateContent(content);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        Part part = result.getCandidates().get(0).getContent().getParts().get(0);
        if (part instanceof InlineDataPart) {
            byte[] pcmData = ((InlineDataPart) part).getInlineData();  // Raw PCM bytes (24kHz, 1 channel, 16-bit)
            String mimeType = ((InlineDataPart) part).getMimeType();   // for example: "audio/pcm"

            // To play back PCM audio data, you'll need to write your own `playAudio` function.
            playAudio(pcmData);
        }
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

Web


import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend, ResponseModality } from "firebase/ai";

// TODO(developer): Replace with your app's Firebase configuration
const firebaseConfig = { /* ... */ };
const firebaseApp = initializeApp(firebaseConfig);

// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` for multiple speakers, assigning a voice to each speaker.
const generationConfig = {
  responseModalities: [ResponseModality.AUDIO],
  speechConfig: {
    multiSpeakerVoiceConfig: {
      speakerVoiceConfigs: [
        { speaker: "Joe", voiceConfig: { prebuiltVoiceConfig: { voiceName: "Puck" } } },
        { speaker: "Jane", voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } }
      ]
    },
    languageCode: "en-US"
  }
};

// Create a `GenerativeModel` instance with a model that supports speech generation.
const model = getGenerativeModel(ai, {
  model: "gemini-3.1-flash-tts-preview",
  generationConfig
});

// Provide a text prompt that includes the names of the speakers.
const prompt = `
Joe: How's it going today Jane?
Jane: Not too bad, how about you?
`;

// Call `generateContent` to generate the speech output based on your text prompt.
const result = await model.generateContent(prompt);
const inlineDataParts = result.response.inlineDataParts();

// Extract the audio data and handle it for downstream use. For example:
if (inlineDataParts?.[0]) {
  const pcmBase64 = inlineDataParts[0].inlineData.data;  // Raw PCM bytes (24kHz, 1 channel, 16-bit)
  const pcmBuffer = Uint8Array.from(atob(pcmBase64), c => c.charCodeAt(0)).buffer;

  // To play back a PCM buffer, you'll need to write your own `playAudio` function.
  playAudio(pcmBuffer);
}

Dart


import 'package:firebase_ai/firebase_ai.dart';

// Configure a `SpeechConfig` for multiple speakers, assigning a voice to each speaker.
final multiSpeechConfig = SpeechConfig.multiSpeaker(
  multiSpeakerVoiceConfig: MultiSpeakerVoiceConfig(
    speakerVoiceConfigs: [
      SpeakerVoiceConfig(speaker: 'Joe', voiceName: 'Puck'),
      SpeakerVoiceConfig(speaker: 'Jane', voiceName: 'Kore'),
    ],
  ),
  languageCode: 'en-US',
);

// Set `responseModalities` to include `audio`.
final config = GenerationConfig(
  responseModalities: [ResponseModality.audio],
  speechConfig: multiSpeechConfig,
);

// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
final model = FirebaseAI.googleAI().generativeModel(
  model: 'gemini-3.1-flash-tts-preview',
  config: config,
);

// Provide a text prompt that includes the names of the speakers.
final prompt = '''
Joe: How's it going today Jane?
Jane: Not too bad, how about you?
''';

// Call `generateContent` to generate the speech output based on your text prompt.
final response = await model.generateContent([Content.text(prompt)]);

// Extract the audio data and handle it for downstream use. For example:
final part = response.candidates.first.content.parts.first;
if (part is InlineDataPart && part.mimeType.startsWith('audio/')) {
  final Uint8List pcmData = part.bytes;  // Raw PCM bytes (24kHz, 1 channel, 16-bit)

  // To play back PCM audio data, you'll need to write your own `playAudio` function.
  await playAudio(pcmData);
}

وحدت


using Firebase.AI;

// Configure a `SpeechConfig` for multiple speakers, assigning a voice to each speaker.
var multiSpeakerVoiceConfig = new MultiSpeakerVoiceConfig(
  new System.Collections.Generic.List<SpeakerVoiceConfig> {
    SpeakerVoiceConfig.UsePrebuiltVoice("Joe", "Puck"),
    SpeakerVoiceConfig.UsePrebuiltVoice("Jane", "Kore")
  }
);

var multiSpeechConfig = SpeechConfig.UseMultiSpeakerVoice(multiSpeakerVoiceConfig);

// Set `responseModalities` to include `Audio`.
var config = new GenerationConfig(
  responseModalities: new System.Collections.Generic.List<ResponseModality> { ResponseModality.Audio },
  speechConfig: multiSpeechConfig
);

// Initialize the Gemini Developer API backend service.
var ai = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());

// Create a `GenerativeModel` instance with a model that supports speech generation.
var model = ai.GetGenerativeModel(
  modelName: "gemini-3.1-flash-tts-preview",
  generationConfig: config
);

// Provide a text prompt that includes the names of the speakers.
var prompt = "Joe: How's it going today Jane?\nJane: Not too bad, how about you?";

// Call `GenerateContentAsync` to generate the speech output based on your text prompt.
var response = await model.GenerateContentAsync(prompt);

// Extract the audio data and handle it for downstream use. For example:
if (response.Candidates.Count > 0) {
  foreach (var part in response.Candidates[0].Content.Parts) {
    if (part is ModelContent.InlineDataPart inlineData) {
      byte[] pcmData = inlineData.Data;  // Raw PCM bytes (24kHz, 1 channel, 16-bit)

      // To play back PCM audio data, you'll need to write your own `playAudio` function.
      playAudio(pcmData);
    }
  }
}

پاسخ را پخش کنید

قبل از امتحان کردن این نمونه، بخش «قبل از شروع» این راهنما را برای راه‌اندازی پروژه و برنامه خود تکمیل کنید.
در آن بخش، شما همچنین می‌توانید روی دکمه‌ای برای ارائه‌دهنده‌ی API Gemini انتخابی خود کلیک کنید تا محتوای خاص ارائه‌دهنده را در این صفحه مشاهده کنید .

شما می‌توانید با پخش همزمان پاسخ صوتی و دریافت آن، به جای انتظار برای تکمیل کل فایل صوتی، به تعاملات سریع‌تر و تأخیر کمتر دست یابید.

پخش جریانی گفتار تولید شده برای هر دو پیکربندی تک بلندگو و چند بلندگو پشتیبانی می‌شود. این قابلیت فقط هنگام استفاده از مدل‌های Gemini 3.x TTS پشتیبانی می‌شود.

برای پخش جریانی پاسخ گفتار، به جای generateContent تابع generateContentStream را فراخوانی کنید و تکه‌های داده را به محض رسیدن مدیریت کنید. مثال‌های زیر نحوه پخش جریانی پاسخ تک‌گوینده را نشان می‌دهند:

سویفت


import FirebaseAILogic

// Initialize the Gemini Developer API backend service.
let ai = FirebaseAI.firebaseAI(backend: .googleAI())

// Set `responseModalities` to include `audio`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
let config = GenerationConfig(
  responseModalities: [.audio],
  speechConfig: SpeechConfig(voiceName: "Kore")
)

// Create a `GenerativeModel` instance with a model that supports speech generation.
let model = ai.generativeModel(
  modelName: "gemini-3.1-flash-tts-preview",
  generationConfig: config
)

// Provide a text prompt.
let prompt = "Tell me a story about a brave knight."

// Call `generateContentStream` to generate the speech output stream based on your text prompt.
let responseStream = try model.generateContentStream(prompt)

// Extract the audio data and handle it for downstream use. For example:
for try await chunk in responseStream {
  for part in chunk.inlineDataParts {
    let data = part.data          // Raw PCM audio bytes (24kHz, 1 channel, 16-bit)
    let mimeType = part.mimeType  // for example: "audio/pcm"

    // Append the audio chunk to your audio queue/buffer for playback.
    appendAudioChunk(data)
  }
}

Kotlin

برای کاتلین، متدهای موجود در این SDK توابع suspend هستند و باید از یک scope کوروتین فراخوانی شوند.

// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
val config = generationConfig {
    responseModalities = listOf(ResponseModality.AUDIO)
    speechConfig = SpeechConfig(voice = Voice("Kore"))
}

// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-3.1-flash-tts-preview",
        generationConfig = config
    )

// Provide a text prompt.
val prompt = "Tell me a story about a brave knight."

// Call `generateContentStream` to generate the speech output stream based on your text prompt.
// Extract the audio data and handle it for downstream use.
model.generateContentStream(prompt).collect { chunk ->
    val part = chunk.candidates.firstOrNull()?.content?.parts?.firstOrNull()
    if (part is InlineDataPart) {
        val pcmChunk = part.inlineData  // Raw PCM bytes (24kHz, 1 channel, 16-bit)
        val mimeType = part.mimeType    // for example: "audio/pcm"

        // Append the audio chunk to your audio queue/buffer for playback.
        appendAudioChunk(pcmChunk)
    }
}

Java

برای جاوا، متدهای استریمینگ در این SDK یک نوع Publisher از کتابخانه Reactive Streams برمی‌گردانند.

// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
GenerationConfig config = new GenerationConfig.Builder()
    .setResponseModalities(Collections.singletonList(ResponseModality.AUDIO))
    .setSpeechConfig(new SpeechConfig(new Voice("Kore")))
    .build();

// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
        .generativeModel("gemini-3.1-flash-tts-preview", config);

GenerativeModelFutures model = GenerativeModelFutures.from(ai);

// Provide a text prompt.
String prompt = "Tell me a story about a brave knight.";
Content content = new Content.Builder().addText(prompt).build();

// Call `generateContentStream` to generate the speech output stream based on your text prompt.
Publisher<GenerateContentResponse> streamingResponse =
    model.generateContentStream(content);

// Extract the audio data and handle it for downstream use.
streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
  @Override
  public void onSubscribe(Subscription s) {
      s.request(Long.MAX_VALUE);
  }

  @Override
  public void onNext(GenerateContentResponse chunk) {
      Part part = chunk.getCandidates().get(0).getContent().getParts().get(0);
      if (part instanceof InlineDataPart) {
          byte[] pcmChunk = ((InlineDataPart) part).getInlineData();  // Raw PCM bytes (24kHz, 1 channel, 16-bit)
          String mimeType = ((InlineDataPart) part).getMimeType();    // for example: "audio/pcm"

          // Append the audio chunk to your audio queue/buffer for playback.
          appendAudioChunk(pcmChunk);
      }
  }

  @Override
  public void onComplete() {
      // Audio stream complete.
  }

  @Override
  public void onError(Throwable t) {
      t.printStackTrace();
  }
});

Web


import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend, ResponseModality } from "firebase/ai";

// TODO(developer): Replace with your app's Firebase configuration
const firebaseConfig = { /* ... */ };
const firebaseApp = initializeApp(firebaseConfig);

// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
const generationConfig = {
  responseModalities: [ResponseModality.AUDIO],
  speechConfig: {
    voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } }
  }
};

// Create a `GenerativeModel` instance with a model that supports speech generation.
const model = getGenerativeModel(ai, {
  model: "gemini-3.1-flash-tts-preview",
  generationConfig
});

// Provide a text prompt.
const prompt = "Tell me a story about a brave knight.";

// Call `generateContentStream` to generate the speech output stream based on your text prompt.
const result = await model.generateContentStream(prompt);

// Extract the audio data and handle it for downstream use. For example:
const playbackQueue = [];
for await (const chunk of result.stream) {
  const inlineDataParts = chunk.inlineDataParts();
  if (inlineDataParts?.[0]) {
    const pcmBase64 = inlineDataParts[0].inlineData.data;  // Raw PCM bytes (24kHz, 1 channel, 16-bit)
    const pcmBuffer = Uint8Array.from(atob(pcmBase64), c => c.charCodeAt(0)).buffer;

    // Append the audio chunk to your audio queue/buffer for playback.
    playbackQueue.push(pcmBuffer);
  }
}

// To play back an array of PCM buffers in sequence, you'll need to write your own `processPlaybackQueue` function.
processPlaybackQueue(playbackQueue);

Dart


import 'package:firebase_ai/firebase_ai.dart';

// Set `responseModalities` to include `audio`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
final config = GenerationConfig(
  responseModalities: [ResponseModality.audio],
  speechConfig: SpeechConfig(voiceName: 'Kore'),
);

// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
final model = FirebaseAI.googleAI().generativeModel(
  model: 'gemini-3.1-flash-tts-preview',
  config: config,
);

// Provide a text prompt.
final prompt = 'Tell me a story about a brave knight.';

// Call `generateContentStream` to generate the speech output stream based on your text prompt.
final responseStream = model.generateContentStream([Content.text(prompt)]);

// Extract the audio data and handle it for downstream use. For example:
await for (final chunk in responseStream) {
  final part = chunk.candidates.first.content.parts.first;
  if (part is InlineDataPart && part.mimeType.startsWith('audio/')) {
    final Uint8List pcmChunk = part.bytes;  // Raw PCM bytes (24kHz, 1 channel, 16-bit)

    // Append the audio chunk to your audio queue/buffer for playback.
    appendAudioChunk(pcmChunk);
  }
}

وحدت


using System.Collections.Generic;
using System.Linq;
using Firebase.AI;

// Initialize the Gemini Developer API backend service.
var ai = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());

// Set `ResponseModalities` to include `Audio`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
var config = new GenerationConfig(
    responseModalities: new List<ResponseModality> { ResponseModality.Audio },
    speechConfig: SpeechConfig.UsePrebuiltVoice("Kore")
);

// Create a `GenerativeModel` instance with a model that supports speech generation.
var model = ai.GetGenerativeModel(
    modelName: "gemini-3.1-flash-tts-preview",
    generationConfig: config
);

// Provide a text prompt.
var prompt = "Tell me a story about a brave knight.";

// Call `GenerateContentStreamAsync` to generate the speech output stream based on your text prompt.
var responseStream = model.GenerateContentStreamAsync(prompt);

// Extract the audio data and handle it for downstream use. For example:
await foreach (var response in responseStream)
{
    var audioParts = response.Candidates.FirstOrDefault().Content.Parts
                            .OfType<ModelContent.InlineDataPart>();

    foreach (var part in audioParts)
    {
        byte[] pcmChunk = part.Data; // Raw PCM bytes (24kHz, 1 channel, 16-bit)

        // Append the audio chunk to your audio queue/buffer for playback.
        appendAudioChunk(pcmChunk);
    }
}



کنترل خروجی گفتار با استفاده از اعلان‌ها

شما می‌توانید با استفاده از تکنیک‌های خاصِ ترغیب، بر لحن، سرعت و سبک گفتار تولید شده تأثیر بگذارید.

بخش‌های فرعی زیر در مورد ساختار اعلان و برچسب‌های صوتی ، راهنمایی‌های سطح بالا را شرح می‌دهند. برای راهنمایی دقیق، به این راهنمای اعلان مراجعه کنید.

ساختار سریع

برای بهترین نتیجه، ساختار درخواست خود را با اجزای زیر تنظیم کنید:

  • Audio Profile : شخصیت، هویت اصلی و الگوی گوینده را شرح دهید (برای مثال، A warm, professional narrator ).

  • Scene : محیط و حال و هوای احساسی را توصیف کنید (مثلاً In a quiet library یا Amidst a noisy crowd ).

  • Director's Notes : احساس، سرعت، سبک و لهجه را توصیف کنید (برای مثال، Speak slowly and with mystery ).

  • Sample Context : به مدل یک نقطه شروع بدهید (برای مثال، The speaker is greeting a close friend ).

  • متن اصلی : متن اصلی که قرار است گفته شود. برای بهترین اجرا، مطمئن شوید که لحن و زمینه نوشتاری متن با مشخصات صدا و یادداشت‌های کارگردان همسو باشد.

مثال:

[Audio Profile: A young, energetic male voice]
[Scene: A lively sports broadcast]
[Director's Notes: Speak fast, with high energy and excitement]
[Sample Context: The game just ended with a last-second touchdown]
Welcome back fans! What an incredible game we're witnessing today!

برچسب‌های صوتی

شما می‌توانید تگ‌های قالب‌بندی را مستقیماً در اعلان متن خود وارد کنید تا عملکرد مدل را هدایت کنید.

برچسب‌های صوتی فقط هنگام استفاده از مدل‌های Gemini 3.x TTS پشتیبانی می‌شوند.

تگ‌های پرکاربرد عبارتند از:

  • [whispers] : نجوا کردن، زمزمه کردن
  • [laughs] : برای اینکه خنده را بیشتر کنیم
  • [giggles] : برای اضافه کردن خنده
  • [sighs] : برای اضافه کردن آه
  • [gasp] : برای اضافه کردن حس نفس نفس زدن
  • [shouting] : فریاد زدن
  • [excited] : با هیجان صحبت کردن
  • [serious] : جدی صحبت کردن
  • [sighs whispers] : احساسات ترکیبی (می‌توانید برچسب‌ها را با هم ترکیب کنید)

هنگام استفاده از برچسب‌های صوتی به نکات زیر توجه کنید:

  • فهرست جامعی وجود ندارد : فهرست ثابتی از برچسب‌های پشتیبانی‌شده وجود ندارد. می‌توانید احساسات و عبارات مختلف (مانند [bored] ، [sarcastically] یا حتی [like dracula] ) را آزمایش کنید تا ببینید خروجی چگونه تغییر می‌کند.

  • متن درخواست غیر انگلیسی : اگر متن درخواست شما به زبان انگلیسی نیست، برای بهترین نتیجه باید از برچسب‌های صوتی انگلیسی استفاده کنید.

مثال:

I have a secret to tell you. [whispers] I found the hidden treasure. [laughs] I can't believe it!



محدودیت‌ها و الزامات

هنگام استفاده از تولید گفتار، از محدودیت‌ها و الزامات زیر آگاه باشید:

  • پیکربندی چند بلندگو دقیقاً از 2 بلندگو پشتیبانی می‌کند.

  • ویژگی‌های زیر فقط هنگام استفاده از مدل‌های Gemini 3.x TTS پشتیبانی می‌شوند: پخش جریانی، برچسب‌های صوتی و زبان‌های خودکار شناسایی‌شده اضافی.

محدودیت‌های gemini-3.1-flash-tts-preview

  • ناهماهنگی صدا : اگر لحن و متن درخواست شما با مشخصات گوینده همسو نباشد (مثلاً صدای بم مردانه که سعی می‌کند مانند یک دختر جوان صحبت کند)، ممکن است خروجی مدل همیشه دقیقاً با گوینده انتخاب شده مطابقت نداشته باشد. مطمئن شوید که متن درخواست شما با صدا مطابقت دارد.
  • خروجی‌های طولانی‌تر : کیفیت و ثبات گفتار ممکن است برای فایل‌های صوتی طولانی‌تر از چند دقیقه افت کند. توصیه می‌کنیم متن‌های طولانی را به بخش‌های کوچک‌تر تقسیم کنید.
  • برگرداندن گاه به گاه توکن‌های متنی : مدل گاهی اوقات به جای توکن‌های صوتی، توکن‌های متنی را برمی‌گرداند و باعث می‌شود درخواست با خطای 500 شکست بخورد. از آنجا که این اتفاق به طور تصادفی در درصد کمی از درخواست‌ها رخ می‌دهد، باید منطق تلاش مجدد را در برنامه خود پیاده‌سازی کنید.
  • رد اشتباه طبقه‌بندی‌کننده : درخواست‌های مبهم ممکن است طبقه‌بندی‌کننده سنتز گفتار را با شکست مواجه کنند و منجر به رد درخواست ( PROHIBITED_CONTENT ) شوند یا باعث شوند مدل دستورالعمل‌های سبک شما را با صدای بلند بخواند. برای جلوگیری از این امر، از یک درخواست ساختاریافته با مقدمه‌ای واضح (مانند Audio Profile و Director's Notes ) در ابتدای درخواست استفاده کنید.



صداها و زبان‌های پشتیبانی‌شده

مدل‌های Gemini TTS ورودی متن را دریافت کرده و خروجی صوتی تولید می‌کنند، بنابراین پاسخ، خودِ گفتار سنتز شده است. زیربخش‌های زیر، صداها و زبان‌های پشتیبانی‌شده‌ای را که مدل‌های Gemini TTS می‌توانند «صحبت کنند» (یا به آن‌ها پاسخ دهند) فهرست می‌کنند.

صداها چندزبانه هستند، به این معنی که می‌توانید از یک صدا برای تولید گفتار به هر یک از زبان‌های پشتیبانی‌شده استفاده کنید. برای مثال، می‌توانید صدا را روی Kore تنظیم کنید و مجموعه‌ای از پیام‌های متنی را به زبان‌های اسپانیایی، هندی و ویتنامی ارسال کنید. پاسخ‌ها همگی با صدای کره‌ای، اما به هر یک از این زبان‌های مختلف، ارسال خواهند شد.

نام‌های صوتی

مدل‌های Gemini TTS از 30 صدای HD سینت سایز شده مختلف پشتیبانی می‌کنند که هر کدام ویژگی‌های متمایزی دارند. می‌توانید با باز کردن بخش زیر ، لیستی از گزینه‌های صدای پاسخ را مشاهده کرده و دموی هر صدا را بشنوید .

زبان‌ها

مدل‌های Gemini TTS می‌توانند به‌طور خودکار زبان‌های زیر را در پیام متنی شما تشخیص دهند. گفتار تولید شده به آن زبان خواهد بود.

توجه داشته باشید که می‌توانید به صورت اختیاری و صریح، کد زبان را در پیکربندی گفتار خود تنظیم کنید .

زبان‌های پشتیبانی‌شده توسط همه مدل‌های تولید صدا
زبان کد BCP-47 زبان کد BCP-47
عربی (مصری) ar-EG آلمانی (آلمان) د-DE
انگلیسی (آمریکایی) انگلیسی-آمریکایی اسپانیایی (آمریکایی) es-US
فرانسوی (فرانسه) fr-FR هندی (هند) سلام-ورودی
اندونزیایی (اندونزیایی) شناسه-شناسه ایتالیایی (ایتالیا) فناوری اطلاعات
ژاپنی (ژاپن) جا-جی پی کره‌ای (کره) کو-کی‌آر
پرتغالی (برزیل) پی تی-بی آر روسی (روسیه) ru-RU
هلندی (هلند) nl-NL لهستانی (لهستان) پی ال-پی ال
تایلندی (تایلند) ام-ام ترکی (ترکیه) تر-تی‌آر
ویتنامی (ویتنام) vi-VN رومانیایی (رومانیایی) ro-RO
اوکراینی (اوکراین) انگلستان-آمریکا بنگالی (بنگلادش) بی ان-بی دی
انگلیسی (هند) بسته en-IN و hi-IN مراتی (هند) آقای-IN
تامیل (هند) تا-این تلوگو (هند) te-IN
زبان‌های اضافی پشتیبانی‌شده توسط مدل‌های ۳.x تولیدکننده صدا
زبان کد BCP-47 زبان کد BCP-47
آفریکانس اف فیلیپینی فیل
آلبانیایی مربع فنلاندی فی
امهری هستم گالیسیایی گل
ارمنی های گرجی کا
آذربایجانی آز یونانی ال
باسک اتحادیه اروپا گجراتی گو
بلاروسی باش کریول هائیتیایی اچ تی
بلغاری بی جی عبری او
برمه‌ای من مجارستانی هو
کاتالان حدود ایسلندی است
سبوانو سی بی جاوه ای جی وی
چینی، ماندارین سی ام ان کانارا کن
کرواتی ساعت کونکانی کوک
چک سی اس لائو لو
دانمارکی دا لاتین لا
استونیایی و لتونیایی lv
لیتوانیایی آن لوکزامبورگی پوند
مقدونی مک میثیلی مای
مالاگاسیایی میلی‌گرم مالایی ام‌اس
مالایالامی میلی‌لیتر مغولی من
نپالی نه نروژی، بوکمال توجه
نروژی، نینورسک ان اودیا یا
پشتو ص فارسی فا
پنجابی پا صربی اس آر
سندی اس دی سینهالی سی
اسلواکی اسک اسلوونیایی اس ال
سواحیلی جنوب غربی سوئدی اس وی
اردو تو

(اختیاری) تنظیم صریح کد زبان

اگر در پیکربندی گفتار خود کد زبان را مشخص نکنید، مدل به طور خودکار زبان موجود در اعلان متنی شما را تشخیص می‌دهد .

با این حال، می‌توانید به صورت اختیاری زبان را به طور صریح تنظیم کنید (با استفاده از پارامتر languageCode در پیکربندی گفتار). برای انجام این کار، باید از یکی از کدهای محلی پشتیبانی شده BCP-47 زیر استفاده کنید:

  • عربی : ar-XA
  • بنگالی : bn-IN
  • چینی (ماندارین) : cmn-CN
  • هلندی : nl-NL
  • انگلیسی : en-US ، en-GB ، en-AU ، en-IN
  • فرانسوی : fr-FR , fr-CA
  • آلمانی : de-DE
  • گجراتی : gu-IN
  • هندی : hi-IN
  • اندونزیایی : id-ID
  • ایتالیایی : it-IT
  • ژاپنی : ja-JP
  • کانارا : kn-IN
  • کره‌ای : ko-KR
  • مالایایی : ml-IN
  • مراتی : mr-IN
  • لهستانی : pl-PL
  • پرتغالی : pt-BR
  • روسی : ru-RU
  • اسپانیایی : es-US ، es-ES
  • تامیل : ta-IN
  • تلوگو : te-IN
  • تایلندی : th-TH
  • ترکی : tr-TR
  • ویتنامی : vi-VN



چه کار دیگری می‌توانید انجام دهید؟

قابلیت‌های دیگر را امتحان کنید

آموزش کنترل تولید محتوا

شما همچنین می‌توانید با استفاده از دستورات و پیکربندی‌های مدل، آزمایش کنید و حتی یک قطعه کد تولید شده با استفاده از Google AI Studio دریافت کنید.

درباره مدل‌های پشتیبانی‌شده بیشتر بدانید

درباره مدل‌های موجود برای موارد استفاده مختلف و سهمیه‌ها و قیمت‌گذاری آنها اطلاعات کسب کنید.


درباره تجربه خود با Firebase AI Logic بازخورد دهید