Interfejs Gemini API może przekształcać tekst wejściowy w dźwięk z jednego lub wielu głośników za pomocą natywnych funkcji zamiany tekstu na mowę. Generowanie tekstu na mowę (TTS) jest kontrolowane, co oznacza, że możesz używać języka naturalnego do strukturyzowania interakcji i określania stylu, akcentu, tempa i tonu dźwięku.
Funkcja TTS różni się od generowania mowy za pomocą interfejsu Live API, który jest przeznaczony do interaktywnych, nieustrukturyzowanych danych audio oraz wejść i wyjść multimodalnych. Interfejs Live API sprawdza się w dynamicznych kontekstach konwersacyjnych, a TTS za pomocą Gemini API jest dostosowany do scenariuszy, które wymagają dokładnego odczytania tekstu z precyzyjną kontrolą stylu i dźwięku, takich jak generowanie podcastów lub audiobooków.
Z tego przewodnika dowiesz się, jak generować dźwięk z tekstu dla jednego lub wielu mówców.
Zanim zaczniesz
Używaj wariantu modelu Gemini 2.5 z natywną funkcją zamiany tekstu na mowę (TTS), jak podano w sekcji Obsługiwane modele. Aby uzyskać optymalne wyniki, zastanów się, który model najlepiej pasuje do Twojego konkretnego przypadku użycia.
Przed rozpoczęciem tworzenia możesz przetestować modele TTS Gemini 2.5 w AI Studio.
Zamiana tekstu na mowę z jednym głosem
Aby przekonwertować tekst na dźwięk z jednym mówcą, ustaw tryb odpowiedzi na „audio” i przekaż obiekt SpeechConfig z ustawionym parametrem VoiceConfig.
Musisz wybrać nazwę głosu z gotowych głosów wyjściowych.
W tym przykładzie zapisujemy wyjściowy dźwięk z modelu w pliku wave:
Python
from google import genai
from google.genai import types
import wave
# Set up the wave file to save the output:
def wave_file(filename, pcm, channels=1, rate=24000, sample_width=2):
   with wave.open(filename, "wb") as wf:
      wf.setnchannels(channels)
      wf.setsampwidth(sample_width)
      wf.setframerate(rate)
      wf.writeframes(pcm)
client = genai.Client()
response = client.models.generate_content(
   model="gemini-2.5-flash-preview-tts",
   contents="Say cheerfully: Have a wonderful day!",
   config=types.GenerateContentConfig(
      response_modalities=["AUDIO"],
      speech_config=types.SpeechConfig(
         voice_config=types.VoiceConfig(
            prebuilt_voice_config=types.PrebuiltVoiceConfig(
               voice_name='Kore',
            )
         )
      ),
   )
)
data = response.candidates[0].content.parts[0].inline_data.data
file_name='out.wav'
wave_file(file_name, data) # Saves the file to current directory
JavaScript
import {GoogleGenAI} from '@google/genai';
import wav from 'wav';
async function saveWaveFile(
   filename,
   pcmData,
   channels = 1,
   rate = 24000,
   sampleWidth = 2,
) {
   return new Promise((resolve, reject) => {
      const writer = new wav.FileWriter(filename, {
            channels,
            sampleRate: rate,
            bitDepth: sampleWidth * 8,
      });
      writer.on('finish', resolve);
      writer.on('error', reject);
      writer.write(pcmData);
      writer.end();
   });
}
async function main() {
   const ai = new GoogleGenAI({});
   const response = await ai.models.generateContent({
      model: "gemini-2.5-flash-preview-tts",
      contents: [{ parts: [{ text: 'Say cheerfully: Have a wonderful day!' }] }],
      config: {
            responseModalities: ['AUDIO'],
            speechConfig: {
               voiceConfig: {
                  prebuiltVoiceConfig: { voiceName: 'Kore' },
               },
            },
      },
   });
   const data = response.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
   const audioBuffer = Buffer.from(data, 'base64');
   const fileName = 'out.wav';
   await saveWaveFile(fileName, audioBuffer);
}
await main();
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
        "contents": [{
          "parts":[{
            "text": "Say cheerfully: Have a wonderful day!"
          }]
        }],
        "generationConfig": {
          "responseModalities": ["AUDIO"],
          "speechConfig": {
            "voiceConfig": {
              "prebuiltVoiceConfig": {
                "voiceName": "Kore"
              }
            }
          }
        },
        "model": "gemini-2.5-flash-preview-tts",
    }' | jq -r '.candidates[0].content.parts[0].inlineData.data' | \
          base64 --decode >out.pcm
