Metin okuma üretimi (TTS)

Gemini API, Gemini metin okuma (TTS) oluşturma özelliklerini kullanarak metin girişini tek veya çok konuşmacılı sese dönüştürebilir. Metin okuma üretimi kontrol edilebilir. Bu sayede, sesin stilini, aksanını, hızını ve tonunu yönlendirmek için yapılandırılmış dönüş meta verilerini (speech_metadata) ve satır içi vokal etiketlerini birleştirebilirsiniz.

TTS özelliği, etkileşimli, yapılandırılmamış ses ve çok formatlı girişler ve çıkışlar için tasarlanmış Live API aracılığıyla sağlanan konuşma üretiminden farklıdır. Live API, dinamik sohbet bağlamlarında mükemmel performans gösterirken Gemini API aracılığıyla TTS, stil ve ses üzerinde ayrıntılı kontrolle metinlerin tam olarak okunmasını gerektiren senaryolar (ör. podcast veya sesli kitap oluşturma) için özel olarak tasarlanmıştır.

Bu kılavuzda, Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) ve Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) kullanarak metinden tek veya çok konuşmacılı ses üretme adımları açıklanmaktadır.

Başlamadan önce

Desteklenen modeller bölümünde listelenen bir Gemini TTS modeli kullandığınızdan emin olun. En iyi sonuçları elde etmek için iş yükünüze en uygun modeli seçmek üzere Hangi model ne zaman kullanılmalı? başlıklı makaleyi inceleyin.

Uygulama geliştirmeye başlamadan önce AI Studio'da Gemini TTS modellerini test etmeniz faydalı olabilir.

Tek konuşmacılı TTS

Metni Gemini 3.8 TTS modelleriyle tek konuşmacılı sese dönüştürmek için parts[].text içinde bire bir transkripti iletin, parts[].speech_metadata içinde dönüş seviyesinde stil oluşturmayı ekleyin ve speechConfig.voiceConfig içinde sesinizi yapılandırın. Önceden oluşturulmuş bir ses adı, Extended Voice Library kimliği, özel Voice Design kimliği (voice_...) veya ses kopyalama kimliği (voice_... ya da isteğe bağlı durum bilgisiz voicekey_...) iletebilirsiniz.

Bu örnekte, modelden gelen çıkış sesi bir WAV dosyasına kaydedilir:

Python

from google import genai

client = genai.Client()

response = client.models.generate_content(
    model="gemini-3.8-flash-tts",
    contents=[{
        "role": "user",
        "parts": [{
            "text": "Have a wonderful day!",
            "speech_metadata": {"style": "cheerful and friendly"},
        }],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {
            "voice_config": {"voice": "Kore"}
        },
    },
)

data = response.candidates[0].content.parts[0].inline_data.data
with open("out.wav", "wb") as f:
    f.write(data)

JavaScript

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

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

   const response = await ai.models.generateContent({
      model: 'gemini-3.8-flash-tts',
      contents: [{
         role: 'user',
         parts: [{
            text: 'Have a wonderful day!',
            speechMetadata: { style: 'cheerful and friendly' },
         }],
      }],
      config: {
         responseModalities: ['AUDIO'],
         speechConfig: {
            voiceConfig: { voice: 'Kore' },
         },
      },
   });

   const data = response.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
   const audioBuffer = Buffer.from(data, 'base64');

   fs.writeFileSync('out.wav', audioBuffer);
}
await main();

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash-tts:generateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
        "contents": [{
          "role": "user",
          "parts": [{
            "text": "Have a wonderful day!",
            "speech_metadata": {
              "style": "cheerful and friendly"
            }
          }]
        }],
        "generationConfig": {
          "responseModalities": ["AUDIO"],
          "speechConfig": {
            "voiceConfig": {
              "voice": "Kore"
            }
          }
        }
    }' | jq -r '.candidates[0].content.parts[0].inlineData.data' | \
          base64 --decode > out.wav

Birden fazla konuşmacı için TTS

Birden fazla konuşmacının yer aldığı diyaloglar için multiSpeakerVoiceConfig.speakerVoiceConfigs içinde prebuiltVoiceConfig kullanarak iki konuşmacı yapılandırın ve her diyalog dönüşünü ayrı bir part olarak speech_metadata ile birlikte iletin. speaker ve isteğe bağlı dönüş seviyesinde style belirtin:

Python

from google import genai

client = genai.Client()

