Ses tasarımı

Ses tasarımı, Gemini API Voices uç noktasını (POST /v1beta/voices) kullanarak doğal dil açıklamasıyla yepyeni ve kalıcı bir sesli karakter oluşturmanıza olanak tanır. Önceden oluşturulmuş seslerle veya referans ses kaydıyla sınırlı kalmak yerine bir karakterin yaşını, ses tonunu, aksanını ve temel sunumunu açıklayabilir ve projenize kaydedilen, yeniden kullanılabilir bir voice_... kimliği alabilirsiniz.

Özel sesleri tasarlamanın, denemenin ve yinelemenin en hızlı yolu, Google AI Studio'daki etkileşimli Ses Tasarımı stüdyosunu kullanmaktır. Metin istemlerinden özel karakterler oluşturabilir, bunları örnek senaryolarla test edebilir ve sonuçtaki voice_... kimliğini doğrudan uygulama kodunuza kopyalayabilirsiniz.

Hem Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) hem de Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) Voice tasarımını destekler.

Tasarlanmış bir ses oluşturma

Metin açıklamasından özel bir ses oluşturmak için Google GenAI SDK'sını (google-genai 2.25.0+ / @google/genai 2.24.0+) veya REST API'yi kullanın. "prompted" sesleri için hem voices.create (CreateVoice) hem de voices.get (GetVoice), yalnızca çıkış sample_audio alanı (mime_type: "audio/wav", base64 kodlu data) döndürür. Böylece, oluşturulan sesi hemen dinleyebilirsiniz:

Python

import base64
from google import genai

client = genai.Client()

# 1. Design a custom voice persona from natural language
created_voice = client.voices.create(
    store=True,
    voice={
        "model": "gemini-3.8-flash-tts",
        "type": "prompted",
        "display_name": "Warm British Astronomer",
        "gender": "male",
        "language_code": "en-GB",
        "prompted": {
            "input": (
                "A warm, thoughtful astronomer in his late 60s with a gentle"
                " British accent, speaking with quiet wonder."
            )
        },
    },
)

print(f"Created voice ID: {created_voice.id}")

# Save the generated sample_audio preview (audio/wav) returned by CreateVoice
if created_voice.sample_audio and created_voice.sample_audio.data:
    with open("voice_preview.wav", "wb") as f:
        f.write(base64.b64decode(created_voice.sample_audio.data))

JavaScript

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

const ai = new GoogleGenAI();

// 1. Design a custom voice persona from natural language
const createdVoice = await ai.voices.create({
  store: true,
  voice: {
    model: "gemini-3.8-flash-tts",
    type: "prompted",
    display_name: "Warm British Astronomer",
    gender: "male",
    language_code: "en-GB",
    prompted: {
      input:
        "A warm, thoughtful astronomer in his late 60s with a gentle British accent, speaking with quiet wonder.",
    },
  },
});

console.log(`Created voice ID: ${createdVoice.id}`);

// Save the generated sample_audio preview (audio/wav) returned by CreateVoice
if (createdVoice.sample_audio?.data) {
  fs.writeFileSync(
    "voice_preview.wav",
    Buffer.from(createdVoice.sample_audio.data, "base64")
  );
}

REST

curl "https://generativelanguage.googleapis.com/v1beta/voices" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -X POST \
  -d '{
    "store": true,
    "voice": {
      "model": "gemini-3.8-flash-tts",
      "type": "prompted",
      "display_name": "Warm British Astronomer",
      "gender": "male",
      "language_code": "en-GB",
      "prompted": {
        "input": "A warm, thoughtful astronomer in his late 60s with a gentle British accent, speaking with quiet wonder."
      }
    }
  }' | tee created_voice.json | jq -r '.sample_audio.data' | base64 --decode > voice_preview.wav

Sesli tasarımın işleyiş şekli

  1. İstemli ses oluşturma: type="prompted" ve store=True ile voices.create (POST /v1beta/voices) numarasını arayın.
  2. Kalıcı bir voice_id ve sample_audio önizlemesi alma: API, ses kimliğini oluşturur, projenizde saklar ve ses için oluşturulan önizleme sesini içeren sample_audio (mime_type: "audio/wav", base64 kodlu data) ile birlikte kalıcı bir kimlik (ör. voice_abc123...) döndürür.
  3. Konuşma sentezleme: Sentezleme isteklerinizde ses adının kabul edildiği her yerde voice_id öğesini iletin.

Tasarladığınız sesle konuşma sentezleme

Bir ses oluşturduktan sonra konuşma üretmek için id (voice_...) değerini Etkileşimler API'sine iletin:

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": (
                "Look out past the rings of Saturn. Those faint photons left"
                " their source millions of years ago."
            ),
            "annotations": [{
                "type": "speech_metadata",
                "style": "reflective and awe-inspired",
            }],
        }],
    }],
    response_format={"type": "audio"},
    generation_config={
        "speech_config": [
            {"voice": created_voice.id},
        ]
    },
)

with open("designed_voice.wav", "wb") as f:
    f.write(base64.b64decode(interaction.output_audio.data))

JavaScript

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

const ai = new GoogleGenAI();