# You may need to install ffmpeg.
ffmpeg -f s16le -ar 24000 -ac 1 -i out.pcm out.wav
Zamiana tekstu na mowę z wieloma głosami
W przypadku dźwięku z wielu głośników potrzebny jest obiekt MultiSpeakerVoiceConfig, w którym każdy głośnik (maksymalnie 2) jest skonfigurowany jako SpeakerVoiceConfig.
Każdy element speaker musisz zdefiniować za pomocą tych samych nazw, które zostały użyte w prompcie:
Python
from google import genai
from google.genai import types
import wave
# Set up the wave file to save the output:
def wave_file(filename, pcm, channels=1, rate=24000, sample_width=2):
   with wave.open(filename, "wb") as wf:
      wf.setnchannels(channels)
      wf.setsampwidth(sample_width)
      wf.setframerate(rate)
      wf.writeframes(pcm)
client = genai.Client()
prompt = """TTS the following conversation between Joe and Jane:
         Joe: How's it going today Jane?
         Jane: Not too bad, how about you?"""
response = client.models.generate_content(
   model="gemini-2.5-flash-preview-tts",
   contents=prompt,
   config=types.GenerateContentConfig(
      response_modalities=["AUDIO"],
      speech_config=types.SpeechConfig(
         multi_speaker_voice_config=types.MultiSpeakerVoiceConfig(
            speaker_voice_configs=[
               types.SpeakerVoiceConfig(
                  speaker='Joe',
                  voice_config=types.VoiceConfig(
                     prebuilt_voice_config=types.PrebuiltVoiceConfig(
                        voice_name='Kore',
                     )
                  )
               ),
               types.SpeakerVoiceConfig(
                  speaker='Jane',
                  voice_config=types.VoiceConfig(
                     prebuilt_voice_config=types.PrebuiltVoiceConfig(
                        voice_name='Puck',
                     )
                  )
               ),
            ]
         )
      )
   )
)
data = response.candidates[0].content.parts[0].inline_data.data
file_name='out.wav'
wave_file(file_name, data) # Saves the file to current directory
JavaScript
import {GoogleGenAI} from '@google/genai';
import wav from 'wav';
async function saveWaveFile(
   filename,
   pcmData,
   channels = 1,
   rate = 24000,
   sampleWidth = 2,
) {
   return new Promise((resolve, reject) => {
      const writer = new wav.FileWriter(filename, {
            channels,
            sampleRate: rate,
            bitDepth: sampleWidth * 8,
      });
      writer.on('finish', resolve);
      writer.on('error', reject);
      writer.write(pcmData);
      writer.end();
   });
}
async function main() {
   const ai = new GoogleGenAI({});
   const prompt = `TTS the following conversation between Joe and Jane:
         Joe: How's it going today Jane?
         Jane: Not too bad, how about you?`;
   const response = await ai.models.generateContent({
      model: "gemini-2.5-flash-preview-tts",
      contents: [{ parts: [{ text: prompt }] }],
      config: {
            responseModalities: ['AUDIO'],
            speechConfig: {
               multiSpeakerVoiceConfig: {
                  speakerVoiceConfigs: [
                        {
                           speaker: 'Joe',
                           voiceConfig: {
                              prebuiltVoiceConfig: { voiceName: 'Kore' }
                           }
                        },
                        {
                           speaker: 'Jane',
                           voiceConfig: {
                              prebuiltVoiceConfig: { voiceName: 'Puck' }
                           }
                        }
                  ]
               }
            }
      }
   });
   const data = response.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
   const audioBuffer = Buffer.from(data, 'base64');
   const fileName = 'out.wav';
   await saveWaveFile(fileName, audioBuffer);
}
await main();
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "contents": [{
    "parts":[{
      "text": "TTS the following conversation between Joe and Jane:
                Joe: Hows it going today Jane?
                Jane: Not too bad, how about you?"
    }]
  }],
  "generationConfig": {
    "responseModalities": ["AUDIO"],
    "speechConfig": {
      "multiSpeakerVoiceConfig": {
        "speakerVoiceConfigs": [{
            "speaker": "Joe",
            "voiceConfig": {
              "prebuiltVoiceConfig": {
                "voiceName": "Kore"
              }
            }
          }, {
            "speaker": "Jane",
            "voiceConfig": {
              "prebuiltVoiceConfig": {
                "voiceName": "Puck"
              }
            }
          }]
      }
    }
  },
  "model": "gemini-2.5-flash-preview-tts",
}' | jq -r '.candidates[0].content.parts[0].inlineData.data' | \
    base64 --decode > out.pcm