response = client.models.generate_content(
    model="gemini-3.8-flash-tts",
    contents=[{
        "role": "user",
        "parts": [
            {
                "text": "How's it going today Jane?",
                "speech_metadata": {
                    "speaker": "Joe",
                    "style": "cheerful and friendly",
                },
            },
            {
                "text": "Not too bad, how about you? Ready to test these new voices?",
                "speech_metadata": {
                    "speaker": "Jane",
                    "style": "calm and relaxed",
                },
            },
        ],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {
            "multi_speaker_voice_config": {
                "speaker_voice_configs": [
                    {
                        "speaker": "Joe",
                        "voice_config": {
                            "prebuilt_voice_config": {"voice_name": "Puck"}
                        },
                    },
                    {
                        "speaker": "Jane",
                        "voice_config": {
                            "prebuilt_voice_config": {"voice_name": "Kore"}
                        },
                    },
                ]
            }
        },
    },
)

data = response.candidates[0].content.parts[0].inline_data.data
with open("out.wav", "wb") as f:
    f.write(data)

JavaScript

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

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

   const response = await ai.models.generateContent({
      model: 'gemini-3.8-flash-tts',
      contents: [{
         role: 'user',
         parts: [
            {
               text: "How's it going today Jane?",
               speechMetadata: {
                  speaker: 'Joe',
                  style: 'cheerful and friendly',
               },
            },
            {
               text: 'Not too bad, how about you? Ready to test these new voices?',
               speechMetadata: {
                  speaker: 'Jane',
                  style: 'calm and relaxed',
               },
            },
         ],
      }],
      config: {
         responseModalities: ['AUDIO'],
         speechConfig: {
            multiSpeakerVoiceConfig: {
               speakerVoiceConfigs: [
                  {
                     speaker: 'Joe',
                     voiceConfig: {
                        prebuiltVoiceConfig: { voiceName: 'Puck' },
                     },
                  },
                  {
                     speaker: 'Jane',
                     voiceConfig: {
                        prebuiltVoiceConfig: { voiceName: 'Kore' },
                     },
                  },
               ],
            },
         },
      },
   });

   const data = response.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
   const audioBuffer = Buffer.from(data, 'base64');

   fs.writeFileSync('out.wav', audioBuffer);
}

await main();

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash-tts:generateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [{
      "role": "user",
      "parts": [
        {
          "text": "How'\''s it going today Jane?",
          "speech_metadata": {
            "speaker": "Joe",
            "style": "cheerful and friendly"
          }
        },
        {
          "text": "Not too bad, how about you? Ready to test these new voices?",
          "speech_metadata": {
            "speaker": "Jane",
            "style": "calm and relaxed"
          }
        }
      ]
    }],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "multiSpeakerVoiceConfig": {
          "speakerVoiceConfigs": [
            {
              "speaker": "Joe",
              "voiceConfig": {
                "prebuiltVoiceConfig": { "voiceName": "Puck" }
              }
            },
            {
              "speaker": "Jane",
              "voiceConfig": {
                "prebuiltVoiceConfig": { "voiceName": "Kore" }
              }
            }
          ]
        }
      }
    }
  }' | jq -r '.candidates[0].content.parts[0].inlineData.data' | \
      base64 --decode > out.wav

Meta veriler ve etiketlerle konuşma stilini kontrol etme

Gemini 3.8 TTS, text alanını bire bir transkript olarak değerlendirir. Sahne talimatları okunmadan teslimatı kontrol etmek için talimatlarınızı kapsamlarına göre ayırın:

  • Sürekli dönüş seviyesinde yayınlama (speech_metadata.style): Bir dönüş boyunca geçerli olan duyguları, yayınlama stilini, prozodiyi, hızı ve hacmi speech_metadata.style içine yerleştirin (ör. "style": "whispered urgently", "style": "out of breath" veya "style": "warm and enthusiastic").
  • Anlık olaylar (satır içi etiketler): Köşeli parantezleri kullanarak (ör. "Wait... <short pause> did you hear that? <sigh>" veya "Excuse me <cough> as I was saying...") anlık konuşma dışı ses patlamalarını ya da duraklamaları doğrudan transkriptin içine yerleştirin.

Kapsamlı en iyi uygulamalar için İstem kılavuzu'na bakın.

Ses seçenekleri

Gemini 3.8 TTS, ses seçmek veya oluşturmak için dört yöntem sunar:

  1. Hazır stüdyo sesleri: Aşağıdaki tabloda listelenen 30 seçilmiş ses.
  2. Genişletilmiş Ses Kitaplığı: client.voices.list() (GET /v1beta/voices) kullanılarak erişilebilen, diller, aksanlar ve karakter arketipleri arasında yüzlerce ek ses.
  3. Ses tasarımı: Google AI Studio'da doğal dil açıklamasıyla veya POST /v1beta/voices (type="prompted", CreateVoice ve GetVoice'de kalıcı bir voice_... kimliği ve sample_audio WAV önizlemesi döndürür) kullanılarak özel bir vokal karakter oluşturun.
  4. Ses kopyalama: Google AI Studio'da veya POST /v1beta/voices (type="replicated", varsayılan olarak kalıcı store=True ya da isteğe bağlı durum bilgisiz store=False) kullanılarak referans ve izin verilen seslerden bir konuşmacının sesini kopyalayın.

Özel ses sınırları ve TTL

Ses türü Depolama modu Kota / sınır Elde tutma (TTL)
Durum bilgili sesler (voice_..., istemli veya kopyalanmış) store=True Proje başına 200 ses (istem verilen ve kopyalanan sesler arasında paylaşılır) Son kullanımdan itibaren 1 yıl*
Durumsuz ses anahtarları (voicekey_..., çoğaltılmış) store=False İstemci tarafından yönetilen 7 gün