const interaction = await ai.interactions.create({
  model: "gemini-3.8-flash-tts",
  input: [{
    type: "user_input",
    content: [{
      type: "text",
      text: "Look out past the rings of Saturn. Those faint photons left their source millions of years ago.",
      annotations: [{
        type: "speech_metadata",
        style: "reflective and awe-inspired",
      }],
    }],
  }],
  response_format: { type: "audio" },
  generation_config: {
    speech_config: [
      { voice: createdVoice.id },
    ],
  },
});

fs.writeFileSync("designed_voice.wav", Buffer.from(interaction.output_audio.data, "base64"));

REST

curl "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -X POST \
  -d '{
    "model": "gemini-3.8-flash-tts",
    "input": [{
      "type": "user_input",
      "content": [{
        "type": "text",
        "text": "Look out past the rings of Saturn. Those faint photons left their source millions of years ago.",
        "annotations": [{
          "type": "speech_metadata",
          "style": "reflective and awe-inspired"
        }]
      }]
    }],
    "response_format": {"type": "audio"},
    "generation_config": {
      "speech_config": [
        {"voice": "voice_YOUR_DESIGNED_VOICE_ID"}
      ]
    }
  }'

Seslerinizi yönetme

Voices API'yi kullanarak kayıtlı seslerinizi istediğiniz zaman listeleyebilir, filtreleyebilir, inceleyebilir ve silebilirsiniz (tüm filtre parametreleri için Genişletilmiş Ses Kitaplığı ve filtreleme bölümüne bakın).

  • Depolama sınırları ve TTL: Durumlu sesler (store=True, istemli ve kopyalanmış sesler arasında paylaşılır) için proje başına 200 ses sınırı ve 1 yıllık TTL (geçerlilik süresi) vardır.
  • sample_audio availability: voices.create() (CreateVoice) ve voices.get() (GetVoice), "prompted" sesleri için sample_audio (mime_type: "audio/wav", base64 kodlu data) değerini doldurur. Listelemenin hafif olması için voices.list() (ListVoices), sample_audio öğesini atlar ("replicated" ve "prebuilt" sesleri için sample_audio ayarlanmamıştır).

Python

from google import genai

client = genai.Client()

# List stored prompted voices in your project filtered by language
response = client.voices.list(
    type_=["prompted"],
    language_code=["en-US", "en-GB"],
)
for voice in response.voices or []:
    print(voice.id, voice.display_name, voice.type)

# Retrieve a specific voice by ID
voice_details = client.voices.get(id=created_voice.id)

# Delete a stored custom voice
client.voices.delete(id=created_voice.id)

JavaScript

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

const ai = new GoogleGenAI();

// List stored prompted voices in your project filtered by language
const response = await ai.voices.list({
  type: ["prompted"],
  language_code: ["en-US", "en-GB"],
});
for (const voice of response.voices ?? []) {
  console.log(voice.id, voice.display_name, voice.type);
}

// Retrieve a specific voice by ID
const voiceDetails = await ai.voices.get(createdVoice.id);

// Delete a stored custom voice
await ai.voices.delete(createdVoice.id);

REST

# List stored prompted voices filtered by language
curl -G "https://generativelanguage.googleapis.com/v1beta/voices" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  --data-urlencode "type=prompted" \
  --data-urlencode "language_code=en-US" \
  --data-urlencode "language_code=en-GB"

# Retrieve a specific voice by ID
curl "https://generativelanguage.googleapis.com/v1beta/voices/voice_YOUR_DESIGNED_VOICE_ID" \
  -H "x-goog-api-key: $GEMINI_API_KEY"

# Delete a stored custom voice
curl -X DELETE "https://generativelanguage.googleapis.com/v1beta/voices/voice_YOUR_DESIGNED_VOICE_ID" \
  -H "x-goog-api-key: $GEMINI_API_KEY"

Sesli tasarım için istem yazmayla ilgili en iyi uygulamalar

  • Kalıcı vokal özelliklerini style yerine Voice tasarımına yerleştirin: voices.create'da sesi oluştururken yaş, cinsiyet, tını, vokal dokusu ve bölgesel aksan gibi değişmez özellikleri tanımlayın.
  • speech_metadata.style karakterini duruma bağlı duygular için kullanın: Özel sesiniz oluşturulduktan sonra, konuşmacının temel kimliğini değiştirmeden adım adım oyunculuğu yönlendirmek için kısa style istemler (örneğin, "whispered urgently" veya "cheerful and energetic") kullanın.
  • Net ve kısa olun: 1-2 cümlelik net bir açıklama (ör. "30'lu yaşlarında, hafif Orta Batı aksanlı, canlı ve enerjik bir spor spikeri") çelişkili veya çok uzun paragraflara kıyasla daha temiz ve tutarlı sonuçlar verir.

Sırada ne var?

  • Ses kopyalama özelliğinde mevcut bir konuşmacının sesini nasıl kopyalayacağınızı öğrenin.
  • Metin okuma kılavuzunda dönüş seviyesinde stil oluşturma, satır içi etiketler ve birden fazla konuşmacının yer aldığı diyaloglar hakkında bilgi edinin.