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 aplikacji warto 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 potrzebujesz obiektu 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 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 – Firm | 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 – chrapliwy | 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 – Knowledgeable | 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 |
---|---|---|
Wersja testowa Gemini 2.5 Flash TTS | ✔️ | ✔️ |
Wersja testowa Gemini 2.5 Pro TTS | ✔️ | ✔️ |
Ograniczenia
- Modele TTS mogą przyjmować tylko dane wejściowe w postaci tekstu i generować dane wyjściowe w postaci dźwięku.
- 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 przepisy 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.