* TTL uzantısı: 1 yıllık saklama penceresi, ses aktif olarak her kullanıldığında (sesle konuşma sentezlenerek veya remiksleme için temel ses olarak kullanılarak) sıfırlanır. 1 yıl boyunca etkinlik göstermeyen sesler otomatik olarak silinir.

Önceden oluşturulmuş sesler

Zephyr -- Parlak Puck -- Upbeat Charon -- Bilgilendirici
Kore -- Firm Fenrir -- Heyecanlı Leda -- Genç
Orus -- Firma Aoede -- Breezy Callirrhoe -- Sakin
Autonoe -- Parlak Enceladus -- Breathy Iapetus -- Temizle
Umbriel -- Rahat Algieba -- Pürüzsüz Despina -- Pürüzsüz
Erinome -- Temizle Algenib -- Boğuk Rasalgethi -- Bilgilendirici
Laomedeia -- Neşeli Achernar -- Soft Alnilam -- Firm
Schedar -- Even Gacrux -- Yetişkin Pulcherrima -- İleri
Achird -- Arkadaşça Zubenelgenubi -- Gündelik Vindemiatrix -- Nazik
Sadachbia -- Lively Sadaltager -- Bilgili Sulafat -- Sıcak

Genişletilmiş Ses Kitaplığı ve filtreleme

Önceki tabloda yer alan 30 stüdyo sesinin yanı sıra Genişletilmiş Ses Kitaplığı; diller, bölgesel aksanlar, karakter kişilikleri ve alanlar genelinde yüzlerce ek ses sunar. Google AI Studio'da tüm Ses Kitaplığı'na göz atabilir, filtreleyebilir ve etkileşimli olarak dinleyebilir ya da client.voices.list() (GET /v1beta/voices, google-genai 2.25.0+ / @google/genai 2.24.0+ kullanılarak) ile programatik olarak sorgulayabilirsiniz.

ListVoices, özel olarak saklanan seslerinizi (en yeni ilk sırada olacak şekilde sıralanır) ve ardından filtre ölçütlerinize uyan önceden oluşturulmuş katalog seslerini döndürür. Bir liste filtresi için birden fazla değer iletildiğinde, bu filtredeki herhangi bir değerle eşleşen sesler döndürülür (OR). Farklı filtre parametreleri ise AND ile birleştirilir:

