Gemini API, Gemini metin okuma (TTS) üretme ö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 sesli etiketleri 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 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ş Voice seçenekleri, Genişletilmiş Voice Kitaplığı (GET /v1beta/voices), özel Voice tasarımı kimliği (voice_...) veya Voice kopyalama kimliği (voice_... ya da isteğe bağlı durumsuz 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();
Go
package main
import (
"context"
"encoding/base64"
"encoding/binary"
"log"
"os"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func saveWaveFile(filename string, pcmData []byte) error {
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
sampleRate := uint32(24000)
numChannels := uint16(1)
bitsPerSample := uint16(16)
byteRate := sampleRate * uint32(numChannels) * uint32(bitsPerSample/8)
blockAlign := numChannels * (bitsPerSample / 8)
dataSize := uint32(len(pcmData))
f.WriteString("RIFF")
binary.Write(f, binary.LittleEndian, uint32(36+dataSize))
f.WriteString("WAVEfmt ")
binary.Write(f, binary.LittleEndian, uint32(16))
binary.Write(f, binary.LittleEndian, uint16(1))
binary.Write(f, binary.LittleEndian, numChannels)
binary.Write(f, binary.LittleEndian, sampleRate)
binary.Write(f, binary.LittleEndian, byteRate)
binary.Write(f, binary.LittleEndian, blockAlign)
binary.Write(f, binary.LittleEndian, bitsPerSample)
f.WriteString("data")
binary.Write(f, binary.LittleEndian, dataSize)
_, err = f.Write(pcmData)
return err
}
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Voice: genai.Ptr("Kore")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput("Say cheerfully: Have a wonderful day!"),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
if res.Interaction.OutputAudio != nil && res.Interaction.OutputAudio.Data != nil {
pcmBytes, err := base64.StdEncoding.DecodeString(*res.Interaction.OutputAudio.Data)
if err != nil {
log.Fatal(err)
}
if err := saveWaveFile("out.wav", pcmBytes); err != nil {
log.Fatal(err)
}
}
}
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, oluşturulan ses verilerini almak için interaction.output_audio kolaylık özelliğini kullanabilirsiniz. Bu özellik, son oluşturulan ses bloğunu (ham REST JSON yanıtlarında, base64 kodlu ses steps[].content[].data içinde saklanır) döndürür. Kolaylık özellikleri hakkında ayrıntılı bilgi için Etkileşimlere genel bakış bölümüne bakın.
Birden fazla konuşmacı için 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 ile isteğe bağlı dönüş düzeyinde style belirten bir speech_metadata notuyla ayrı bir metin öğesi olarak iletin. Doğal dönüşümlü konuşma ritmi için "mode": "conversational" parametresini kullanın:
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": {
"mode": "conversational",
"speakers": [
{"speaker": "Joe", "voice": "Puck"},
{"speaker": "Jane", "voice": "Kore"},
],
}
},
)
with open("out.wav", "wb") as f:
f.write(base64.b64decode(interaction.output_audio.data))
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: {
mode: 'conversational',
speakers: [
{ speaker: 'Joe', voice: 'Puck' },
{ speaker: 'Jane', voice: 'Kore' },
],
},
},
});
const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
fs.writeFileSync('out.wav', audioBuffer);
}
await main();
Go
package main
import (
"context"
"encoding/base64"
"encoding/binary"
"log"
"os"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func saveWaveFile(filename string, pcmData []byte) error {
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
sampleRate := uint32(24000)
numChannels := uint16(1)
bitsPerSample := uint16(16)
byteRate := sampleRate * uint32(numChannels) * uint32(bitsPerSample/8)
blockAlign := numChannels * (bitsPerSample / 8)
dataSize := uint32(len(pcmData))
f.WriteString("RIFF")
binary.Write(f, binary.LittleEndian, uint32(36+dataSize))
f.WriteString("WAVEfmt ")
binary.Write(f, binary.LittleEndian, uint32(16))
binary.Write(f, binary.LittleEndian, uint16(1))
binary.Write(f, binary.LittleEndian, numChannels)
binary.Write(f, binary.LittleEndian, sampleRate)
binary.Write(f, binary.LittleEndian, byteRate)
binary.Write(f, binary.LittleEndian, blockAlign)
binary.Write(f, binary.LittleEndian, bitsPerSample)
f.WriteString("data")
binary.Write(f, binary.LittleEndian, dataSize)
_, err = f.Write(pcmData)
return err
}
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
prompt := "TTS the following conversation between Joe and Jane:\n" +
"Joe: How's it going today Jane?\n" +
"Jane: Not too bad, how about you?"
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Speaker: genai.Ptr("Joe"), Voice: genai.Ptr("Kore")},
{Speaker: genai.Ptr("Jane"), Voice: genai.Ptr("Puck")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput(prompt),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
if res.Interaction.OutputAudio != nil && res.Interaction.OutputAudio.Data != nil {
pcmBytes, err := base64.StdEncoding.DecodeString(*res.Interaction.OutputAudio.Data)
if err != nil {
log.Fatal(err)
}
if err := saveWaveFile("out.wav", pcmBytes); err != nil {
log.Fatal(err)
}
}
}
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ı 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üş düzeyinde yayınlama (
speech_metadata.style): Bir dönüşün tamamında geçerli olan duyguları, yayınlama stilini, prozodiyi, hızı ve hacmistylealanına (örneğin,"style": "whispered urgently","style": "out of breath"veya"style": "warm and enthusiastic") yerleştirin. - 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.
Go
package main
import (
"context"
"log"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
transcriptRes, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.8-flash"),
Input: interactions.NewInteractionsInput(
"Generate a short transcript around 100 words that reads " +
"like it was clipped from a podcast by excited herpetologists. " +
"The hosts names are Dr. Anya and Liam.",
),
}),
})
if err != nil {
log.Fatal(err)
}
var transcript string
if transcriptRes.Interaction.OutputText != nil {
transcript = *transcriptRes.Interaction.OutputText
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Speaker: genai.Ptr("Dr. Anya"), Voice: genai.Ptr("Kore")},
{Speaker: genai.Ptr("Liam"), Voice: genai.Ptr("Puck")},
})),
}
ttsRes, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput(transcript),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
}),
})
if err != nil {
log.Fatal(err)
}
_ = ttsRes
}
Gerçek zamanlı konuşma üretme
stream: true ayarını yaparak oluşturulan sesi sentezlenirken yayınlayabilirsiniz. Tekli isteklerin (RIFF üstbilgisine sahip eksiksiz bir WAV dosyası döndürür) aksine, akış istekleri varsayılan olarak üstbilgisiz ham 16 bit imzalı küçük endian doğrusal PCM (audio/l16, 24 kHz, mono) parçaları döndürür. Bu nedenle, ses parçaları kapsayıcı üstbilgileri 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ış olup olmamasına bağlı olarak farklı varsayılan ses biçimleri kullanır:
- Tekli istekler (
stream=False): Standart bir RIFF başlığına (24 kHz, mono, 16 bit imzalı little-endian PCM) sahip eksiksiz WAV (audio/wav) sesini döndürür. Çözülen ses baytlarını, WAV başlığını manuel olarak eklemeden doğrudan bir.wavdosyasına kaydedebilirsiniz. - Yayın istekleri (
stream=True): Varsayılan olarak başlıksız ham Linear PCM (audio/l16) parçaları (24 kHz, mono, 16 bit imzalı little-endian PCM) döndürülür. Böylece, her parçada kapsayıcı başlıkları olmadan parçalar sürekli olarak yayınlanabilir veya birleştirilebilir.
Farklı bir ses kodlaması veya örnekleme hızı istemek için mime_type ve isteğe bağlı sample_rate öğelerini response_format içinde 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, 24 kHz varsayılan). Tekli istekler için varsayılan değer. |
| Raw PCM (L16) (varsayılan akış) | "audio/l16" |
Sıkıştırılmamış, başlık içermeyen 16 bit imzalı little-endian doğrusal PCM ses (24 kHz, mono). Akış istekleri için varsayılan değer. |
| Mu-law | "audio/mulaw" |
8 bit G.711 mu-law kodlu ses (Kuzey Amerika ve Japonya'daki telefon/ESY sistemlerinde en çok tercih edilen). |
| A-law | "audio/alaw" |
8 bit G.711 A-law kodlu ses (genellikle Avrupa ve uluslararası telefon sistemlerinde kullanılır). |
Hertz cinsinden sample_rate da belirtebilirsiniz (örneğin, 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();
Go
package main
import (
"context"
"encoding/base64"
"log"
"google.golang.org/genai"
"google.golang.org/genai/interactions/models/interactions"
"google.golang.org/genai/interactions/models/operations"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
generationConfig := &interactions.GenerationConfig{
SpeechConfig: genai.Ptr(interactions.NewSpeechConfigUnion([]interactions.SpeechConfig{
{Voice: genai.Ptr("Kore")},
})),
}
res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
Model: interactions.Model("gemini-3.1-flash-tts-preview"),
Input: interactions.NewInteractionsInput("Say cheerfully: Have a wonderful day!"),
ResponseFormat: genai.Ptr(interactions.NewCreateModelInteractionResponseFormat(
interactions.NewResponseFormat(interactions.AudioResponseFormat{}),
)),
GenerationConfig: generationConfig,
Stream: genai.Ptr(true),
}),
})
if err != nil {
log.Fatal(err)
}
stream := res.InteractionSSEStreamEvent
defer stream.Close()
for stream.Next() {
event := stream.Value()
if stepDelta := event.GetDataStepDelta(); stepDelta != nil {
if audioDelta := stepDelta.GetDeltaAudio(); audioDelta != nil && audioDelta.Data != nil {
audioData, err := base64.StdEncoding.DecodeString(*audioDelta.Data)
if err != nil {
log.Fatal(err)
}
// Process the audio chunk (e.g. play it or write to a file)
_ = audioData
}
}
}
if err := stream.Err(); err != nil {
log.Fatal(err)
}
}
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 dil açıklamasıyla veya
POST /v1beta/voices(type="prompted") kullanarak özel bir vokal karakteri oluşturun. ,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ı durum bilgisizstore=False) kullanılarak referans ve izin verilen seslerden konuşmacı sesi kopyalama.
Ö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 (istemde kullanılan ve kopyalanan sesler arasında paylaşılır) | 1 yıl |
Durumsuz ses anahtarları (voicekey_..., çoğaltılmış) |
store=False |
İstemci tarafından yönetilen | 7 gün |
Ö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 -- Nefesli | Iapetus -- Temizle |
| Umbriel -- Rahat | Algieba -- Pürüzsüz | Despina -- Pürüzsüz |
| Erinome -- Temizle | Algenib -- Gravelly | Rasalgethi -- Bilgilendirici |
| Laomedeia -- Upbeat | Achernar -- Soft | Alnilam -- Firm |
| Schedar -- Even | Gacrux -- Yetişkin | Pulcherrima -- İleri |
| Achird -- Arkadaşça | Zubenelgenubi -- Gündelik | Vindemiatrix -- Nazik |
| Sadachbia -- Canlı | Sadaltager -- Bilgili | Sulafat -- Warm |
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 | ✔️ | ✔️ |
| Belarus dili | ✔️ | ✔️ |
| 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-previewyerine 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
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. - Köşeli parantezli 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ı köşeli parantezlerle (ör.
<laugh>,<sigh>,<cough>,<breath>veya<short pause>) 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. - Çok konuşmacılı isteklerde her dönüşte
speakerbelirtin: Çok konuşmacılı isteklerdeki her dönüş, yapılandırılmış konuşmacılardan biriyle eşleşenspeech_metadataiçindespeaker'yi 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ını Ses tasarımında oluşturulan özel bir sesle değiştirin, ardından buvoice_...kimliğini TTS 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ık içermeyen ham PCMaudio/l16döndüren) aksine, Gemini 3.8 TTS, tekli istekler için varsayılan olarak standart bir RIFF başlığıyla 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. - Kanalınızda başlık içermeyen ham PCM, mu-law veya A-law ses kullanılıyorsa
response_formatdeğerini açıkça"audio/l16","audio/mulaw"veya"audio/alaw"olarak ayarlayın. Ses çıkışı biçimleri bölümüne bakın.
- 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 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 özelliklerinispeech_metadataöğesininstylealanına yerleştirin. Dönüşler arasında tutarlı bir karakter ve performans oluşturmak için Ses tasarımı bölümünde karakteri önceden tasarlayın vestyleözelliğini yalnızca isteğe bağlı dönüş seviyesindeki 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_metadatabö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|) sarmalayarak konuşmacının sırası içinde doğal arka kanallar veya tepki başına ayrı bir sıra oluşturmadan çakışan konuşmalar oluşturun.
- 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. tur (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."
- 1. tur (A konuşmacısı):
- Ç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-ttsile verir):- 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ı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. Kalıcı bir özelvoice_...karakter oluşturmak için Ses tasarımında aynı yaratıcı sezgiyi kullanın, ardından 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. 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 hedef dilinize ve karakterinize uygun bir bölgesel ses seçin.
- 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. - Ö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 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ış veyavoice_.../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
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 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ığıylaaudio/wavdöndürdüğünden, ham PCM ({"type": "audio", "mime_type": "audio/l16"}) isteyin veya 24 kHz PCM ses çerçevelerini birleştirmeden önce her dönüşten WAV başlığını kaldırı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).
- Durumlu sesler (
- Dil kapsamı için Desteklenen diller bölümünü inceleyin.
Sırada ne var?
- Ses tasarımı ile doğal dilden özel vokal karakterler oluşturun.
- Ses kopyalama ile mevcut bir konuşmacının sesini kopyalama
- Gemini 3.8 Flash TTS ve Gemini 3.8 Flash-Lite TTS model sayfalarındaki model özelliklerini karşılaştırın.
- Live API ile etkileşimli çift yönlü ses deneyimini keşfedin.