Gemini API может преобразовывать текстовые входные данные в аудио с одним или несколькими динамиками, используя возможности генерации синтеза речи (TTS) Gemini.
Генерация речи управляема. Это значит, что вы можете комбинировать структурированные метаданные (speech_metadata) и встроенные теги, чтобы задавать стиль, акцент, темп и тон аудио.
Функция TTS отличается от генерации речи, предоставляемой через Live API, который предназначен для интерактивного неструктурированного аудио, а также мультимодальных входных и выходных данных. Live API отлично подходит для динамических разговоров, а TTS через Gemini API – для сценариев, в которых требуется точное воспроизведение текста с детальным контролем над стилем и звуком, например для создания подкастов или аудиокниг.
В этом руководстве рассказывается, как сгенерировать аудио с одним или несколькими говорящими из текста с помощью Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) и Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts).
Подготовка
Убедитесь, что вы используете модель Gemini TTS, указанную в разделе Поддерживаемые модели. Чтобы выбрать оптимальную модель для вашей рабочей нагрузки, ознакомьтесь с разделом Когда использовать какую модель.
Прежде чем начать разработку, вы можете протестировать модели Gemini TTS в AI Studio.
Озвучивание текста одним голосом
Чтобы преобразовать текст в аудио с одним говорящим, используя модели синтеза речи Gemini 3.8, передайте дословную расшифровку в parts[].text, добавьте стили на уровне реплик в parts[].speech_metadata и настройте голос в speechConfig.voiceConfig. Вы можете передать название встроенного голоса, идентификатор из расширенной библиотеки голосов, идентификатор пользовательского дизайна голоса (voice_...) или идентификатор репликации голоса (voice_... или необязательный voicekey_... без сохранения состояния).
В этом примере выходные аудиоданные модели сохраняются в WAV-файл:
Python
from google import genai
client = genai.Client()
response = client.models.generate_content(
model="gemini-3.8-flash-tts",
contents=[{
"role": "user",
"parts": [{
"text": "Have a wonderful day!",
"speech_metadata": {"style": "cheerful and friendly"},
}],
}],
config={
"response_modalities": ["AUDIO"],
"speech_config": {
"voice_config": {"voice": "Kore"}
},
},
)
data = response.candidates[0].content.parts[0].inline_data.data
with open("out.wav", "wb") as f:
f.write(data)
JavaScript
import {GoogleGenAI} from '@google/genai';
import * as fs from 'node:fs';
async function main() {
const ai = new GoogleGenAI({});
const response = await ai.models.generateContent({
model: 'gemini-3.8-flash-tts',
contents: [{
role: 'user',
parts: [{
text: 'Have a wonderful day!',
speechMetadata: { style: 'cheerful and friendly' },
}],
}],
config: {
responseModalities: ['AUDIO'],
speechConfig: {
voiceConfig: { voice: 'Kore' },
},
},
});
const data = response.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
const audioBuffer = Buffer.from(data, 'base64');
fs.writeFileSync('out.wav', audioBuffer);
}
await main();
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash-tts:generateContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-X POST \
-H "Content-Type: application/json" \
-d '{
"contents": [{
"role": "user",
"parts": [{
"text": "Have a wonderful day!",
"speech_metadata": {
"style": "cheerful and friendly"
}
}]
}],
"generationConfig": {
"responseModalities": ["AUDIO"],
"speechConfig": {
"voiceConfig": {
"voice": "Kore"
}
}
}
}' | jq -r '.candidates[0].content.parts[0].inlineData.data' | \
base64 --decode > out.wav
Озвучивание текста несколькими голосами
Если в диалоге участвуют несколько человек, настройте двух говорящих в теге multiSpeakerVoiceConfig.speakerVoiceConfigs, используя теги prebuiltVoiceConfig, и передайте каждую реплику как отдельный тег part с тегом speech_metadata, в котором указаны теги speaker и необязательный тег style на уровне реплики:
Python
from google import genai
client = genai.Client()
response = client.models.generate_content(
model="gemini-3.8-flash-tts",
contents=[{
"role": "user",
"parts": [
{
"text": "How's it going today Jane?",
"speech_metadata": {
"speaker": "Joe",
"style": "cheerful and friendly",
},
},
{
"text": "Not too bad, how about you? Ready to test these new voices?",
"speech_metadata": {
"speaker": "Jane",
"style": "calm and relaxed",
},
},
],
}],
config={
"response_modalities": ["AUDIO"],
"speech_config": {
"multi_speaker_voice_config": {
"speaker_voice_configs": [
{
"speaker": "Joe",
"voice_config": {
"prebuilt_voice_config": {"voice_name": "Puck"}
},
},
{
"speaker": "Jane",
"voice_config": {
"prebuilt_voice_config": {"voice_name": "Kore"}
},
},
]
}
},
},
)
data = response.candidates[0].content.parts[0].inline_data.data
with open("out.wav", "wb") as f:
f.write(data)
JavaScript
import {GoogleGenAI} from '@google/genai';
import * as fs from 'node:fs';
async function main() {
const ai = new GoogleGenAI({});
const response = await ai.models.generateContent({
model: 'gemini-3.8-flash-tts',
contents: [{
role: 'user',
parts: [
{
text: "How's it going today Jane?",
speechMetadata: {
speaker: 'Joe',
style: 'cheerful and friendly',
},
},
{
text: 'Not too bad, how about you? Ready to test these new voices?',
speechMetadata: {
speaker: 'Jane',
style: 'calm and relaxed',
},
},
],
}],
config: {
responseModalities: ['AUDIO'],
speechConfig: {
multiSpeakerVoiceConfig: {
speakerVoiceConfigs: [
{
speaker: 'Joe',
voiceConfig: {
prebuiltVoiceConfig: { voiceName: 'Puck' },
},
},
{
speaker: 'Jane',
voiceConfig: {
prebuiltVoiceConfig: { voiceName: 'Kore' },
},
},
],
},
},
},
});
const data = response.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
const audioBuffer = Buffer.from(data, 'base64');
fs.writeFileSync('out.wav', audioBuffer);
}
await main();
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash-tts:generateContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-X POST \
-H "Content-Type: application/json" \
-d '{
"contents": [{
"role": "user",
"parts": [
{
"text": "How'\''s it going today Jane?",
"speech_metadata": {
"speaker": "Joe",
"style": "cheerful and friendly"
}
},
{
"text": "Not too bad, how about you? Ready to test these new voices?",
"speech_metadata": {
"speaker": "Jane",
"style": "calm and relaxed"
}
}
]
}],
"generationConfig": {
"responseModalities": ["AUDIO"],
"speechConfig": {
"multiSpeakerVoiceConfig": {
"speakerVoiceConfigs": [
{
"speaker": "Joe",
"voiceConfig": {
"prebuiltVoiceConfig": { "voiceName": "Puck" }
}
},
{
"speaker": "Jane",
"voiceConfig": {
"prebuiltVoiceConfig": { "voiceName": "Kore" }
}
}
]
}
}
}
}' | jq -r '.candidates[0].content.parts[0].inlineData.data' | \
base64 --decode > out.wav
Как управлять стилем речи с помощью метаданных и тегов
Gemini 3.8 TTS воспринимает поле text как дословную расшифровку. Чтобы управлять речью, не заставляя программу чтения с экрана зачитывать ремарки, разделите инструкции по области применения:
- Постоянная передача на уровне реплики (
speech_metadata.style). Укажите вspeech_metadata.style(например,"style": "whispered urgently","style": "out of breath"или"style": "warm and enthusiastic") эмоции, стиль речи, просодию, темп и громкость, которые применяются ко всей реплике. - Моментальные события (встроенные теги). Обозначайте кратковременные неречевые звуки или паузы непосредственно в расшифровке с помощью угловых скобок, например
"Wait... <short pause> did you hear that? <sigh>"или"Excuse me <cough> as I was saying...".
Подробные рекомендации вы найдете в руководстве по составлению запросов.
Параметры голосового ввода
Gemini 3.8 TTS поддерживает четыре способа выбора или создания голосов:
- Готовые студийные голоса. 30 голосов, перечисленных в таблице ниже.
- Расширенная библиотека голосов. Сотни дополнительных голосов на разных языках, с разными акцентами и архетипами персонажей, доступные через
client.voices.list()(GET /v1beta/voices). - Создание голоса. Сгенерируйте уникальный голос на основе описания на естественном языке в Google AI Studio или с помощью функции
POST /v1beta/voices(type="prompted", которая возвращает постоянный идентификаторvoice_...и предварительную версию WAV-файлаsample_audioвCreateVoiceиGetVoice). - Воспроизведение голоса.
Воспроизведите голос говорящего на основе аудиозаписи с его голосом и согласия в Google AI Studio или с помощью
POST /v1beta/voices(type="replicated", постоянныйstore=Trueпо умолчанию или необязательныйstore=Falseбез сохранения состояния).
Ограничения и TTL для собственного голоса
| Голосовой ввод | Режим хранения | Квота / лимит | Срок хранения (TTL) |
|---|---|---|---|
Голоса с сохранением состояния (voice_..., созданные по подсказке или реплицированные) |
store=True |
200 голосов на проект (включая голоса, созданные по запросу и реплицированные). | 1 год с момента последнего использования* |
Ключи голосового управления без сохранения состояния (voicekey_..., реплицировано) |
store=False |
Управляется клиентом | 7 дней |
* Продление срока хранения TTL. Годичный срок хранения сбрасывается каждый раз, когда голос активно используется (для синтеза речи или в качестве базового голоса для создания ремикса). Голоса, которые не использовались в течение года, удаляются автоматически.
Готовые голоса
| Zephyr – Bright | Puck – Upbeat | Харон – информативный. |
| Kore – Firm | Fenrir – возбудимый. | Leda – молодой голос |
| Orus – компания | Aoede – Breezy | Callirrhoe – расслабленный. |
| Автоноя – яркий | Enceladus – с придыханием | Iapetus – Clear |
| Umbriel – легкий на подъем | Альгиеба – плавный | Despina – Smooth |
| Erinome – Clear | Algenib – Gravelly | Rasalgethi – информативный |
| Лаомедея – энергичный | Achernar – Soft | Alnilam – Firm |
| Schedar – Even | Gacrux – зрелая | Pulcherrima – вперед |
| Ахирд – дружелюбный | Zubenelgenubi – Casual | Vindemiatrix – ласковый. |
| Sadachbia – Lively | Sadaltager – Знающий | Sulafat – Повышенная температура |
Расширенная библиотека голосов и фильтрация
Помимо 30 студийных голосов, представленных в таблице выше, в расширенной библиотеке голосов есть сотни дополнительных голосов на разных языках, с разными региональными акцентами, характерами и областями применения. Вы можете просматривать, фильтровать и прослушивать всю библиотеку голосов в интерактивном режиме в Google AI Studio или запрашивать ее программно с помощью client.voices.list() (GET /v1beta/voices, используя google-genai 2.25.0+ / @google/genai 2.24.0+).
ListVoices возвращает сохраненные вами голоса (в порядке добавления, начиная с последнего), а затем встроенные голоса из каталога, соответствующие критериям фильтра. Если для фильтра списка передано несколько значений, возвращаются голоса, соответствующие любому из этих значений (OR). Разные параметры фильтра объединяются с помощью оператора AND:
| Параметр | Тип | Описание |
|---|---|---|
language_code |
list[str] |
Теги языка BCP-47 (например, ["en-US", "en-GB"]). Точное соответствие без учета регистра. |
region_code |
list[str] |
Коды регионов по стандарту ISO 3166-1 alpha-2 или UN M.49 (например, ["US", "GB"]). |
accent |
list[str] |
Региональный акцент (например, ["American", "British"]). |
gender |
list[str] |
Гендерная презентация ("female", "male" или "neutral"). |
pitch |
list[str] |
Классификация высоты голоса ("low", "medium" или "high"). |
persona |
list[str] |
Архетип персонажа или голоса (например, ["Warm, Friendly"], ["Narrator"]). |
contexts (context в REST) |
list[str] |
Домен оптимального использования (например, ["Audiobook", "Conversational", "News"]). |
type (type_ в Python) |
list[str] |
Фильтр по источнику голоса: "prebuilt", "prompted" (дизайн голоса) или "replicated" (воспроизведение голоса). |
search |
str |
Поиск подстроки в свободном тексте без учета регистра по полям display_name и description. |
page_size |
int |
Максимальное количество голосов, возвращаемых на страницу (по умолчанию 50, максимум 1000). |
page_token |
str |
Токен из response.next_page_token для получения следующей страницы результатов. |
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"
Поддерживаемые языки
Модели TTS автоматически определяют язык ввода.
Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) поддерживает более 130 языков, а Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) – более 100 языков:
| Язык | Gemini 3.8 Flash TTS | Gemini 3.8 Flash-Lite TTS |
|---|---|---|
| Ачехский (арабская письменность) | ✔️ | ✔️ |
| Африкаанс | ✔️ | ✔️ |
| Акан | ✔️ | ✔️ |
| Амхарский | ✔️ | ✔️ |
| Армянский | ✔️ | ✔️ |
| Ассамский | ✔️ | ✔️ |
| Авадхи | ✔️ | ✔️ |
| Балийский | ✔️ | ✔️ |
| Бенгальский | ✔️ | ✔️ |
| Банджарский (арабское письмо) | ✔️ | — |
| Банджарский (латиница) | ✔️ | ✔️ |
| Башкирский | ✔️ | — |
| Баскский | ✔️ | ✔️ |
| Belarusian | ✔️ | ✔️ |
| бемба | ✔️ | — |
| Бходжпури | ✔️ | ✔️ |
| Боснийский | ✔️ | ✔️ |
| Бугийский | ✔️ | ✔️ |
| Болгарский | ✔️ | ✔️ |
| Бирманский | ✔️ | — |
| Кантонский | ✔️ | ✔️ |
| Каталанский | ✔️ | ✔️ |
| Себуанский | ✔️ | ✔️ |
| Центральнокурдский | ✔️ | ✔️ |
| Чхаттисгархи | ✔️ | ✔️ |
| Китайский (упрощенный) | ✔️ | ✔️ |
| Китайский (традиционное письмо) | ✔️ | ✔️ |
| Крымско-татарский | ✔️ | — |
| Хорватский | ✔️ | ✔️ |
| Чешский | ✔️ | ✔️ |
| Датский | ✔️ | ✔️ |
| Нидерландский | ✔️ | ✔️ |
| Дьюла | ✔️ | — |
| Дзонг-кэ | ✔️ | — |
| арабский (Египет) | ✔️ | ✔️ |
| Английский | ✔️ | ✔️ |
| Эстонский | ✔️ | ✔️ |
| Филиппинский | ✔️ | ✔️ |
| Финский | ✔️ | — |
| Французский | ✔️ | ✔️ |
| Галисийский | ✔️ | ✔️ |
| Ganda | ✔️ | ✔️ |
| Грузинский | ✔️ | ✔️ |
| Немецкий | ✔️ | ✔️ |
| Греческий | ✔️ | ✔️ |
| Гуарани | ✔️ | — |
| Гуджарати | ✔️ | ✔️ |
| Гаитянский креольский | ✔️ | ✔️ |
| Халха-монгольский | ✔️ | ✔️ |
| Хауса | ✔️ | ✔️ |
| Иврит | ✔️ | ✔️ |
| хинди | ✔️ | ✔️ |
| Венгерский | ✔️ | ✔️ |
| Исландский | ✔️ | ✔️ |
| Игбо | ✔️ | — |
| илоканский | ✔️ | ✔️ |
| Индонезийский | ✔️ | ✔️ |
| персидский (Иран) | ✔️ | ✔️ |
| Итальянский | ✔️ | ✔️ |
| Японский | ✔️ | ✔️ |
| Яванский | ✔️ | ✔️ |
| кабильский | ✔️ | — |
| Камба | ✔️ | ✔️ |
| Каннада | ✔️ | ✔️ |
| кашмири (арабское письмо) | ✔️ | ✔️ |
| кашмири (деванагари) | ✔️ | ✔️ |
| Казахский | ✔️ | ✔️ |
| Кхмерский | ✔️ | ✔️ |
| Кикуйю | ✔️ | ✔️ |
| Киньяруанда | ✔️ | ✔️ |
| Конго | ✔️ | ✔️ |
| Корейский | ✔️ | ✔️ |
| Киргизский | ✔️ | ✔️ |
| Лаосский | ✔️ | ✔️ |
| Латгальский | ✔️ | — |
| Лингала | ✔️ | ✔️ |
| Литовский | ✔️ | — |
| Люксембургский | ✔️ | — |
| Македонский | ✔️ | ✔️ |
| Магахи | ✔️ | ✔️ |
| Майтхили | ✔️ | ✔️ |
| Малаялам | ✔️ | ✔️ |
| Мальтийский | ✔️ | ✔️ |
| Манипури | ✔️ | ✔️ |
| Маратхи | ✔️ | ✔️ |
| Минангкабау (арабское письмо) | ✔️ | ✔️ |
| Минангкабау (латиница) | ✔️ | — |
| Мизо | ✔️ | ✔️ |
| Непальский (отдельный язык) | ✔️ | ✔️ |
| Фула (Нигерия) | ✔️ | ✔️ |
| Североазербайджанский | ✔️ | ✔️ |
| Сото северный | ✔️ | ✔️ |
| Северный узбекский | ✔️ | ✔️ |
| Норвежский букмол | ✔️ | ✔️ |
| Норвежский (новонорвежский) | ✔️ | ✔️ |
| Ньянджа | ✔️ | ✔️ |
| Окситанский | ✔️ | — |
| Одия (отдельный язык) | ✔️ | ✔️ |
| Пангасинанский | ✔️ | — |
| Персидский (Афганистан) | ✔️ | ✔️ |
| Польский | ✔️ | ✔️ |
| Португальский | ✔️ | ✔️ |
| Пенджабский | ✔️ | ✔️ |
| Румынский | ✔️ | ✔️ |
| Русский | ✔️ | ✔️ |
| Сантали | ✔️ | ✔️ |
| Сербский | ✔️ | ✔️ |
| Синдхи | ✔️ | — |
| Сингальский | ✔️ | ✔️ |
| Словацкий | ✔️ | ✔️ |
| Словенский | ✔️ | — |
| Сомали | ✔️ | — |
| Южноазербайджанский | ✔️ | ✔️ |
| Южный пушту | ✔️ | ✔️ |
| Южный сото | ✔️ | — |
| Испанский | ✔️ | ✔️ |
| Стандартный арабский (арабское письмо) | ✔️ | ✔️ |
| Стандартный арабский (латиница) | ✔️ | ✔️ |
| Стандартный латышский | ✔️ | ✔️ |
| Стандартный малайский | ✔️ | ✔️ |
| Суахили (отдельный язык) | ✔️ | — |
| Свати | ✔️ | — |
| Шведский | ✔️ | — |
| Таджикский | ✔️ | — |
| Тамильский | ✔️ | ✔️ |
| Телугу | ✔️ | ✔️ |
| Тайский | ✔️ | — |
| Тигринский | ✔️ | — |
| Тоскский (албанский) | ✔️ | — |
| Турецкий | ✔️ | ✔️ |
| Уйгурский | ✔️ | — |
| Вьетнамский | ✔️ | ✔️ |
Поддерживаемые модели
| Модель | Один говорящий | Несколько говорящих | Дизайн голоса | Репликация голоса |
|---|---|---|---|---|
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 | ✔️ | ✔️ | — | — |
| Gemini 2.5 Pro Preview TTS | ✔️ | ✔️ | — | — |
Когда использовать ту или иную модель
Обе модели Gemini 3.8 TTS используют одну и ту же схему API и формат запросов, поэтому вы можете переключаться между ними, изменяя всего один параметр:
- Используйте 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-preview. Она оптимизирована для массового производства, каскадов разговорных голосовых агентов, функций чтения вслух, надежной репликации голоса и повседневной речи одного говорящего на основных языках.
Руководство по переходу
При переходе с более ранних предварительных версий моделей (gemini-3.1-flash-tts-preview или gemini-2.5-pro-preview-tts) на Gemini 3.8 TTS (gemini-3.8-flash-tts или gemini-3.8-flash-lite-tts) обратите внимание на пять ключевых изменений:
- Отделяйте стиль от расшифровки. Переместите инструкции по актерской игре, тону, просодии и темпу (например,
"whispering","out of breath"или"speaking slowly") из обычного текста вspeech_metadata.style.textдолжен содержать только дословную расшифровку и встроенные теги вокализации. - Создавайте персонажей с помощью Voice Design. Замените длинные блоки
"Audio Profile"или"Director's Notes"голосом, созданным в Voice Design, а затем передавайте идентификаторvoice_...в запросах TTS с минимальными или пустыми строкамиstyle. - Используйте структурированные диалоги. В диалогах с несколькими говорящими передавайте по одному тегу
partна каждую реплику с помощью тегаspeech_metadata.speakerвместо того, чтобы встраивать префиксыSpeaker: ...в один текстовый блок. - Используйте угловые скобки для встроенных тегов вокализации. Угловые скобки (
<laugh>,<sigh>,<cough>,<breath>,<short pause>) используются для обозначения моментов, когда человек произносит что-либо или делает паузу. Не добавляйте теги для звуковых эффектов, не связанных с речью (например, аплодисментов или стука). - Учитывайте выходные данные WAV (
AUDIO_WAV) по умолчанию в унарных запросах. В отличие отgemini-3.1-flash-tts-preview(который по умолчанию возвращал необработанные данные PCM без заголовкаAUDIO_L16), модели Gemini 3.8 TTS возвращают полные аудиоданные WAV (AUDIO_WAV) с заголовком RIFF (24 кГц, моно, 16-битный PCM) в унарных запросах:- Если ваш код ранее упаковывал необработанные байты PCM в заголовок WAV (например, с помощью модуля
waveв Python или пакетаwavв Node), удалите заголовок и запишите декодированные байты аудио непосредственно в файл.wav. - Если в существующем конвейере требуется необработанный звук PCM без заголовка, mu-law или A-law, явно задайте для
generationConfig.responseFormat.audio.mimeTypeзначение"AUDIO_L16","AUDIO_MULAW"или"AUDIO_ALAW"с помощью REST API (например,{"responseFormat": {"audio": {"mimeType": "AUDIO_L16"}}}вgenerateContent; переопределение пользовательских настроекresponseFormatвgenerateContentподдерживается с помощью REST API, а поддержкаresponse_formatвGenerateContentConfigдля Python и JavaScript SDK пока не реализована; также можно использовать{"response_format": {"type": "audio", "mime_type": "audio/l16"}}в Interactions API). Подробнее о форматах аудиовыхода…
- Если ваш код ранее упаковывал необработанные байты PCM в заголовок WAV (например, с помощью модуля
Руководство по запросам
Модели Gemini 3.8 TTS воспринимают входной текст как дословную расшифровку.
В отличие от предыдущих моделей, в которых указания для сцены были встроены в обычный текст, Gemini 3.8 TTS разделяет указания для сцены (speech_metadata) и встроенные вокальные теги.
Поле стиля и встроенные теги
Разделите инструкции по производительности по области применения:
- Подача на уровне реплики (
speech_metadata.style). Добавьте атрибуты подачи, такие как эмоция, просодия, общий темп или стиль подачи (например,"whispering","out of breath","muttering"или"sarcastic"), в полеstyleобъектаspeech_metadata. Чтобы создать стабильного персонажа и обеспечить стабильность его поведения, заранее задайте его образ в разделе Дизайн голоса и используйтеstyleтолько для необязательных изменений на уровне хода. - События в определенный момент времени (встроенные теги). Помещайте мгновенные неречевые вокальные всплески, вдохи или паузы в расшифровку, используя угловые скобки (
<cough>,<breath>,<sigh>,<short pause>). Используйте угловые скобки (<...>) для наивысшего качества звука и придерживайтесь человеческой вокализации, а не невокальных звуковых эффектов.
| Область действия | Где разместить | Примеры |
|---|---|---|
| На уровне поворота (поддерживается на протяжении всего поворота) | speech_metadata.style |
"angry tone", "speaking rapidly", "out of breath", "whispers", "sarcastic" |
| Точечные (происходят на определенном слове). | Встроенный в text (<...>) |
"<cough> Thank you all for coming tonight! <throat-clearing> As I was saying..." |
Регулирование скорости и паузы
Вы можете управлять ритмом и паузами на трех уровнях детализации:
- Знаки препинания и многоточия. Используйте запятые, тире (
--) и многоточия (...), чтобы имитировать естественные паузы в речи. - Встроенные теги паузы. Вставьте
<short pause>или<long pause>в те места скрипта, где говорящий должен сделать паузу:text Hold on, let me think... <short pause> Alright, I've got it. - Скорость речи на уровне реплики. Чтобы задать скорость речи для всей реплики, используйте теги
"style": "speaking rapidly"или"style": "speaking slowly"вspeech_metadata.
Просодия и высота тона
Используйте speech_metadata.style, чтобы управлять просодией, высотой тона и интонацией в реплике (например, "style": "high pitch, cheerful and excited inflection" или "style": "monotone and flat"). Если эмоция или просодия меняется в середине диалога, разделите скрипт на отдельные реплики с разными значениями style для каждой.
Выделение
Чтобы сделать акцент на ключевых словах, пишите их с заглавной буквы, используйте знаки препинания и теги:
This is a VERY important point!
It was a VERY long day <sigh> ... nobody listens anymore.
Вокальные вставки и звуки, не относящиеся к речи
Указывайте неречевые звуки, издаваемые человеком, в угловых скобках (<...>) в том месте, где они звучат. Рекомендуемые теги для вокала:
<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> |
Реакции слушателя и наложение речи
В диалогах с несколькими говорящими реакции слушателей заключаются в вертикальные черты (|reaction|) внутри реплики говорящего, чтобы создать естественные дополнительные каналы или перекрывающуюся речь без разбивки на отдельные реплики для каждой реакции.
- Короткие фоновые реплики. Добавляйте короткие реакции слушателя (
|oh hmm|,|oh really?|,|absolutely|) в реплику выступающего участника:- Реплика 1 (собеседник А):
"So the launch is Thursday |oh hmm| Are we actually ready?" - Реплика 2 (собеседник Б):
"Ready enough |oh really?| The last blocker cleared this morning." - Реплика 3 (собеседник А):
"Then let's ship it |absolutely| and watch the dashboards."
- Реплика 1 (собеседник А):
- Перекрывающаяся и чередующаяся речь. Используйте несколько сегментов, разделенных вертикальной чертой, чтобы имитировать одновременную или чередующуюся речь двух говорящих (лучше всего работает с
gemini-3.8-flash-tts):- Одновременный обратный отсчет/припев:
"Let's surprise him on three |ok| ready?", а затем"one. two. three. |happy| happy |birthday| birthday!". - Полное перекрытие речи:
"Hello |oh| there |my| it |goodness| must |gracious| be |would| almost |you| time |look| for |at that| dinner"
- Одновременный обратный отсчет/припев:
Как обеспечить единообразие сгенерированных изображений и чего следует избегать
Чтобы сохранить стабильность голосовой идентичности при смене говорящего, следуйте приведенным ниже рекомендациям.
- Задавайте персонажей в начале инструкций по стилю, а не в длинных блоках.
Длинные абзацы
"Audio Profile"и списки"Director's Notes", перенесенные из более ранних моделей, – самая распространенная причина отклонения от заданного стиля. Используйте эту же интуицию на этапе проектирования голоса, чтобы создать постоянный персонализированный голосvoice_..., а затем используйте этот идентификатор голоса в вызовах TTS. - Используйте голосовой референс для стабильности (не добавляйте метаинструкции).
Модели Gemini 3.8 TTS обучены в первую очередь опираться на аудиореференс.
Не добавляйте инструкции, которые предписывают модели сохранять голос стабильным (например,
"do not switch speaker identity"или"maintain identical timbre"). Дополнительный текст в запросе увеличивает дрейф. Удалите ненужные инструкции по стилю и позвольте модели естественно варьировать голос вокруг стабильной точки, заданной референсным голосом. - Не пытайтесь изменить неизменяемые характеристики говорящего в
style. Не указывайте вspeech_metadata.styleвозраст, пол, имена или постоянные изменения акцента. Вместо этого выберите региональный голос из расширенной библиотеки голосов или создайте его с помощью Voice Design.
Рекомендуемый рабочий процесс
- Создайте персонажа один раз. Сделайте это в разделе Дизайн голоса или выберите региональный голос из расширенной библиотеки голосов, который соответствует целевому языку и характеру персонажа.
- Пишите естественные расшифровки устной речи с речевыми ошибками. Чтобы текст звучал максимально естественно, пишите
textкак расшифровку реальной устной речи, включая естественные речевые ошибки и заминки (например,"Oh uh yeah I think... hm, so that's interesting"). - Сначала попробуйте обычное преобразование текста в речь. Синтезируйте речь из расшифровки с пустым полем
style. В большинстве случаев инструкцииstyleне нужны. - Добавляйте короткие запросы
styleтолько для корректировок. Добавляйте краткую строкуstyle(например,"casual, friendly"или"muttering, then reassuring") только для тех ходов, которые требуют определенной корректировки, и используйте эту строку для всех ходов, если хотите сохранить базовый стиль.
Многоэтапные диалоги и голосовые агенты
При создании голосовых агентов для общения в реальном времени или приложений с несколькими этапами:
- Выполняйте один вызов TTS за ход по мере поступления текстовых фрагментов от LLM.
- Пусть настроенный
voice(встроенный, разработанныйvoice_...или реплицированныйvoice_.../voicekey_...) передает личность говорящего между ходами. Не отправляйте длинное описание персонажа на каждом ходу. - Оставьте поле
styleпустым или отправьте одну короткую строку (например,"casual, friendly") для всего разговора. - Разбивайте длинные ответы агента на более короткие, а не используйте более сильные запросы к стилю.
Потоковая генерация речи
Вы можете транслировать сгенерированное аудио по мере его синтеза моделью. В отличие от унарных запросов, которые возвращают полный WAV-файл с заголовком RIFF, потоковые запросы по умолчанию возвращают необработанные 16-битные фрагменты линейной импульсно-кодовой модуляции со знаком и прямым порядком байтов без заголовков (AUDIO_L16 / audio/L16;codec=pcm;rate=24000, 24 кГц, моно). Это позволяет непрерывно воспроизводить или объединять аудиофрагменты без заголовков контейнеров.
Python
from google import genai
client = genai.Client()
response_stream = client.models.generate_content_stream(
model="gemini-3.8-flash-tts",
contents=[{
"role": "user",
"parts": [{
"text": "Have a wonderful day!",
"speech_metadata": {"style": "cheerful and friendly"},
}],
}],
config={
"response_modalities": ["AUDIO"],
"speech_config": {
"voice_config": {"voice": "Kore"}
},
},
)
for chunk in response_stream:
try:
data = chunk.candidates[0].content.parts[0].inline_data.data
# data contains raw PCM bytes (24kHz, 1-channel, 16-bit)
except (IndexError, AttributeError):
pass
JavaScript
import {GoogleGenAI} from '@google/genai';
async function main() {
const ai = new GoogleGenAI({});
const responseStream = await ai.models.generateContentStream({
model: 'gemini-3.8-flash-tts',
contents: [{
role: 'user',
parts: [{
text: 'Have a wonderful day!',
speechMetadata: { style: 'cheerful and friendly' },
}],
}],
config: {
responseModalities: ['AUDIO'],
speechConfig: {
voiceConfig: { voice: 'Kore' },
},
},
});
for await (const chunk of responseStream) {
const data = chunk.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
if (data) {
const audioBuffer = Buffer.from(data, 'base64');
// Process the audio buffer
}
}
}
await main();
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash-tts:streamGenerateContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-X POST \
-H "Content-Type: application/json" \
-d '{
"contents": [{
"role": "user",
"parts": [{
"text": "Have a wonderful day!",
"speech_metadata": {
"style": "cheerful and friendly"
}
}]
}],
"generationConfig": {
"responseModalities": ["AUDIO"],
"speechConfig": {
"voiceConfig": {
"voice": "Kore"
}
}
}
}'
Форматы аудиовыхода
Модели Gemini 3.8 TTS используют разные форматы аудио по умолчанию в зависимости от того, является ли запрос унарным или потоковым:
- Унарные запросы (
models.generate_content). Возвращает полный аудиофайл WAV�AUDIO_WAVВы можете записать декодированные аудиобайты непосредственно в файл.wav, не добавляя контейнер WAV вручную. - Запросы на потоковую передачу (
models.generate_content_stream/streamGenerateContent). По умолчанию возвращаются фрагменты необработанного линейного PCM без заголовка (AUDIO_L16) (24 кГц, моно, 16-битный PCM с прямым порядком байтов), чтобы фрагменты можно было передавать в потоковом режиме или непрерывно объединять без заголовков контейнеров в каждом фрагменте.
Вы можете переопределить кодировку и частоту дискретизации выходного аудио с помощью generationConfig.responseFormat.audio:
На сумму mimeType |
Формат | Описание |
|---|---|---|
"AUDIO_WAV" (унарный по умолчанию) |
WAV (audio/wav) |
Полный WAV-файл с заголовком RIFF (24 кГц, моно, 16-битный PCM). |
"AUDIO_L16" (по умолчанию для потоковой передачи) |
Линейный PCM (audio/l16) |
Необработанный 16-битный линейный PCM без заголовка с прямым порядком байтов. Лучше всего подходит для потоковой передачи, пользовательских аудиоконвейеров или объединения пошаговых клипов. |
"AUDIO_MULAW" |
μ-law (audio/basic / audio/mulaw) |
Аудио, сжатое по закону мю (G.711). Обычно используется в телефонии в Северной Америке и Японии (8 кГц). |
"AUDIO_ALAW" |
A-law (audio/alaw) |
Аудио, сжатое по алгоритму G.711 A-law. Обычно используется в европейской и международной телефонии (8 кГц). |
Вы также можете указать частоту sampleRate (например, 24000, 16000 или 8000 Гц; по умолчанию используется 24000 Гц).
В следующем примере запроса REST запрашивается необработанный 16-битный PCM-поток (AUDIO_L16) без заголовка с частотой 24 кГц:
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash-tts:generateContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-X POST \
-H "Content-Type: application/json" \
-d '{
"contents": [{
"role": "user",
"parts": [{
"text": "Have a wonderful day!",
"speech_metadata": {
"style": "cheerful and friendly"
}
}]
}],
"generationConfig": {
"responseModalities": ["AUDIO"],
"responseFormat": {
"audio": {
"mimeType": "AUDIO_L16",
"sampleRate": 24000
}
},
"speechConfig": {
"voiceConfig": {
"voice": "Kore"
}
}
}
}' | jq -r '.candidates[0].content.parts[0].inlineData.data' | \
base64 --decode > out.pcm
Ограничения
- Модели TTS принимают только текстовые входные данные и генерируют только аудиовыходные данные.
- Генерация речи нескольких говорящих по одному запросу (
multiSpeakerVoiceConfig) поддерживает до двух говорящих с использованием встроенных голосов. Чтобы объединить созданные (voice_...) или скопированные (voice_.../voicekey_...) голоса в диалоге с несколькими персонажами, синтезируйте реплики каждого говорящего по отдельности. Поскольку унарные запросы по умолчанию возвращаютaudio/wavс 44-байтовым заголовком RIFF, запросите необработанный PCM (AUDIO_L16) или удалите заголовок WAV из каждого фрагмента перед объединением аудиокадров PCM с частотой 24 кГц. - Ограничения на хранение и TTL собственных голосов:
- Голоса с отслеживанием состояния (
store=True, созданные по запросу или реплицированные): максимум 200 голосов на проект с временем жизни 1 год (TTL). - Ключи без сохранения состояния (
store=False,voicekey_...): 7 дней TTL (время жизни).
- Голоса с отслеживанием состояния (
- Ознакомьтесь с разделом Поддерживаемые языки.
Дальнейшие действия
- Создавайте собственные голосовые образы на естественном языке с помощью дизайна голоса.
- Воссоздать голос существующего докладчика с помощью репликации голоса.
- Сравните характеристики моделей на страницах Gemini 3.8 Flash TTS и Gemini 3.8 Flash-Lite TTS.
- Попробуйте интерактивное двустороннее аудио с Live API.