Parametre Tür Açıklama
language_code list[str] BCP-47 dil etiketleri (örneğin, ["en-US", "en-GB"]). Büyük-küçük harfe duyarlı olmayan tam eşleşme.
region_code list[str] ISO 3166-1 alfa-2 veya UN M.49 bölge kodları (örneğin, ["US", "GB"]).
accent list[str] Bölgesel aksan tanımlayıcıları (örneğin, ["American", "British"]).
gender list[str] Algılanan cinsiyet sunumu ("female", "male" veya "neutral").
pitch list[str] Vokal perde sınıflandırması ("low", "medium" veya "high").
persona list[str] Vokal karakter veya karakter arketipi (örneğin, ["Warm, Friendly"], ["Narrator"]).
contexts (context REST'te) list[str] Optimum kullanım alanı (ör. ["Audiobook", "Conversational", "News"]).
type (type_ Python'da) list[str] Ses kaynağına göre filtreleme: "prebuilt", "prompted" (Ses tasarımı) veya "replicated" (Ses kopyalama).
search str Serbest metinli alt dize araması, hem display_name hem de description ile büyük/küçük harfe duyarsız şekilde eşleştirildi.
page_size int Sayfa başına döndürülen maksimum ses sayısı (varsayılan 50, maksimum 1000).
page_token str Sonraki sonuç sayfasını getirmek için response.next_page_token jetonu.

Python

from google import genai

client = genai.Client()

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

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

JavaScript

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

REST

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"

Desteklenen diller

TTS modelleri, giriş dilini otomatik olarak algılar. Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) 130'dan fazla dili, Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) ise 100'den fazla dili destekler:

Dil Gemini 3.8 Flash TTS Gemini 3.8 Flash-Lite TTS
Açece (Arap alfabesi) ✔️ ✔️
Afrikaanca ✔️ ✔️
Akan ✔️ ✔️
Amharca ✔️ ✔️
Ermenice ✔️ ✔️
Assamca ✔️ ✔️
Awadhi ✔️ ✔️
Bali dili ✔️ ✔️
Bengalce ✔️ ✔️
Banjar (Arap alfabesi) ✔️ —
Banjar (Latin alfabesi) ✔️ ✔️
Başkurtça ✔️ —
Baskça ✔️ ✔️
Belarusian ✔️ ✔️
Bemba ✔️ —
Bhojpuri ✔️ ✔️
Boşnakça ✔️ ✔️
Bugi ✔️ ✔️
Bulgarca ✔️ ✔️
Burmaca ✔️ —
Kantonca ✔️ ✔️
Katalanca ✔️ ✔️
Sabuanca ✔️ ✔️
Orta Kürtçe ✔️ ✔️
Chhattisgarhi ✔️ ✔️
Çince (Hans alfabesi) ✔️ ✔️
Çince (Hant alfabesi) ✔️ ✔️
Kırım Tatarcası ✔️ —
Hırvatça ✔️ ✔️
Çekya ✔️ ✔️
Danca ✔️ ✔️
Felemenkçe ✔️ ✔️
Dyula dili ✔️ —
Dzongka ✔️ —
Arapça (Mısır) ✔️ ✔️
İngilizce ✔️ ✔️
Estonca ✔️ ✔️
Filipince ✔️ ✔️
Fince ✔️ —
Fransızca ✔️ ✔️
Galiçyaca ✔️ ✔️
Ganda ✔️ ✔️
Gürcüce ✔️ ✔️
Almanca ✔️ ✔️
Greek ✔️ ✔️
Guarani ✔️ —
Güceratça ✔️ ✔️
Haiti Creole Dili ✔️ ✔️
Halh Moğolcası ✔️ ✔️
Hausaca ✔️ ✔️
İbranice ✔️ ✔️
Hintçe ✔️ ✔️
Macarca ✔️ ✔️
İzlandaca ✔️ ✔️
İgbo Dili ✔️ —
İloko ✔️ ✔️
Endonezce ✔️ ✔️
İran Farsçası ✔️ ✔️
İtalyanca ✔️ ✔️
Japonca ✔️ ✔️
Cava dili ✔️ ✔️
Kabyle ✔️ —
Kamba ✔️ ✔️
Kannada ✔️ ✔️
Keşmirce (Arap alfabesi) ✔️ ✔️
Keşmirce (Deva alfabesi) ✔️ ✔️
Kazakça ✔️ ✔️
Kmerce ✔️ ✔️
Kikuyu ✔️ ✔️
Ruandaca ✔️ ✔️
Kongo ✔️ ✔️
Korece ✔️ ✔️
Kırgızca ✔️ ✔️
Laoca ✔️ ✔️
Latgalian ✔️ —
Lingala ✔️ ✔️
Litvanca ✔️ —
Luxembourgish ✔️ —
Makedonca ✔️ ✔️
Magahi ✔️ ✔️
Maithili dili ✔️ ✔️
Malayalamca ✔️ ✔️
Maltaca ✔️ ✔️
Manipuri ✔️ ✔️
Marathi ✔️ ✔️
Minangkabau (Arap alfabesi) ✔️ ✔️
Minangkabau (Latn script) ✔️ —
Mizo ✔️ ✔️
Nepalce (bireysel dil) ✔️ ✔️
Nijerya Fula Dili ✔️ ✔️
Kuzey Azerbaycan ✔️ ✔️
Kuzey Sotho dili ✔️ ✔️
Kuzey Özbekistan ✔️ ✔️
Norveççe Bokmål ✔️ ✔️
Yeni Norveççe ✔️ ✔️
Nyanja ✔️ ✔️
Occitan dili ✔️ —
Oriya (bireysel dil) ✔️ ✔️
Pangasinan ✔️ —
Farsça (Afganistan) ✔️ ✔️
Lehçe ✔️ ✔️
Portekizce ✔️ ✔️
Pencapça ✔️ ✔️
Rumence ✔️ ✔️
Rusça ✔️ ✔️
Santali ✔️ ✔️
Sırpça ✔️ ✔️
Sindice ✔️ —
Seylanca ✔️ ✔️
Slovakça ✔️ ✔️
Slovence ✔️ —
Somalice ✔️ —
Güney Azerbaycan ✔️ ✔️
Güney Peştuca ✔️ ✔️
Güney Sotho dili ✔️ —
İspanyolca ✔️ ✔️
Standart Arapça (Arap alfabesi) ✔️ ✔️
Standart Arapça (Latin alfabesi) ✔️ ✔️
Standart Letonca ✔️ ✔️
Standart Malayca ✔️ ✔️
Svahili (bireysel dil) ✔️ —
Swazi dili ✔️ —
İsveççe ✔️ —
Tacikçe ✔️ —
Tamilce ✔️ ✔️
Telugu dili ✔️ ✔️
Tayca ✔️ —
Tigrinyaca ✔️ —
Tosk Arnavutçası ✔️ —
Türkçe ✔️ ✔️
Uygurca ✔️ —
Vietnamca ✔️ ✔️

Desteklenen modeller

Model Tek konuşmacı Çok hoparlörlü Ses tasarımı Ses kopyalama
Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) ✔️ ✔️ ✔️ ✔️
Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) ✔️ ✔️ ✔️ ✔️
Gemini 3.1 Flash TTS Önizlemesi ✔️ ✔️ — —
Gemini 2.5 Pro Önizleme TTS ✔️ ✔️ — —

Hangi model ne zaman kullanılır?