# You may need to install ffmpeg.
ffmpeg -f s16le -ar 24000 -ac 1 -i out.pcm out.wav
Sterowanie stylem mowy za pomocą promptów
Możesz kontrolować styl, ton, akcent i tempo za pomocą promptów w języku naturalnym w przypadku zamiany tekstu na mowę z jednym lub wieloma mówcami. Na przykład w prompcie z jednym głośnikiem możesz powiedzieć:
Say in an spooky whisper:
"By the pricking of my thumbs...
Something wicked this way comes"
W prompcie z wieloma osobami mówiącymi podaj modelowi imię każdej z nich i odpowiednią transkrypcję. Możesz też podać wskazówki dla każdego głośnika z osobna:
Make Speaker1 sound tired and bored, and Speaker2 sound excited and happy:
Speaker1: So... what's on the agenda today?
Speaker2: You're never going to guess!
Aby jeszcze bardziej podkreślić styl lub emocje, które chcesz przekazać, użyj opcji głosu, która do nich pasuje. Na przykład w poprzednim prompcie oddech Enceladusa może podkreślać „zmęczenie” i „znudzenie”, a radosny ton Pucka może uzupełniać „podekscytowanie” i „radość”.
Generowanie promptu do przekształcenia tekstu w audio
Modele TTS generują tylko dźwięk, ale możesz użyć innych modeli, aby najpierw wygenerować transkrypcję, a potem przekazać ją do modelu TTS, który ją odczyta.
Python
from google import genai
from google.genai import types
client = genai.Client()
transcript = client.models.generate_content(
   model="gemini-2.0-flash",
   contents="""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.""").text
