API Gemini может преобразовывать текстовый ввод в аудио для одного или нескольких говорящих, используя собственные возможности генерации текста в речь (TTS). Генерация текста в речь (TTS) управляема , то есть вы можете использовать естественный язык для структурирования взаимодействий и управления стилем , акцентом , темпом и тоном аудио.
Возможность TTS отличается от генерации речи, предоставляемой через Live API , которая разработана для интерактивного, неструктурированного аудио и мультимодальных входов и выходов. В то время как Live API отлично подходит для динамических разговорных контекстов, TTS через Gemini API предназначен для сценариев, требующих точного чтения текста с детальным контролем стиля и звука, например, для генерации подкастов или аудиокниг.
В этом руководстве показано, как создать из текста аудиозапись для одного или нескольких говорящих.
Прежде чем начать
Убедитесь, что вы используете вариант модели Gemini 2.5 с собственными возможностями преобразования текста в речь (TTS), как указано в разделе Поддерживаемые модели . Для получения оптимальных результатов рассмотрите, какая модель лучше всего подходит для вашего конкретного варианта использования.
Перед началом сборки вам может быть полезно протестировать модели Gemini 2.5 TTS в AI Studio .
Преобразование текста в речь одним диктором
Чтобы преобразовать текст в аудиосигнал одного динамика, установите модальность ответа на «аудио» и передайте объект SpeechConfig
с набором VoiceConfig
. Вам нужно будет выбрать имя голоса из готовых выходных голосов .
В этом примере выходной аудиосигнал модели сохраняется в файле WAV:
Питон
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();
ОТДЫХ
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
Многоканальное преобразование текста в речь
Для многоканального звука вам понадобится объект MultiSpeakerVoiceConfig
с каждым динамиком (до 2), настроенным как SpeakerVoiceConfig
. Вам нужно будет определить каждого speaker
с теми же именами, которые используются в приглашении :
Питон
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();
ОТДЫХ
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
Управление стилем речи с помощью подсказок
Вы можете управлять стилем, тоном, акцентом и темпом, используя подсказки на естественном языке для TTS как для одного, так и для нескольких говорящих. Например, в подсказке для одного говорящего вы можете сказать:
Say in an spooky whisper:
"By the pricking of my thumbs...
Something wicked this way comes"
В подсказке для нескольких спикеров предоставьте модели имя каждого спикера и соответствующую расшифровку. Вы также можете предоставить руководство для каждого спикера индивидуально:
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!
Попробуйте использовать вариант голоса , который соответствует стилю или эмоции, которую вы хотите передать, чтобы подчеркнуть это еще больше. Например, в предыдущей подсказке придыхание Энцелада может подчеркнуть «усталый» и «скучный», в то время как оптимистичный тон Пака может дополнить «возбужденный» и «счастливый».
Создание запроса на конвертацию в аудио
Модели TTS выводят только аудио, но вы можете использовать другие модели , чтобы сначала создать расшифровку, а затем передать ее в модель TTS для чтения вслух.
Питон
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();
Голосовые опции
Модели TTS поддерживают следующие 30 голосовых опций в поле voice_name
:
Зефир -- Яркий | Пак -- оптимистичный | Харон -- Информативный |
Коре -- Фирма | Фенрир -- Возбудимый | Леда -- Юная |
Орус -- Фирма | Aoede -- Свежий | Каллироя -- Легкая на подъем |
Автоное -- Яркое | Энцелад -- Придыхающийся | Япет -- Ясно |
Умбриэль -- Легкий в общении | Альгиеба -- Гладкий | Деспина -- Гладкая |
Эриноме -- Ясно | Альгениб -- Гравий | Расалгети -- Информационный |
Лаомедея — оптимистичная | Ахернар -- Мягкий | Альнилам -- Фирма |
Шедар -- Даже | Гэкрукс -- Зрелый | Пульчеррима -- Вперед |
Ахирд -- Дружелюбный | Зубенелгенуби -- Повседневный | Виндемиатрикс -- Нежная |
Садачбия -- Живой | Садалтагер -- Знающий | Сульфат -- Теплый |
Все варианты голосов можно прослушать в AI Studio .
Поддерживаемые языки
Модели TTS автоматически определяют язык ввода. Они поддерживают следующие 24 языка:
Язык | Код BCP-47 | Язык | Код BCP-47 |
---|---|---|---|
Арабский (египетский) | ar-EG | Немецкий (Германия) | de-DE |
Английский (США) | en-US | Испанский (США) | es-US |
Французский (Франция) | fr-FR | Хинди (Индия) | hi-IN |
Индонезийский (Индонезия) | id-ID | Итальянский (Италия) | it-IT |
Японский (Япония) | ja-JP | Корейский (Корея) | ko-KR |
Португальский (Бразилия) | pt-BR | Русский (Россия) | ru-RU |
Голландский (Нидерланды) | nl-NL | Польский (Польша) | pl-PL |
Тайский (Таиланд) | th-TH | Турецкий (Турция) | tr-TR |
Вьетнамский (Вьетнам) | vi-VN | Румынский (Румыния) | ro-RO |
Украинский (Украина) | uk-UA | Бенгальский (Бангладеш) | bn-BD |
Английский (Индия) | Комплект en-IN hi-IN -IN | Маратхи (Индия) | mr-IN |
Тамильский (Индия) | ta-IN | Телугу (Индия) | te-IN |
Поддерживаемые модели
Модель | Один динамик | Мультиспикер |
---|---|---|
Gemini 2.5 Flash Предварительный просмотр TTS | ✔️ | ✔️ |
Gemini 2.5 Pro Предварительный просмотр TTS | ✔️ | ✔️ |
Ограничения
- Модели TTS могут только принимать текстовые входные данные и генерировать аудиовыходы.
- Сеанс TTS имеет ограничение на размер контекстного окна в 32 тыс. токенов.
- Информацию о языковой поддержке см. в разделе «Языки» .
Что дальше?
- Попробуйте кулинарную книгу по созданию аудио .
- Live API Gemini предлагает интерактивные возможности генерации звука, которые можно комбинировать с другими модальностями.
- Для работы с аудиовходами посетите руководство по пониманию аудио .