Her iki Gemini 3.8 TTS modeli de aynı API şemasını ve istem biçimini paylaştığından tek bir parametre değişikliğiyle aralarında geçiş yapabilirsiniz:

  • Maksimum akustik doğruluk, nüanslı oyunculuk ve etkileyici kontrol öncelikli olduğunda Gemini 3.8 Flash TTS'yi kullanın. (gemini-3.8-flash-tts) Stüdyo kalitesinde yaratıcı çalışmalar, karmaşık çok konuşmacılı diyaloglar, yoğun vokal patlaması etiketleri, zor telaffuzlar, bölgesel veya azınlık lehçeleri ve sağlam bir ses ile oda tonu dengesi gerektiren uzun anlatımlar için idealdir.
  • Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) modelini, gemini-3.1-flash-tts-preview yerine hızlı ve uygun maliyetli bir çözüm olarak kullanın. Yüksek hacimli toplu üretim, etkileşimli sesli temsilci sıralamaları, sesli okuma özellikleri, güvenilir ses kopyalama ve büyük dillerde günlük tek hoparlörlü konuşma için optimize edilmiştir.

Taşıma rehberi

Önceki önizleme modellerinden (gemini-3.1-flash-tts-preview veya gemini-2.5-pro-preview-tts) Gemini 3.8 TTS'ye (gemini-3.8-flash-tts veya gemini-3.8-flash-lite-tts) yükseltirken şu beş temel değişikliği inceleyin:

  1. Stili transkriptten ayırma: Sürekli oyunculuk, ton, prozodi ve tempolama talimatlarını (ör. "whispering", "out of breath" veya "speaking slowly") düz metinden çıkarıp speech_metadata.style içine taşıyın. text, kelimesi kelimesine transkript ve satır içi vokal etiketleri olarak kalmalıdır.
  2. Ses tasarımını kullanarak en baştan tasarım karakterleri oluşturun: Çok paragraflı "Audio Profile" veya "Director's Notes" blokları, Ses tasarımında oluşturulan özel bir sesle değiştirin. Ardından, voice_... kimliğini, TTS isteklerinizde minimum veya boş style dizilerle kullanın.
  3. Yapılandırılmış diyalog dönüşleri kullanın: Çok konuşmacılı diyaloglarda, tek bir metin bloğuna Speaker: ... öneklerini yerleştirmek yerine speech_metadata.speaker ile her konuşmacı dönüşü için bir part iletin.
  4. Satır içi vokal etiketleri için köşeli parantez kullanın: Anlık insan sesleri ve duraklamalar için köşeli parantez (<laugh>, <sigh>, <cough>, <breath>, <short pause>) kullanın. Vokal olmayan ses efekti etiketlerinden (ör. alkış veya gümbürtü) kaçının.
  5. Tekli isteklerde varsayılan WAV (AUDIO_WAV) çıkışını hesaba katın: gemini-3.1-flash-tts-preview'ın (varsayılan olarak başlık içermeyen ham PCM AUDIO_L16 döndürür) aksine, Gemini 3.8 TTS modelleri tekli isteklerde RIFF başlığı (24 kHz, mono, 16 bit PCM) içeren eksiksiz WAV (AUDIO_WAV) sesi döndürür:
    • Kodunuz daha önce ham PCM baytlarını bir WAV başlığına sarmalıyorduysa (örneğin, Python'ın wave modülünü veya Node'un wav paketini kullanarak) manuel başlık sarmalayıcıyı kaldırın ve kod çözme işlemi yapılmış ses baytlarını doğrudan bir .wav dosyasına yazın.
    • Mevcut kanalınızın başlık içermeyen ham PCM, mu-law veya A-law sesi gerektirmesi durumunda response_format.audio.mime_type değerini açıkça "AUDIO_L16", "AUDIO_MULAW" veya "AUDIO_ALAW" olarak ayarlayın (örneğin, generateContent içinde {"response_format": {"audio": {"mime_type": "AUDIO_L16"}}} ya da Interactions API'de {"response_format": {"type": "audio", "mime_type": "audio/l16"}}). Ses çıkışı biçimleri bölümüne bakın.

İstem yazma kılavuzu

Gemini 3.8 TTS modelleri, giriş metnini kesinlikle kelimesi kelimesine transkript olarak ele alır. Sahne talimatlarının düz metne yerleştirildiği önceki önizleme modellerinin aksine, Gemini 3.8 TTS, sürekli dönüş seviyesindeki talimatları (speech_metadata) anlık satır içi sesli etiketlerden ayırır.

Stil alanı ve satır içi etiketler

Performans talimatlarınızı kapsama göre ayırın:

  • Dönem düzeyinde sunum (speech_metadata.style): Duygu, prozodi, genel tempo veya sunum tarzı (ör. "whispering", "out of breath", "muttering" veya "sarcastic") gibi sürekli sunum özelliklerini speech_metadata öğesinin style alanına yerleştirin. Dönüşler arasında tutarlı bir karakter ve performans oluşturmak için Ses tasarımında kişiliği önceden tasarlayın ve style yalnızca isteğe bağlı dönüş düzeyinde ince ayarlar için kullanın.
  • Anlık olaylar (satır içi etiketler): Konuşma dışı ses patlamalarını, nefesleri veya duraklamaları köşeli parantezleri (<cough>, <breath>, <sigh>, <short pause>) kullanarak transkriptin içine satır içi olarak yerleştirin. En yüksek ses kalitesi için köşeli parantezleri (<...>) kullanın ve ses efektleri yerine insan seslerini tercih edin.
Kapsam Nereye yerleştirilir? Örnekler
Dönüş seviyesi (dönüş boyunca devam eder) speech_metadata.style "angry tone", "speaking rapidly", "out of breath", "whispers", "sarcastic"
Belirli bir noktada (belirli bir kelimede gerçekleşir) text içinde satır içi (<...>) "<cough> Thank you all for coming tonight! <throat-clearing> As I was saying..."

Tempo ve duraklamalar

Ritm ve sessizliği üç ayrıntı düzeyinde kontrol edebilirsiniz:

  • Noktalama işaretleri ve üç nokta: Doğal sohbetlerdeki tereddütleri belirtmek için virgül, tire (--) ve üç nokta (...) kullanın.
  • Satır içi duraklatma etiketleri: Konuşmacının duraklaması gereken senaryonun tam noktalarına <short pause> veya <long pause> ekleyin: text Hold on, let me think... <short pause> Alright, I've got it.
  • Dönüş düzeyinde hız: Konuşma hızını tüm dönüş boyunca kontrol etmek için speech_metadata bölümünde "style": "speaking rapidly" veya "style": "speaking slowly"'ı ayarlayın.

Prosodi ve perde

Bir konuşma sırasındaki (örneğin, "style": "high pitch, cheerful and excited inflection" veya "style": "monotone and flat") prozodi, perde ve bükümü kontrol etmek için speech_metadata.style kullanın. Duygu veya prozodi diyalog sırasında değişirse senaryoyu, her konuşma sırası için farklı style değerleri içeren ayrı konuşma sıralarına bölün.

Vurgu

Çeviri yazıda belirli kelimeleri büyük harfle yazın. Noktalama işaretleri ve satır içi vokal etiketleriyle birlikte kullanarak önemli kelimelere doğal bir vokal vurgu ekleyin:

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

Vokal patlamaları ve konuşma dışı sesler

Konuşma dışı insan seslerini, sesin duyulması gereken tam noktada köşeli parantez (<...>) kullanarak satır içine yerleştirin. Önerilen vokal etiketleri şunlardır:

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

Arka kanallar ve çakışan konuşma

Birden fazla konuşmacının yer aldığı diyaloglarda, dinleyicilerin tepkilerini boru karakterleriyle (|reaction|) sarmalayın. Böylece, her tepki için ayrı bir dönüşüm oluşturmadan doğal arka kanallar veya çakışan konuşmalar oluşturabilirsiniz.

  • Kısa arka kanal etkileşimleri: Dinleyicilerin kısa tepkilerini (|oh hmm|, |oh really?|, |absolutely|) konuşmacının konuşma sırasına ekleyin:
    • 1. tur (A konuşmacısı): "So the launch is Thursday |oh hmm| Are we actually ready?"
    • 2. Sıra (B Konuşmacısı): "Ready enough |oh really?| The last blocker cleared this morning."
    • 3. tur (A konuşmacısı): "Then let's ship it |absolutely| and watch the dashboards."
  • Çakışan ve araya giren konuşma: İki konuşmacı arasında eş zamanlı veya araya giren konuşmayı simüle etmek için birden fazla dikey çizgi segmenti kullanın (en iyi sonucu gemini-3.8-flash-tts ile verir):
    • Aynı anda geri sayım/koro: "Let's surprise him on three |ok| ready?" ve "one. two. three. |happy| happy |birthday| birthday!"
    • Tam konuşmacı çakışması: "Hello |oh| there |my| it |goodness| must |gracious| be |would| almost |you| time |look| for |at that| dinner"

Nesiller arasında tutarlılık ve kaçınılması gerekenler

Konuşma sırası boyunca ses kimliğinin sabit kalması için aşağıdaki yönergeleri uygulayın:

  • Uzun stil blokları yerine ses tasarımında en baştan tasarım karakterleri oluşturun: Önceki modellerden aktarılan uzun "Audio Profile" paragraflar ve çok maddeli "Director's Notes", ses sapmasının en yaygın nedenidir. Ses tasarımında aynı yaratıcı sezgiyi baştan kullanarak kalıcı bir özel voice_... karakter oluşturun ve bu ses kimliğini TTS çağrılarınızda kullanın.
  • Kararlılık için ses referansını kullanın (meta talimatları atlayın): Gemini 3.8 TTS modelleri, önce ses referansına göre eğitilir. Modele sesi sabit tutmasını söyleyen talimatlar (ör. "do not switch speaker identity" veya "maintain identical timbre") eklemeyin. Ek istem metni, sapmayı artırır. Gereksiz stil talimatlarını kaldırın ve modelin, ses referansıyla sağlanan sabit nokta etrafında doğal olarak değişmesine izin verin.
  • style içinde değişmez konuşmacı özelliklerini değiştirmeye çalışmayın: speech_metadata.style içine yaş, cinsiyet, ad veya kalıcı aksan değişiklikleri eklemeyin. Bunun yerine, Genişletilmiş Ses Kitaplığı'ndan bölgesel bir ses seçin veya Ses tasarımı ile bir ses oluşturun.
  1. Karakteri bir kez oluşturun: Karakterinizi Ses tasarımı'nda oluşturun veya hedef dilinize ve karakterinize uygun bir bölgesel ses seçin.
  2. Konuşma hataları içeren doğal konuşma transkriptleri yazın: Maksimum doğallık için text, doğal konuşma hataları ve tereddütler (örneğin, "Oh uh yeah I think... hm, so that's interesting") dahil olmak üzere gerçek bir konuşma transkripti olarak yazın.
  3. Önce düz TTS'yi test edin: Transkriptinizi önce boş bir style alanı ile sentezleyin. Çoğu istek için style talimatı gerekmez.
  4. Yalnızca küçük değişiklikler için kısa style istemleri ekleyin: Yalnızca belirli bir yayınlama ayarı gerektiren dönüşümler için kısa bir style dizesi (ör. "casual, friendly" veya "muttering, then reassuring") ekleyin ve tutarlı bir temel oluşturmak istediğinizde bu kısa dizeyi dönüşümler arasında tekrar kullanın.

Çok aşamalı etkileşimli diyalog ve sesli ajanlar

Gerçek zamanlı etkileşimli sesli ajanlar veya çok aşamalı etkileşim uygulamaları oluştururken:

  • LLM metin parçaları geldiğinde her dönüşte bir TTS araması yapın.
  • Yapılandırılmış voice (önceden oluşturulmuş, voice_... olarak tasarlanmış veya voice_... / voicekey_... olarak kopyalanmış) konuşmacının kimliğini her dönüşte taşısın. Her dönüşte uzun karakter kişiliğini asla yeniden göndermeyin.
  • Dönüş başına style alanını boş bırakın veya tüm görüşme için kısa ve sabit bir dize (ör. "casual, friendly") gönderin.
  • Güçlü stil istemleri kullanmak yerine uzun aracı yanıtlarını daha kısa dönüşümlere bölün.

Akışta konuşma üretme

Oluşturulan sesi, model tarafından sentezlenirken yayınlayabilirsiniz. Tekli isteklerin (RIFF üstbilgisi içeren eksiksiz bir WAV dosyası döndürür) aksine, akış istekleri varsayılan olarak üstbilgisiz ham 16 bit imzalı little-endian doğrusal PCM (AUDIO_L16 / audio/L16;codec=pcm;rate=24000, 24 kHz, mono) parçaları döndürür. Böylece ses parçaları, kapsayıcı üstbilgileri olmadan sürekli olarak oynatılabilir veya birleştirilebilir:

Python

from google import genai

client = genai.Client()

response_stream = client.models.generate_content_stream(
    model="gemini-3.8-flash-tts",
    contents=[{
        "role": "user",
        "parts": [{
            "text": "Have a wonderful day!",
            "speech_metadata": {"style": "cheerful and friendly"},
        }],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {
            "voice_config": {"voice": "Kore"}
        },
    },
)

for chunk in response_stream:
    try:
        data = chunk.candidates[0].content.parts[0].inline_data.data
        # data contains raw PCM bytes (24kHz, 1-channel, 16-bit)
    except (IndexError, AttributeError):
        pass

JavaScript

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

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

   const responseStream = await ai.models.generateContentStream({
      model: 'gemini-3.8-flash-tts',
      contents: [{
         role: 'user',
         parts: [{
            text: 'Have a wonderful day!',
            speechMetadata: { style: 'cheerful and friendly' },
         }],
      }],
      config: {
         responseModalities: ['AUDIO'],
         speechConfig: {
            voiceConfig: { voice: 'Kore' },
         },
      },
   });

   for await (const chunk of responseStream) {
      const data = chunk.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
      if (data) {
         const audioBuffer = Buffer.from(data, 'base64');
         // Process the audio buffer
      }
   }
}
await main();

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash-tts:streamGenerateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
        "contents": [{
          "role": "user",
          "parts": [{
            "text": "Have a wonderful day!",
            "speech_metadata": {
              "style": "cheerful and friendly"
            }
          }]
        }],
        "generationConfig": {
          "responseModalities": ["AUDIO"],
          "speechConfig": {
            "voiceConfig": {
              "voice": "Kore"
            }
          }
        }
    }'

