Pembuatan text-to-speech (TTS) menggunakan Gemini API


Anda dapat meminta model TTS Gemini untuk menghasilkan output ucapan (audio) dari perintah teks. Saat menggunakan Firebase AI Logic, Anda dapat membuat permintaan ini langsung dari aplikasi Anda.

Pembuatan text-to-speech (TTS) dapat dikontrol, yang berarti Anda memberikan teks yang sama persis untuk disintesis menjadi ucapan. Selain itu, Anda dapat menggunakan bahasa alami dalam perintah untuk memandu gaya, aksen, kecepatan, dan nada output audio. Anda dapat menganggap TTS sebagai kebalikan dari transkripsi (speech-to-text).

Fitur ini tersedia menggunakan salah satu model Gemini -tts, yang dioptimalkan untuk pembuatan ucapan berkualitas tinggi dengan latensi rendah.

Dengan kemampuan ini, Anda dapat melakukan hal-hal seperti:

  • Penceritaan interaktif: Buat buku audio atau game bermain peran yang imersif, di mana model mengganti suara untuk karakter yang berbeda atau menyesuaikan nada suaranya (seperti berbisik dalam ketegangan atau tertawa saat mendengar lelucon) agar sesuai dengan narasi.

  • Pembelajaran bahasa: Buat panduan pengucapan yang dapat membaca teks dengan aksen regional tertentu atau dengan kecepatan yang lebih lambat untuk membantu pelajar berlatih pengucapan yang sulit.

  • Pembaca konten yang sadar konteks: Membaca artikel berita, resep, atau postingan blog dengan keras menggunakan persona suara dan nada emosional yang sesuai dengan konten (seperti nada serius untuk berita terbaru atau nada hangat dan sabar untuk petunjuk memasak langkah demi langkah).

Panduan ini menunjukkan cara menghasilkan ucapan dari input teks dengan satu atau beberapa pembicara dan cara melakukan streaming respons audio.

Langsung ke kode untuk speaker tunggal Langsung ke kode untuk multi-speaker Langsung ke kode untuk respons yang di-streaming

Perbandingan antara TTS dan Live API

Model text-to-speech (TTS) dan model Live API adalah model pembuatan ucapan dengan latensi rendah yang dapat dikonfigurasi untuk berbagai suara dan bahasa respons. Namun, keduanya melayani kasus penggunaan yang sangat berbeda.

  • Pembuatan text-to-speech (TTS) adalah interaksi permintaan-respons satu arah (teks masuk, audio keluar). Fitur ini dibuat khusus untuk skenario yang memerlukan pembacaan kata demi kata dari teks yang diberikan dengan kontrol terperinci atas gaya dan suara, seperti narasi podcast, buku audio, atau pembacaan artikel.

  • Pembuatan Live API mendukung streaming dua arah untuk percakapan suara real-time (suara masuk, suara keluar). Model ini unggul dalam konteks percakapan dinamis di mana model memutuskan ucapan yang sesuai untuk diberikan. Perhatikan bahwa model Live API terbaru juga mendukung input video dan gambar.

Sebelum memulai

Klik penyedia Gemini API untuk melihat konten dan kode khusus penyedia di halaman ini.

Jika belum melakukannya, selesaikan panduan memulai, yang menjelaskan cara menyiapkan project Firebase, menghubungkan aplikasi ke Firebase, menambahkan SDK, menginisialisasi layanan backend untuk penyedia Gemini API yang Anda pilih, dan membuat instance GenerativeModel.

Untuk menguji dan melakukan iterasi pada perintah Anda, sebaiknya gunakan Google AI Studio.

Model yang mendukung kemampuan ini

  • gemini-3.1-flash-tts-preview

Membuat ucapan dari teks

Anda dapat menghasilkan ucapan dari teks yang diberikan menggunakan model TTS Gemini.

Membuat ucapan dengan satu pembicara

Sebelum mencoba sampel ini, selesaikan bagian Sebelum memulai dalam panduan ini untuk menyiapkan project dan aplikasi Anda.
Di bagian tersebut, Anda juga akan mengklik tombol untuk penyedia Gemini API yang Anda pilih sehingga Anda dapat melihat konten khusus penyedia di halaman ini.

Anda dapat mengonfigurasi model untuk menghasilkan output audio menggunakan satu suara.

Di GenerationConfig Anda, sertakan kode berikut:

