Gemini API, Gemini'ın metin okuma (TTS) özelliklerini kullanarak metin girişini tek konuşmacılı veya çok konuşmacılı sese dönüştürebilir.
Metin okuma özelliği kontrol edilebilir. Yani sesin stilini, aksanını, hızını ve tonunu yönlendirmek için yapılandırılmış sıra meta verilerini (speech_metadata) ve satır içi ses 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 üzerinden TTS, podcast veya sesli kitap oluşturma gibi stil ve ses üzerinde ayrıntılı kontrolle tam metin okuma gerektiren senaryolar 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 ve en yeni Google GenAI SDK'ya (Python için google-genai >= 2.25.0 veya JavaScript/TypeScript için @google/genai >= 2.24.0) yükseltin ya da REST API'yi kullanın.
En iyi sonuçları elde etmek için iş yükünüze en uygun modeli seçmek üzere Hangi model ne zaman kullanılır? başlıklı makaleyi inceleyin.
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 input içinde bire bir transkripti iletin, speech_metadata ek açıklaması kullanarak dönüş düzeyinde stil oluşturma ekleyin ve generation_config.speech_config içinde sesinizi yapılandırın. Önceden oluşturulmuş Ses seçenekleri, Genişletilmiş Ses Kitaplığı (GET /v1beta/voices), özel bir Ses tasarımı kimliği (voice_...) veya Ses kopyalama kimliği (voice_... veya isteğe bağlı durum bilgisi olmayan voicekey_...) arasından bir ses seçebilirsiniz.
Bu örnekte, modelden alınan varsayılan WAV çıkış sesi (audio/wav) doğrudan bir dosyaya kaydedilir:
Python
import base64
from google import genai
client = genai.Client()
interaction = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{
"type": "user_input",
"content": [{
"type": "text",
"text": "Have a wonderful day!",
"annotations": [{
"type": "speech_metadata",
"style": "cheerful and friendly",
}],
}],
}],
response_format={"type": "audio"},
generation_config={
"speech_config": [
{"voice": "Kore"},
]
},
)
with open("out.wav", "wb") as f:
f.write(base64.b64decode(interaction.output_audio.data))
JavaScript
import * as fs from 'node:fs';
import {GoogleGenAI} from '@google/genai';
async function main() {
const client = new GoogleGenAI({});
const interaction = await client.interactions.create({
model: 'gemini-3.8-flash-tts',
input: [{
type: 'user_input',
content: [{
type: 'text',
text: 'Have a wonderful day!',
annotations: [{
type: 'speech_metadata',
style: 'cheerful and friendly',
}],
}],
}],
response_format: { type: 'audio' },
generation_config: {
speech_config: [
{ voice: 'Kore' },
],
},
});
const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
fs.writeFileSync('out.wav', audioBuffer);
}
await main();
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash-tts",
"input": [{
"type": "user_input",
"content": [{
"type": "text",
"text": "Have a wonderful day!",
"annotations": [{
"type": "speech_metadata",
"style": "cheerful and friendly"
}]
}]
}],
"response_format": {
"type": "audio"
},
"generation_config": {
"speech_config": [
{ "voice": "Kore" }
]
}
}' | jq -r '[.steps[] | select(.type=="model_output") | .content[] | select(.type=="audio")] | last | .data' | base64 --decode > out.wav
Python ve JavaScript SDK'larında, üretilen ses verilerini almak için interaction.output_audio kolaylık özelliğini kullanabilirsiniz. Bu özellik, üretilen son ses bloğunu döndürür (ham REST JSON yanıtlarında, base64 kodlu ses steps[].content[].data içinde depolanır). Kolaylık özellikleri hakkında ayrıntılı bilgi için Etkileşimlere genel bakış başlıklı makaleyi inceleyin.
Birden fazla konuşmacı TTS
Birden fazla konuşmacının yer aldığı diyaloglarda speech_config.speakers içinde iki konuşmacı yapılandırın ve her dönüşü, speaker'ı belirten speech_metadata ek açıklaması ve isteğe bağlı dönüş düzeyi style ile ayrı bir metin öğesi olarak iletin. speech_config, tek konuşmacılı ses üretimi için bir dizi ([{"voice": "..."}]) ve çok konuşmacılı ses üretimi için bir nesne ({"speakers": [...]}) kabul eder:
Python
import base64
from google import genai
client = genai.Client()
interaction = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{
"type": "user_input",
"content": [
{
"type": "text",
"text": "How's it going today Jane?",
"annotations": [{
"type": "speech_metadata",
"speaker": "Joe",
"style": "cheerful and friendly",
}],
},
{
"type": "text",
"text": "Not too bad, how about you? Ready to test these new voices?",
"annotations": [{
"type": "speech_metadata",
"speaker": "Jane",
"style": "calm and relaxed",
}],
},
],
}],
response_format={"type": "audio"},
generation_config={
"speech_config": {
"speakers": [
{"speaker": "Joe", "voice": "Puck"},
{"speaker": "Jane", "voice": "Kore"},
],
}
},
)
with open("out.wav", "wb") as f:
f.write(base64.b64decode(interaction.output_audio.data))
JavaScript
import * as fs from 'node:fs';
import {GoogleGenAI} from '@google/genai';
async function main() {
const client = new GoogleGenAI({});
const interaction = await client.interactions.create({
model: 'gemini-3.8-flash-tts',
input: [{
type: 'user_input',
content: [
{
type: 'text',
text: "How's it going today Jane?",
annotations: [{
type: 'speech_metadata',
speaker: 'Joe',
style: 'cheerful and friendly',
}],
},
{
type: 'text',
text: 'Not too bad, how about you? Ready to test these new voices?',
annotations: [{
type: 'speech_metadata',
speaker: 'Jane',
style: 'calm and relaxed',
}],
},
],
}],
response_format: { type: 'audio' },
generation_config: {
speech_config: {
speakers: [
{ speaker: 'Joe', voice: 'Puck' },
{ speaker: 'Jane', voice: 'Kore' },
],
},
},
});
const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
fs.writeFileSync('out.wav', audioBuffer);
}
await main();
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash-tts",
"input": [{
"type": "user_input",
"content": [
{
"type": "text",
"text": "How'\''s it going today Jane?",
"annotations": [{
"type": "speech_metadata",
"speaker": "Joe",
"style": "cheerful and friendly"
}]
},
{
"type": "text",
"text": "Not too bad, how about you? Ready to test these new voices?",
"annotations": [{
"type": "speech_metadata",
"speaker": "Jane",
"style": "calm and relaxed"
}]
}
]
}],
"response_format": {
"type": "audio"
},
"generation_config": {
"speech_config": {
"mode": "conversational",
"speakers": [
{ "speaker": "Joe", "voice": "Puck" },
{ "speaker": "Jane", "voice": "Kore" }
]
}
}
}'
Meta veriler ve etiketlerle konuşma stilini kontrol etme
Gemini 3.8 TTS, text alanını tam olarak bir transkript olarak ele alır. Sahne talimatlarının sesli okunmasını kontrol etmek için talimatlarınızı kapsamlarına göre ayırın:
- Sıra düzeyinde sürekli sunum (
speech_metadata.style): Sıranın tamamında geçerli olan duyguları, sunum stilini, prozodiyi, hızı ve ses seviyesinistylealanına ekleyin (ör."style": "whispered urgently","style": "out of breath"veya"style": "warm and enthusiastic"). - Anlık etkinlikler (satır içi etiketler): Konuşma dışı anlık ses patlamalarını veya duraklamaları, açılı parantezler kullanarak doğrudan transkriptin içine yerleştirin (ör.
"Wait... <short pause> did you hear that? <sigh>"veya"Excuse me <cough> as I was saying...").
En iyi uygulamalar hakkında kapsamlı bilgi için İstem kılavuzunu inceleyin.
Python
import base64
from google import genai
client = genai.Client()
interaction = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{
"type": "user_input",
"content": [
{
"type": "text",
"text": "Wait... <short pause> look under that fallen log! Is that a blue-spotted salamander?",
"annotations": [{
"type": "speech_metadata",
"speaker": "Dr. Anya",
"style": "whispered urgently",
}],
},
{
"type": "text",
"text": "<gasp> No way! <laugh> We've been searching for this species all season!",
"annotations": [{
"type": "speech_metadata",
"speaker": "Liam",
"style": "warm and enthusiastic",
}],
},
],
}],
response_format={"type": "audio"},
generation_config={
"speech_config": {
"speakers": [
{"speaker": "Dr. Anya", "voice": "Kore"},
{"speaker": "Liam", "voice": "Puck"},
],
}
},
)
with open("out.wav", "wb") as f:
f.write(base64.b64decode(interaction.output_audio.data))
JavaScript
import * as fs from 'node:fs';
import {GoogleGenAI} from '@google/genai';
async function main() {
const client = new GoogleGenAI({});
const interaction = await client.interactions.create({
model: 'gemini-3.8-flash-tts',
input: [{
type: 'user_input',
content: [
{
type: 'text',
text: 'Wait... <short pause> look under that fallen log! Is that a blue-spotted salamander?',
annotations: [{
type: 'speech_metadata',
speaker: 'Dr. Anya',
style: 'whispered urgently',
}],
},
{
type: 'text',
text: "<gasp> No way! <laugh> We've been searching for this species all season!",
annotations: [{
type: 'speech_metadata',
speaker: 'Liam',
style: 'warm and enthusiastic',
}],
},
],
}],
response_format: { type: 'audio' },
generation_config: {
speech_config: {
speakers: [
{ speaker: 'Dr. Anya', voice: 'Kore' },
{ speaker: 'Liam', voice: 'Puck' },
],
},
},
});
if (interaction.output_audio?.data) {
const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
fs.writeFileSync('out.wav', audioBuffer);
}
}
await main();
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash-tts",
"input": [{
"type": "user_input",
"content": [
{
"type": "text",
"text": "Wait... <short pause> look under that fallen log! Is that a blue-spotted salamander?",
"annotations": [{
"type": "speech_metadata",
"speaker": "Dr. Anya",
"style": "whispered urgently"
}]
},
{
"type": "text",
"text": "<gasp> No way! <laugh> We'\''ve been searching for this species all season!",
"annotations": [{
"type": "speech_metadata",
"speaker": "Liam",
"style": "warm and enthusiastic"
}]
}
]
}],
"response_format": {
"type": "audio"
},
"generation_config": {
"speech_config": {
"speakers": [
{ "speaker": "Dr. Anya", "voice": "Kore" },
{ "speaker": "Liam", "voice": "Puck" }
]
}
}
}'
Akışta konuşma üretme
stream: true ayarını yaparak oluşturulan sesi sentezlenirken dinleyebilirsiniz. Tekli isteklerin aksine (RIFF başlığıyla birlikte tam bir WAV dosyası döndürür), akış istekleri varsayılan olarak başlık içermeyen ham 16 bit imzalı little-endian doğrusal PCM (audio/l16, 24 kHz, mono) parçaları döndürür. Bu sayede ses parçaları, kapsayıcı başlıkları olmadan sürekli olarak oynatılabilir veya birleştirilebilir.
Python
import base64
from google import genai
client = genai.Client()
stream = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{
"type": "user_input",
"content": [{
"type": "text",
"text": "Have a wonderful day!",
"annotations": [{
"type": "speech_metadata",
"style": "cheerful and friendly",
}],
}],
}],
response_format={"type": "audio"},
generation_config={
"speech_config": [
{"voice": "Kore"},
]
},
stream=True,
)
for event in stream:
if event.event_type == "step.delta":
if event.delta.type == "audio":
audio_data = base64.b64decode(event.delta.data)
# Process the audio chunk (e.g. play it or write to a file)
JavaScript
import {GoogleGenAI} from '@google/genai';
async function main() {
const client = new GoogleGenAI({});
const stream = await client.interactions.create({
model: 'gemini-3.8-flash-tts',
input: [{
type: 'user_input',
content: [{
type: 'text',
text: 'Have a wonderful day!',
annotations: [{
type: 'speech_metadata',
style: 'cheerful and friendly',
}],
}],
}],
response_format: { type: 'audio' },
generation_config: {
speech_config: [
{ voice: 'Kore' },
],
},
stream: true,
});
for await (const event of stream) {
if (event.event_type === 'step.delta') {
if (event.delta.type === 'audio') {
const audioBuffer = Buffer.from(event.delta.data, 'base64');
// Process the audio buffer
}
}
}
}
await main();
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
--no-buffer \
-d '{
"model": "gemini-3.8-flash-tts",
"input": [{
"type": "user_input",
"content": [{
"type": "text",
"text": "Have a wonderful day!",
"annotations": [{
"type": "speech_metadata",
"style": "cheerful and friendly"
}]
}]
}],
"response_format": {
"type": "audio"
},
"generation_config": {
"speech_config": [
{ "voice": "Kore" }
]
},
"stream": true
}'
Ses çıkışı biçimleri
Gemini 3.8 TTS modelleri, isteğin tekli veya akışlı olmasına bağlı olarak farklı varsayılan ses formatları kullanır:
- Tekli istekler (
stream=False): Standart RIFF başlığı (24 kHz, mono, 16 bit imzalı little-endian PCM) içeren tam WAV (audio/wav) ses dosyası döndürür. Çözülen ses baytlarını, WAV başlığını manuel olarak eklemeden doğrudan bir.wavdosyasına kaydedebilirsiniz. - Akış istekleri (
stream=True): Varsayılan olarak başlıksız ham doğrusal PCM (audio/l16) parçaları (24 kHz, mono, 16 bit imzalı little-endian PCM) döndürür. Böylece parçalar, her parçada kapsayıcı başlıkları olmadan sürekli olarak akışa alınabilir veya birleştirilebilir.
Farklı bir ses kodlaması veya örnek hızı istemek için response_format içinde mime_type ve isteğe bağlı sample_rate parametrelerini yapılandırın:
| Biçim | mime_type değer |
Açıklama |
|---|---|---|
| WAV (tekli varsayılan) | "audio/wav" |
RIFF başlığı içeren sıkıştırılmamış WAV dosyası (16 bit imzalı little-endian PCM, mono, varsayılan olarak 24 kHz). Tekli istekler için varsayılan değer. |
| Raw PCM (L16) (varsayılan akış) | "audio/l16" |
Sıkıştırılmamış, başlıksız 16 bit imzalı little-endian doğrusal PCM ses (24 kHz, mono). Akış istekleri için varsayılan değerdir. |
| Mu-law | "audio/mulaw" |
8 bit G.711 mu-law kodlu ses (Kuzey Amerika ve Japonya telefon/IVR sistemlerinde yaygın olarak kullanılır). |
| A-law | "audio/alaw" |
8 bit G.711 A-law kodlu ses (Avrupa ve uluslararası telefon sistemlerinde yaygın olarak kullanılır). |
sample_rate değerini Hertz cinsinden de belirtebilirsiniz (ör. 24000, 16000 veya 8000).
Python
import base64
from google import genai
client = genai.Client()
interaction = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{
"type": "user_input",
"content": [{
"type": "text",
"text": "Have a wonderful day!",
"annotations": [{
"type": "speech_metadata",
"style": "cheerful and friendly",
}],
}],
}],
response_format={
"type": "audio",
"mime_type": "audio/l16", # "audio/wav" (default), "audio/l16", "audio/mulaw", or "audio/alaw"
"sample_rate": 24000,
},
generation_config={
"speech_config": [
{"voice": "Kore"},
]
},
)
with open("out.pcm", "wb") as f:
f.write(base64.b64decode(interaction.output_audio.data))
JavaScript
import * as fs from 'node:fs';
import {GoogleGenAI} from '@google/genai';
async function main() {
const client = new GoogleGenAI({});
const interaction = await client.interactions.create({
model: 'gemini-3.8-flash-tts',
input: [{
type: 'user_input',
content: [{
type: 'text',
text: 'Have a wonderful day!',
annotations: [{
type: 'speech_metadata',
style: 'cheerful and friendly',
}],
}],
}],
response_format: {
type: 'audio',
mime_type: 'audio/l16', // 'audio/wav' (default), 'audio/l16', 'audio/mulaw', or 'audio/alaw'
sample_rate: 24000,
},
generation_config: {
speech_config: [
{ voice: 'Kore' },
],
},
});
const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
fs.writeFileSync('out.pcm', audioBuffer);
}
await main();
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash-tts",
"input": [{
"type": "user_input",
"content": [{
"type": "text",
"text": "Have a wonderful day!",
"annotations": [{
"type": "speech_metadata",
"style": "cheerful and friendly"
}]
}]
}],
"response_format": {
"type": "audio",
"mime_type": "audio/l16",
"sample_rate": 24000
},
"generation_config": {
"speech_config": [
{ "voice": "Kore" }
]
}
}'
Ses seçenekleri
Gemini 3.8 TTS, ses seçmek veya oluşturmak için dört yöntem sunar:
- Hazır stüdyo sesleri: Aşağıdaki tabloda listelenen 30 seçilmiş ses.
- 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. - Ses tasarımı: Google AI Studio'da doğal dildeki bir açıklamadan veya
POST /v1beta/voices(type="prompted") kullanarak özel bir vokal karakteri oluşturun.POST /v1beta/voices,CreateVoiceveGetVoice'de kalıcı birvoice_...kimliği vesample_audioWAV önizlemesi döndürür. - Ses kopyalama: Google AI Studio'da veya
POST /v1beta/voices(type="replicated", varsayılan olarak kalıcıstore=Trueveya isteğe bağlı durumsuzstore=False) kullanarak referans ve izin sesinden bir konuşmacının sesini kopyalayın.
Özel ses sınırları ve TTL
| Ses türü | Depolama modu | Kota / sınır | Saklama (TTL) |
|---|---|---|---|
Durumlu sesler (voice_..., istemli veya kopyalanmış) |
store=True |
Proje başına 200 ses (istemle oluşturulan ve kopyalanan sesler arasında paylaşılır) | Son kullanımdan itibaren 1 yıl* |
Durumsuz ses anahtarları (voicekey_..., kopyalanmış) |
store=False |
Müşteri 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 -- Neşeli | Charon -- Bilgilendirici |
| Kore -- Firma | Fenrir -- Heyecanlı | Leda -- Genç |
| Orus -- Firma | Aoede -- Breezy | Callirrhoe -- Sakin |
| Autonoe -- Parlak | Enceladus -- Nefesli | Iapetus -- Temizle |
| Umbriel: Uyumlu | Algieba -- Pürüzsüz | Despina -- Pürüzsüz |
| Erinome -- Temizle | Algenib -- Çakıllı | Rasalgethi -- Bilgilendirici |
| Laomedeia -- Neşeli | Achernar -- Soft | Alnilam -- Sert |
| Schedar -- Even | Gacrux -- Yetişkin | Pulcherrima -- Hevesli |
| Achird -- Dost canlısı | Zubenelgenubi -- Gündelik dilde | 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 Ses Kitaplığı'nın tamamına göz atabilir, filtreleyebilir ve etkileşimli olarak dinleyebilirsiniz. Alternatif olarak, client.voices.list() (GET /v1beta/voices, google-genai 2.25.0+ / @google/genai 2.24.0+) kullanarak programatik olarak sorgulayabilirsiniz.
ListVoices, filtre ölçütlerinize uyan hazır katalog seslerinden sonra özel olarak saklanan seslerinizi (en yeni ilk sırada olacak şekilde) 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 (ör. ["en-US", "en-GB"]). Büyük/küçük harfe duyarlı olmayan tam eşleme. |
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] |
Ses perdesi sınıflandırması ("low", "medium" veya "high"). |
persona |
list[str] |
Ses karakteri veya karakter arketipi (ör. ["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 filtreleyin: "prebuilt", "prompted" (Ses tasarımı) veya "replicated" (Ses kopyalama). |
search |
str |
Serbest metin alt dizesi araması, büyük/küçük harfe duyarlı olmadan hem display_name hem de description ile eşleştirilir. |
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 kullanılan jeton. |
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 dili (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 | ✔️ | ✔️ |
| Halha 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 (Latin alfabesi) | ✔️ | — |
| Mizo | ✔️ | ✔️ |
| Nepalce (bireysel dil) | ✔️ | ✔️ |
| Nijerya Fulfulde Dili | ✔️ | ✔️ |
| Kuzey Azerbaycan | ✔️ | ✔️ |
| Kuzey Sotho dili | ✔️ | ✔️ |
| Kuzey Özbekçesi | ✔️ | ✔️ |
| Norveççe Bokmål | ✔️ | ✔️ |
| Yeni Norveççe | ✔️ | ✔️ |
| Nyanja | ✔️ | ✔️ |
| Occitan dili | ✔️ | — |
| Oriya dili (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 Azerice | ✔️ | ✔️ |
| 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 Preview | ✔️ | ✔️ | — | — |
| 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 en önemli öncelikler olduğunda Gemini 3.8 Flash TTS (
gemini-3.8-flash-tts) kullanın. 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.1-flash-tts-previewyerine hızlı ve uygun maliyetli bir alternatif olarak Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) kullanın. Yüksek hacimli toplu üretim, sesli görüşme temsilcisi kaskadları, sesli okuma özellikleri, güvenilir ses kopyalama ve yaygın dillerde günlük tek konuşmacılı konuşmalar için optimize edilmiştir.
Geçiş rehberi
gemini-3.1-flash-tts-preview veya daha eski Gemini TTS modellerinden Gemini 3.8 TTS'ye geçiş yapıyorsanız:
- Dönüş seviyesindeki talimatları
speech_metadata'a taşıma: Gemini 3.8 TTS, giriş metnini bire bir transkript olarak değerlendirir. Sürekli teslimat talimatlarını (style; örneğin"whispering","out of breath"veya"speaking slowly") ve konuşmacı etiketlerini (speaker) yapılandırılmışspeech_metadataek açıklamalarına taşıyın. Sahne talimatlarını transkript metnine yerleştirmeyin. - Açı ayraçlı satır içi etiketleri yalnızca anlık sesli etkinlikler için kullanın: Kısa süreli konuşma dışı sesleri ve duraklamaları, açı ayraçlar (ör.
<laugh>,<sigh>,<cough>,<breath>veya<short pause>) kullanarak transkriptte satır içinde tutun. Ses efekti etiketlerinden (ör. alkış veya gümbürtü) kaçının ve sunum tarzlarınıspeech_metadata.styleiçine alın. - Birden fazla konuşmacı içeren isteklerde her sıra için
speakerdeğerini belirtin: Birden fazla konuşmacı içeren isteklerde her sıra, yapılandırılmış konuşmacılardan biriyle eşleşenspeech_metadataiçindespeakerdeğerini açıkça içermelidir. - 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 buvoice_...kimliğini, metin okuma isteklerinizde minimum veya boşstyledizelerle kullanın. - Tekli isteklerde varsayılan WAV (
audio/wav) çıkışını hesaba katın:gemini-3.1-flash-tts-previewve önceki TTS modellerinin (varsayılan olarak başlıksız ham PCMaudio/l16döndürür) aksine, Gemini 3.8 TTS, tekli istekler için varsayılan olarak standart RIFF başlığına sahip WAV ses (audio/wav) döndürür.- Kodunuz daha önce ham PCM baytlarını bir WAV başlığına sarmalıyorduysa (örneğin, Python'ın
wavemodülünü veyaffmpeg'ı kullanarak) manuel başlık sarmalayıcıyı kaldırın ve döndürülen baytları doğrudan bir.wavdosyasına yazın. - Ardışık düzeniniz başlık içermeyen ham PCM, mu-law veya A-law ses gerektiriyorsa
response_format.mime_typedeğerini açıkça"audio/l16","audio/mulaw"veya"audio/alaw"olarak ayarlayın (örneğin, Interactions API'de{"response_format": {"type": "audio", "mime_type": "audio/l16"}}veyagenerateContentiçindeAUDIO_L16). Ses çıkış biçimleri bölümünü inceleyin.
- Kodunuz daha önce ham PCM baytlarını bir WAV başlığına sarmalıyorduysa (örneğin, Python'ın
İstem yazma kılavuzu
Gemini 3.8 TTS modelleri, giriş metnini kesinlikle kelimesi kelimesine transkript olarak ele alır.
Sahne yönergelerinin düz metne yerleştirildiği önceki önizleme modellerinin aksine Gemini 3.8 TTS, sıra düzeyindeki sürekli yönergeleri (speech_metadata) anlık satır içi ses etiketlerinden ayırır.
Stil alanı ve satır içi etiketler karşılaştırması
Performans talimatlarınızı kapsama göre ayırın:
- Dönem düzeyinde sunum (
speech_metadata.style): Duygu, prozodi, genel hız veya sunum stili (ör."whispering","out of breath","muttering"veya"sarcastic") gibi sürekli sunum özelliklerinispeech_metadataöğesininstylealanına yerleştirin. Sıralar arasında tutarlı bir karakter ve performans oluşturmak için karakteri önceden Ses tasarımı bölümünde tasarlayın vestyleparametresini yalnızca isteğe bağlı sıra düzeyinde düzenlemeler 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 |
|---|---|---|
| Tur düzeyi (tur 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
Ritim 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 noktalara
<short pause>veya<long pause>etiketlerini ekleyin:text Hold on, let me think... <short pause> Alright, I've got it. - Dönem düzeyinde hız: Konuşma hızını tüm dönem boyunca kontrol etmek için
speech_metadatabölümünde"style": "speaking rapidly"veya"style": "speaking slowly"'ı ayarlayın.
Prosodi ve perde
Bir sıra boyunca prozodiyi, perdeyi ve tonlamayı kontrol etmek için speech_metadata.style kullanın (örneğin, "style": "high pitch, cheerful and excited inflection" veya "style": "monotone and flat"). Duygu veya prozodi diyalog sırasında değişirse senaryoyu her sıra için farklı style değerleri olan ayrı sıralara bölün.
Vurgu
Anahtar kelimelere doğal ses vurgusu eklemek için transkriptteki belirli kelimeleri büyük harfle yazın, noktalama işaretleri ve satır içi ses etiketleri kullanın:
This is a VERY important point!
It was a VERY long day <sigh> ... nobody listens anymore.
Ses 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 sesli etiketler ş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 plan sesleri ve çakışan konuşmalar
Birden fazla konuşmacının yer aldığı diyaloglarda, dinleyicilerin tepkilerini boru karakterleriyle (|reaction|) sarı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 geri bildirim alışverişleri: Aktif konuşmacının sırası sırasında kısa dinleyici tepkilerini (
|oh hmm|,|oh really?|,|absolutely|) katmanlayın:- 1. sıra (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. sıra (A konuşmacısı):
"Then let's ship it |absolutely| and watch the dashboards."
- 1. sıra (A konuşmacısı):
- Çakışan ve aralıklı konuşma: İki konuşmacı arasındaki eşzamanlı veya aralıklı konuşmayı simüle etmek için birden fazla dikey çizgi segmenti kullanın (
gemini-3.8-flash-ttsile en iyi şekilde çalışır):- Eş zamanlı geri sayım/koro:
"Let's surprise him on three |ok| ready?"ve ardından"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"
- Eş zamanlı geri sayım/koro:
Nesiller arası 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 karakterleri önceden tasarlayın:
Önceki modellerden taşınan uzun
"Audio Profile"paragraflar ve çok maddeli"Director's Notes", ses kaymasının en yaygın nedenidir. Ses tasarımı aşamasında aynı yaratıcı sezgiyi kullanarak kalıcı bir özelvoice_...karakteri oluşturun ve bu ses kimliğini TTS çağrılarınızda kullanın. - Kararlılık için ses referansını kullanma (meta talimatları atlama):
Gemini 3.8 TTS modelleri, öncelikle ses referansını temel alacak şekilde eğitilmiştir.
Modele sesini sabit tutmasını söyleyen talimatlar (ör.
"do not switch speaker identity"veya"maintain identical timbre") eklemeyin. Ek istem metni, kaymayı artırır. Gereksiz stil talimatlarını bırakın ve modelin, ses referansıyla sağlanan sabit nokta etrafında doğal olarak değişmesine izin verin. styleiçinde değişmez konuşmacı özelliklerini değiştirmeye çalışmayın:speech_metadata.styleiç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.
Önerilen iş akışı
- Karakteri bir kez oluşturun: Karakterinizi Ses tasarımı'nda oluşturun veya Genişletilmiş Ses Kitaplığı'ndan hedef dilinize ve karakterinize uygun bölgesel bir ses seçin.
- Akıcı olmayan doğal konuşma transkriptleri yazın: Maksimum doğallık için
textifadesini, doğal konuşma akıcılığını bozan unsurlar ve duraksamalar (ör."Oh uh yeah I think... hm, so that's interesting") dahil olmak üzere gerçek bir konuşma transkripti olarak yazın. - Önce düz TTS'yi test edin: Transkriptinizi önce boş bir
stylealanı ile sentezleyin. Çoğu istek içinstyletalimatı gerekmez. - Yalnızca küçük değişiklikler için kısa
styleistemleri ekleyin: Yalnızca belirli bir yayınlama ayarı gerektiren dönüşümler için kısa birstyledizesi (ö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 temsilciler
Anlık etkileşimli sesli ajanlar veya çok turlu uygulamalar oluştururken:
- LLM metin parçaları geldikçe sıra başına bir TTS çağrısı yapın.
- Yapılandırılmış
voice(önceden oluşturulmuş, tasarlanmışvoice_...veya kopyalanmışvoice_.../voicekey_...), konuşmacının kimliğini her sırayla taşısın. Her sırada uzun bir karakter kişiliğini yeniden göndermeyin. - Sıra başına
stylealanı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.
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 (
speech_config.speakers) özelliği, önceden oluşturulmuş sesleri kullanarak 2 konuşmacıyı destekler. Özel olarak tasarlanmış (voice_...) veya kopyalanmış (voice_.../voicekey_...) sesleri çok karakterli diyaloglarda birleştirmek için her konuşmacının sırasını ayrı ayrı sentezleyin. Tekli istekler varsayılan olarak 44 baytlık bir RIFF başlığıylaaudio/wavdöndürdüğünden, ham PCM ({"type": "audio", "mime_type": "audio/l16"}) isteyin veya 24 kHz PCM ses karelerini birleştirmeden önce her sıradan WAV başlığını çıkarın. - Özel ses depolama alanı sınırları ve TTL:
- Durum bilgisi olan sesler (
store=True, istemli veya kopyalanmış): 1 yıllık TTL (geçerlilik süresi) ile proje başına en fazla 200 ses. - Durum bilgisiz ses anahtarları (
store=False,voicekey_...): 7 günlük TTL (geçerlilik süresi).
- Durum bilgisi olan sesler (
- Dil kapsamı için Desteklenen diller bölümünü inceleyin.
Sırada ne var?
- Ses tasarımı ile doğal dilden özel ses karakterleri oluşturun.
- Ses kopyalama'da mevcut bir konuşmacının sesini kopyalayın.
- Gemini 3.8 Flash TTS ve Gemini 3.8 Flash-Lite TTS model sayfalarında model özelliklerini karşılaştırın.
- Live API ile etkileşimli çift yönlü ses deneyimini keşfedin.