Ses çıkışı biçimleri

Gemini 3.8 TTS modelleri, isteğin tekli veya akış olup olmamasına bağlı olarak farklı varsayılan ses biçimleri kullanır:

  • Tekli istekler (models.generate_content): RIFF başlığına sahip (24 kHz, mono, 16 bit imzalı küçük endian PCM) tam WAV (AUDIO_WAV) sesini döndürür. Çözümlenmiş ses baytlarını, WAV kapsayıcısı eklemeden doğrudan bir .wav dosyasına yazabilirsiniz.
  • Akış istekleri (models.generate_content_stream / streamGenerateContent): Parçaların her birinde kapsayıcı başlıkları olmadan sürekli olarak yayınlanabilmesi veya birleştirilebilmesi için varsayılan olarak başlıksız ham Linear PCM (AUDIO_L16) parçalarını (24 kHz, mono, 16 bit imzalı little-endian PCM) döndürün.

generationConfig.responseFormat.audio kullanarak çıkış ses kodlamasını ve örnekleme hızını geçersiz kılabilirsiniz:

mimeType değer Biçim Açıklama
"AUDIO_WAV" (tekli varsayılan) WAV (audio/wav) RIFF başlığı içeren tam WAV dosyası (24 kHz, mono, 16 bit PCM).
"AUDIO_L16" (varsayılan akış) Doğrusal PCM (audio/l16) Üstbilgisiz ham 16 bit imzalı little-endian doğrusal PCM. Akış, özel ses ardışık düzenleri veya çok aşamalı etkileşim kliplerini birleştirme için idealdir.
"AUDIO_MULAW" μ-law (audio/basic / audio/mulaw) G.711 μ-law companded audio. Kuzey Amerika ve Japonya'daki telefon sistemlerinde yaygın olarak kullanılır (8 kHz).
"AUDIO_ALAW" A-law (audio/alaw) G.711 A-law companded audio. Avrupa ve uluslararası telefon görüşmelerinde yaygın olarak kullanılır (8 kHz).