Panggil generateContent dengan perintah teks Anda. Model menampilkan data audio PCM mentah di bagian respons.

Swift


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

Untuk Kotlin, metode dalam SDK ini adalah fungsi penangguhan dan perlu dipanggil dari cakupan Coroutine.

// 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

Untuk Java, metode streaming di SDK ini menampilkan jenis Publisher dari library 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);
}

Unity


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);
    }
  }
}

Membuat ucapan dengan beberapa pembicara

Sebelum mencoba sampel ini, selesaikan bagian Sebelum memulai dalam panduan ini untuk menyiapkan project dan aplikasi Anda.
Di bagian tersebut, Anda juga akan mengklik tombol untuk penyedia Gemini API yang Anda pilih sehingga Anda dapat melihat konten khusus penyedia di halaman ini.

Anda dapat mengonfigurasi model untuk menggunakan suara yang berbeda untuk pembicara yang berbeda dalam teks. Hal ini berguna untuk membuat audio untuk dialog atau percakapan.

  1. Buat MultiSpeakerVoiceConfig yang memetakan nama speaker (yang akan Anda gunakan dalam perintah) ke nama suara respons tertentu (misalnya, Kore).

    Konfigurasi multi-pembicara mendukung tepat 2 pembicara.

  2. Di GenerationConfig Anda, sertakan kode berikut:

    • Tetapkan responseModalities untuk menyertakan AUDIO.

    • Konfigurasi SpeechConfig dengan hal berikut:

  3. Dalam perintah Anda, tunjukkan siapa yang berbicara dengan menggunakan nama pembicara sebagai awalan (misalnya, Joe: Hello. Jane: Hi.).

Panggil generateContent dengan perintah teks Anda. Model menampilkan data audio PCM mentah di bagian respons.

Swift


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

Untuk Kotlin, metode dalam SDK ini adalah fungsi penangguhan dan perlu dipanggil dari cakupan Coroutine.

// 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

Untuk Java, metode streaming di SDK ini menampilkan jenis Publisher dari library 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);
}

Unity


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);
    }
  }
}

Streaming respons

Sebelum mencoba sampel ini, selesaikan bagian Sebelum memulai dalam panduan ini untuk menyiapkan project dan aplikasi Anda.
Di bagian tersebut, Anda juga akan mengklik tombol untuk penyedia Gemini API yang Anda pilih sehingga Anda dapat melihat konten khusus penyedia di halaman ini.

Anda dapat mencapai interaksi yang lebih cepat dan latensi yang lebih rendah dengan men-streaming respons audio saat dihasilkan, alih-alih menunggu hingga seluruh file audio selesai.

Streaming ucapan yang dihasilkan didukung untuk konfigurasi single-speaker dan multi-speaker. Hanya didukung saat menggunakan model Gemini 3.x TTS.

Untuk melakukan streaming respons ucapan, panggil generateContentStream, bukan generateContent, dan tangani potongan saat tiba. Contoh berikut menunjukkan cara melakukan streaming respons satu penutur:

Swift


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

Untuk Kotlin, metode dalam SDK ini adalah fungsi penangguhan dan perlu dipanggil dari cakupan Coroutine.

// 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

Untuk Java, metode streaming di SDK ini menampilkan jenis Publisher dari library 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);
  }
}

Unity


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);
    }
}



Mengontrol output ucapan dengan perintah

Anda dapat memengaruhi nada, kecepatan, dan gaya ucapan yang dihasilkan menggunakan teknik perintah tertentu.

Sub-bagian berikut tentang struktur perintah dan tag audio menjelaskan panduan tingkat tinggi. Untuk panduan mendetail, lihat panduan perintah ini.

Struktur perintah

Untuk mendapatkan hasil terbaik, susun perintah Anda dengan komponen berikut:

  • Audio Profile: Jelaskan persona, identitas inti, dan arketipe pembicara (misalnya, A warm, professional narrator).

  • Scene: Jelaskan lingkungan dan suasana emosional (misalnya, In a quiet library atau Amidst a noisy crowd).

  • Director's Notes: Jelaskan emosi, kecepatan, gaya, dan aksen (misalnya, Speak slowly and with mystery).

  • Sample Context: Beri model titik awal (misalnya, The speaker is greeting a close friend).

  • Transkrip: Teks sebenarnya yang akan diucapkan. Untuk performa terbaik, pastikan gaya bahasa dan konteks teks yang ditulis selaras dengan profil suara dan catatan sutradara.