response = client.models.generate_content(
   model="gemini-2.5-flash-preview-tts",
   contents=transcript,
   config=types.GenerateContentConfig(
      response_modalities=["AUDIO"],
      speech_config=types.SpeechConfig(
         multi_speaker_voice_config=types.MultiSpeakerVoiceConfig(
            speaker_voice_configs=[
               types.SpeakerVoiceConfig(
                  speaker='Dr. Anya',
                  voice_config=types.VoiceConfig(
                     prebuilt_voice_config=types.PrebuiltVoiceConfig(
                        voice_name='Kore',
                     )
                  )
               ),
               types.SpeakerVoiceConfig(
                  speaker='Liam',
                  voice_config=types.VoiceConfig(
                     prebuilt_voice_config=types.PrebuiltVoiceConfig(
                        voice_name='Puck',
                     )
                  )
               ),
            ]
         )
      )
   )
)
# ...Code to stream or save the output
JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({});
async function main() {
const transcript = await ai.models.generateContent({
   model: "gemini-2.0-flash",
   contents: "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.",
   })
const response = await ai.models.generateContent({
   model: "gemini-2.5-flash-preview-tts",
   contents: transcript,
   config: {
      responseModalities: ['AUDIO'],
      speechConfig: {
         multiSpeakerVoiceConfig: {
            speakerVoiceConfigs: [
                   {
                     speaker: "Dr. Anya",
                     voiceConfig: {
                        prebuiltVoiceConfig: {voiceName: "Kore"},
                     }
                  },
                  {
                     speaker: "Liam",
                     voiceConfig: {
                        prebuiltVoiceConfig: {voiceName: "Puck"},
                    }
                  }
                ]
              }
            }
      }
  });
}
// ..JavaScript code for exporting .wav file for output audio
await main();
Opcje głosowe
Modele TTS obsługują te 30 opcji głosowych w polu voice_name:
| Zephyr – jasny | Puck – Upbeat | Charon – zawiera przydatne informacje | 
| Kore – firma | Fenrir – pobudliwy | Leda – młodzieńczy | 
| Orus – firma | Aoede – Breezy | Callirrhoe – spokojny | 
| Autonoe – jasny | Enceladus – Breathy | Iapetus – Wyczyść | 
| Umbriel – spokojny | Algieba – gładka | Despina – Smooth | 
| Erinome – Wyczyść | Algenib – żwirowa | Rasalgethi – zawiera przydatne informacje | 
| Laomedeia – Upbeat | Achernar – Soft | Alnilam – Firm | 
| Schedar – Równomierna | Gacrux – Artykuły dla dorosłych | Pulcherrima – pewny siebie | 
| Achird – przyjazny | Zubenelgenubi – zwykłe | Vindemiatrix – delikatny | 
| Sadachbia – Lively | Sadaltager – wiedza | Sulafat – ciepły | 
Wszystkie opcje głosowe możesz usłyszeć w AI Studio.
Obsługiwane języki
Modele TTS automatycznie wykrywają język wejściowy. Obsługują one te 24 języki:
| Język | Kod BCP-47 | Język | Kod BCP-47 | 
|---|---|---|---|
| arabski (egipski), | ar-EG | 
         niemiecki (Niemcy) | de-DE | 
      
| angielski (USA) | en-US | 
         hiszpański (USA) | es-US | 
      
| francuski (Francja) | fr-FR | 
         hindi (Indie) | hi-IN | 
      
| indonezyjski (Indonezja) | id-ID | 
         włoski (Włochy) | it-IT | 
      
| japoński (Japonia) | ja-JP | 
         koreański (Korea) | ko-KR | 
      
| portugalski (Brazylia) | pt-BR | 
         rosyjski (Rosja) | ru-RU | 
      
| niderlandzki (Holandia) | nl-NL | 
         polski (Polska) | pl-PL | 
      
| tajski (Tajlandia) | th-TH | 
         turecki (Turcja) | tr-TR | 
      
| wietnamski (Wietnam) | vi-VN | 
         rumuński (Rumunia) | ro-RO | 
      
| ukraiński (Ukraina) | uk-UA | 
         bengalski (Bangladesz) | bn-BD | 
      
| angielski (Indie) | Pakiet en-IN i hi-IN | 
         marathi (Indie) | mr-IN | 
      
| tamilski (Indie) | ta-IN | 
         telugu (Indie) | te-IN | 
      
Obsługiwane modele
| Model | Pojedynczy rozmówca | Wielogłośnikowy | 
|---|---|---|
| Gemini 2.5 Flash Preview TTS | ✔️ | ✔️ | 
| Wersja testowa Gemini 2.5 Pro TTS | ✔️ | ✔️ | 
Ograniczenia
- Modele TTS mogą przyjmować tylko dane wejściowe w postaci tekstu i generować wyjście audio.
 - Sesja TTS ma limit okna kontekstu wynoszący 32 tys. tokenów.
 - W sekcji Języki znajdziesz informacje o obsługiwanych językach.
 
Co dalej?
- Wypróbuj przepis na generowanie dźwięku.
 - Interfejs Live API Gemini oferuje interaktywne opcje generowania dźwięku, które możesz przeplatać z innymi trybami.
 - Informacje o pracy z wejściowymi danymi audio znajdziesz w przewodniku Rozumienie dźwięku.