İsteğe bağlı olarak sampleRate da belirtebilirsiniz (örneğin, 24000, 16000 veya 8000 Hz; varsayılan olarak 24000 Hz'dir).

Aşağıdaki örnekte, 24 kHz'de başlık içermeyen ham 16 bit PCM (AUDIO_L16) isteniyor:

Python

from google import genai

client = genai.Client()

response = client.models.generate_content(
    model="gemini-3.8-flash-tts",
    contents=[{
        "role": "user",
        "parts": [{
            "text": "Have a wonderful day!",
            "speech_metadata": {"style": "cheerful and friendly"},
        }],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "response_format": {
            "audio": {
                "mime_type": "AUDIO_L16",
                "sample_rate": 24000,
            }
        },
        "speech_config": {
            "voice_config": {"voice": "Kore"}
        },
    },
)

data = response.candidates[0].content.parts[0].inline_data.data
with open("out.pcm", "wb") as f:
    f.write(data)

JavaScript

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

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

   const response = await ai.models.generateContent({
      model: 'gemini-3.8-flash-tts',
      contents: [{
         role: 'user',
         parts: [{
            text: 'Have a wonderful day!',
            speechMetadata: { style: 'cheerful and friendly' },
         }],
      }],
      config: {
         responseModalities: ['AUDIO'],
         responseFormat: {
            audio: {
               mimeType: 'AUDIO_L16',
               sampleRate: 24000,
            },
         },
         speechConfig: {
            voiceConfig: { voice: 'Kore' },
         },
      },
   });

   const data = response.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
   const audioBuffer = Buffer.from(data, 'base64');

   fs.writeFileSync('out.pcm', audioBuffer);
}
await main();

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash-tts:generateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
        "contents": [{
          "role": "user",
          "parts": [{
            "text": "Have a wonderful day!",
            "speech_metadata": {
              "style": "cheerful and friendly"
            }
          }]
        }],
        "generationConfig": {
          "responseModalities": ["AUDIO"],
          "responseFormat": {
            "audio": {
              "mimeType": "AUDIO_L16",
              "sampleRate": 24000
            }
          },
          "speechConfig": {
            "voiceConfig": {
              "voice": "Kore"
            }
          }
        }
    }' | jq -r '.candidates[0].content.parts[0].inlineData.data' | \
          base64 --decode > out.pcm