Contoh perintah:

[Audio Profile: A young, energetic 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!

Tag audio

Anda dapat menyisipkan tag pemformatan langsung ke perintah teks untuk memandu performa model.

Tag audio hanya didukung saat menggunakan model Gemini 3.x TTS.

Tag yang umum digunakan meliputi:

  • [whispers]: Untuk berbicara dengan berbisik
  • [laughs]: Untuk menambahkan tawa
  • [giggles]: Untuk menambahkan tawa
  • [sighs]: Untuk menambahkan desahan
  • [gasp]: Untuk menambahkan reaksi terkejut
  • [shouting]: Untuk berteriak
  • [excited]: Berbicara dengan bersemangat
  • [serious]: Berbicara dengan serius
  • [sighs whispers]: Emosi gabungan (Anda dapat menggabungkan tag)

Perhatikan hal-hal berikut saat menggunakan tag audio:

  • Tidak ada daftar lengkap: Tidak ada daftar tetap tag yang didukung. Anda dapat bereksperimen dengan berbagai emosi dan ekspresi (seperti [bored], [sarcastically], atau bahkan [like dracula]) untuk melihat perubahan output.

  • Perintah teks non-Inggris: Jika perintah teks Anda tidak dalam bahasa Inggris, Anda tetap harus menggunakan tag audio dalam bahasa Inggris untuk mendapatkan hasil terbaik.

Contoh perintah:

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



Batasan dan persyaratan

Perhatikan batasan dan persyaratan berikut saat menggunakan pembuatan ucapan:

  • Konfigurasi multi-pembicara mendukung tepat 2 pembicara.

  • Fitur berikut hanya didukung saat menggunakan model Gemini 3.x TTS: streaming, tag audio, dan bahasa tambahan yang terdeteksi otomatis.

Batasan untuk gemini-3.1-flash-tts-preview

  • Ketidaksesuaian suara: Output model mungkin tidak selalu sesuai dengan speaker yang dipilih jika nada dan konteks perintah Anda tidak sesuai dengan profil speaker (misalnya, suara pria berat yang mencoba berbicara seperti gadis muda). Pastikan konteks perintah Anda cocok dengan suara.
  • Output yang lebih panjang: Kualitas dan konsistensi ucapan mungkin berubah untuk audio yang berdurasi lebih dari beberapa menit. Sebaiknya bagi perintah teks panjang menjadi beberapa bagian yang lebih kecil.
  • Pengembalian token teks sesekali: Model terkadang menampilkan token teks, bukan token audio, sehingga menyebabkan permintaan gagal dengan error 500. Karena hal ini terjadi secara acak dalam sebagian kecil permintaan, Anda harus menerapkan logika percobaan ulang di aplikasi Anda.
  • Penolakan salah pengklasifikasi: Perintah yang tidak jelas dapat gagal dalam pengklasifikasi sintesis ucapan, sehingga permintaan ditolak (PROHIBITED_CONTENT) atau menyebabkan model membaca petunjuk gaya Anda dengan keras. Untuk menghindarinya, gunakan perintah terstruktur dengan pengantar yang jelas (seperti Audio Profile dan Director's Notes) di awal perintah.



Suara dan bahasa yang didukung

Model TTS Gemini menerima input teks dan menghasilkan output audio, sehingga responsnya adalah ucapan yang disintesis itu sendiri. Subbagian berikut mencantumkan suara dan bahasa yang didukung yang dapat digunakan model TTS Gemini untuk "berbicara" (atau merespons).

Suara ini multibahasa, yang berarti Anda dapat menggunakan suara yang sama untuk menghasilkan ucapan dalam bahasa yang didukung. Misalnya, Anda dapat menyetel suara ke Kore dan mengirim serangkaian perintah teks dalam bahasa Spanyol, Hindi, dan Vietnam. Respons akan semuanya dalam suara Kore, tetapi dalam setiap bahasa yang berbeda tersebut.

Nama suara

Model TTS Gemini mendukung 30 suara HD yang disintesis berbeda, masing-masing dengan karakteristik yang berbeda. Anda dapat melihat daftar opsi suara respons dan mendengar demo setiap suara dengan meluaskan bagian di bawah.

Languages

Model TTS Gemini dapat mendeteksi secara otomatis bahasa berikut dalam perintah teks Anda. Ucapan yang dihasilkan akan dalam bahasa tersebut.

Perhatikan bahwa Anda dapat secara opsional menetapkan kode bahasa secara eksplisit dalam konfigurasi ucapan Anda.

Bahasa yang didukung oleh semua model pembuat audio
Bahasa Kode BCP-47 Bahasa Kode BCP-47
Arab (Mesir) ar-EG Jerman (Jerman) de-DE
Inggris (AS) en-US Spanyol (AS) es-US
Prancis (Prancis) fr-FR Hindi (India) hi-IN
Indonesia (Indonesia) id-ID Italia (Italia) it-IT
Jepang (Jepang) ja-JP Korea (Korea) ko-KR
Portugis (Brasil) pt-BR Rusia (Rusia) ru-RU
Belanda (Belanda) nl-NL Polandia (Polandia) pl-PL
Thai (Thailand) th-TH Turkiye (Turkiye) tr-TR
Vietnam (Vietnam) vi-VN Rumania (Rumania) ro-RO
Ukraina (Ukraina) uk-UA Bengali (Bangladesh) bn-BD
Inggris (India) Paket en-IN & hi-IN Marathi (India) mr-IN
Tamil (India) ta-IN Telugu (India) te-IN
Bahasa tambahan yang didukung oleh model 3.x penghasil audio
Bahasa Kode BCP-47 Bahasa Kode BCP-47
Afrika af Filipina fil
Albania sq Finlandia fi
Amhara am Galisia gl
Armenia hy Georgia ka
Azerbaijani az Yunani el
Basque eu Gujarati gu
Belarusia be Kreol Haiti ht
Bulgaria bg Ibrani he
Burma my Hungaria hu
Catalan ca Islandia -
Cebuano ceb Jawa jv
China, Mandarin cmn Kannada kn
Kroasia jam Konkani kok
Ceko cs Laos lo
Denmark da Latin la
Estonia et Latvia lv
Lituania lt Luksemburg lb
Makedonia mk Maithili mai
Malagasi mg Melayu ms
Malayalam ml Mongolia mn
Nepali ne Norwegia, Bokmål nb
Norwegia, Nynorsk nn Odia atau
Pashto ps Dari Persia fa
Punjabi pa Serbia sr
Sindhi sd Sinhala si
Slovak sk Slovenia sl
Swahili sw Swedia sv
Urdu ur

(Opsional) Menetapkan kode bahasa secara eksplisit

Jika Anda tidak menentukan kode bahasa dalam konfigurasi ucapan, model akan mendeteksi bahasa secara otomatis dalam perintah teks Anda.

Namun, Anda dapat secara opsional menetapkan bahasa secara eksplisit (menggunakan parameter languageCode dalam konfigurasi ucapan). Untuk melakukannya, Anda harus menggunakan salah satu kode lokalitas BCP-47 yang didukung berikut:

  • Arab: ar-XA
  • Bengali: bn-IN
  • China (Mandarin): cmn-CN
  • Belanda: nl-NL
  • Inggris: en-US, en-GB, en-AU, en-IN
  • Prancis: fr-FR, fr-CA
  • Jerman: de-DE
  • Gujarat: gu-IN
  • Hindi: hi-IN
  • Indonesia: id-ID
  • Italia: it-IT
  • Jepang: ja-JP
  • Kannada: kn-IN
  • Korea: ko-KR
  • Malayalam: ml-IN
  • Marathi: mr-IN
  • Polandia: pl-PL
  • Portugis: pt-BR
  • Rusia: ru-RU
  • Spanyol: es-US, es-ES
  • Tamil: ta-IN
  • Telugu: te-IN
  • Thailand: th-TH
  • Turkiye: tr-TR
  • Vietnam: vi-VN



Kamu bisa apa lagi?

Mencoba kemampuan lain

Mempelajari cara mengontrol pembuatan konten

Anda juga dapat bereksperimen dengan perintah dan konfigurasi model, bahkan mendapatkan cuplikan kode yang dihasilkan menggunakan Google AI Studio.

Pelajari lebih lanjut model yang didukung

Pelajari model yang tersedia untuk berbagai kasus penggunaan serta kuota dan harganya.


Memberikan masukan tentang pengalaman Anda dengan Firebase AI Logic