Sınırlamalar

  • TTS modelleri yalnızca metin girişlerini kabul eder ve yalnızca ses çıkışları üretir.
  • Tek istekte birden fazla konuşmacı için metin okuma (multiSpeakerVoiceConfig) özelliği, önceden oluşturulmuş sesleri kullanarak en fazla 2 konuşmacıyı destekler. Çok karakterli diyaloglarda özel olarak tasarlanmış (voice_...) veya kopyalanmış (voice_... / voicekey_...) sesleri birleştirmek için her konuşmacının konuşmasını ayrı ayrı sentezleyin. Tekli istekler varsayılan olarak 44 baytlık bir RIFF başlığıyla audio/wav döndürdüğünden, ham PCM (AUDIO_L16) isteyin veya 24 kHz PCM ses çerçevelerini birleştirmeden önce her dönüşten WAV başlığını çıkarın.
  • Özel ses depolama sınırları ve TTL:
    • Durumlu sesler (store=True, istemli veya kopyalanmış): 1 yıllık TTL (geçerlilik süresi) ile proje başına en fazla 200 ses.
    • Durum bilgisi içermeyen ses anahtarları (store=False, voicekey_...): 7 günlük geçerlilik süresi (time-to-live).
  • Dil kapsamı için Desteklenen diller bölümünü inceleyin.

Sırada ne var?