API Gemini позволяет преобразовывать текстовый ввод в аудиозапись с одним или несколькими говорящими, используя возможности генерации речи (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 TTS передайте дословную расшифровку в parts[].text , добавьте стилизацию уровня реплики в parts[].speech_metadata и настройте свой голос в speechConfig.voiceConfig . Вы можете передать предварительно созданное имя голоса, идентификатор расширенной библиотеки голосов, пользовательский идентификатор дизайна голоса ( voice_... ) или идентификатор репликации голоса ( voice_... , или необязательный stateless 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();
ОТДЫХ
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();
ОТДЫХ
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
Управляйте стилем речи с помощью метаданных и тегов.
Система преобразования 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", persistentstore=Trueпо умолчанию или необязательно statelessstore=False).
Настраиваемые ограничения на количество голосовых вызовов и TTL.
| Тип голоса | Режим хранения | Квота / лимит | Время хранения (TTL) |
|---|---|---|---|
Голоса, выражающие состояние ( voice_... , подсказанные или воспроизведенные) | store=True | 200 голосов на проект (обмениваются между предложенными и повторяющимися голосами). | 1 год с момента последнего использования* |
Бессостоятельные голосовые клавиши ( voicekey_... , реплицированные) | store=False | Управление осуществляется клиентом | 7 дней |
* Расширение TTL: Годовой период хранения сбрасывается каждый раз, когда голос активно используется (либо путем синтеза речи с этим голосом, либо путем использования его в качестве базового голоса для ремикширования). Голоса, не использовавшиеся в течение 1 года, автоматически удаляются.
Предварительно настроенные голоса
| Зефир -- Яркий | Пак — оптимистичный | Харон — информативный |
| Коре -- Фирма | Фенрир — Возбудимый | Леда — Юная |
| Орус — Фирма | Аоэде -- Бризи | Каллирро — добродушный |
| Автоное — Яркое | Энцелад — Хрипловатый | Япет — Ясный |
| Умбриэль — добродушный | Алгиеба -- Гладкая | Деспина -- Гладкая |
| Эрином -- Чистый | Алгениб -- Грейвли | Расалгети — информативный |
| Лаомедея — оптимистичная | Ахернар — Мягкий | Альнилам -- Фирма |
| Шедар — даже | Гакрукс — зрелый | Пульчеррима -- Нападающий |
| Ахирд — Дружелюбный | Зубенельгенуби -- Повседневный | Виндемиатрикс -- Нежная |
| Садахбия -- Оживлённый | Садалтагер — знающий специалист | Сулафат -- Теплый |
Расширенная голосовая библиотека и фильтрация
Помимо 30 представленных в предыдущей таблице студийных голосов, расширенная библиотека голосов содержит сотни дополнительных голосов на разных языках, с различными региональными акцентами, для разных персонажей и в разных областях. Вы можете просматривать, фильтровать и прослушивать всю библиотеку голосов в интерактивном режиме в Google AI Studio или запрашивать ее программно с помощью client.voices.list() ( GET /v1beta/voices , using 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}`
);
}
ОТДЫХ
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"
Поддерживаемые языки
Модели синтеза речи автоматически определяют язык ввода. 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 |
|---|---|---|
| Ачехский (арабский алфавит) | ✔️ | ✔️ |
| африкаанс | ✔️ | ✔️ |
| Акан | ✔️ | ✔️ |
| амхарский | ✔️ | ✔️ |
| армянский | ✔️ | ✔️ |
| ассамский | ✔️ | ✔️ |
| Авадхи | ✔️ | ✔️ |
| балийский | ✔️ | ✔️ |
| Бенгальский | ✔️ | ✔️ |
| Банджар (арабская письменность) | ✔️ | — |
| Банджар (лат.) | ✔️ | ✔️ |
| Башкир | ✔️ | — |
| Баскский | ✔️ | ✔️ |
| белорусский | ✔️ | ✔️ |
| Бемба | ✔️ | — |
| Бходжпури | ✔️ | ✔️ |
| боснийский | ✔️ | ✔️ |
| Бугинский | ✔️ | ✔️ |
| болгарский | ✔️ | ✔️ |
| бирманский | ✔️ | — |
| кантонский | ✔️ | ✔️ |
| каталанский | ✔️ | ✔️ |
| Себуано | ✔️ | ✔️ |
| Центральный Курдский | ✔️ | ✔️ |
| Чхаттисгархи | ✔️ | ✔️ |
| Китайский (Гансовский алфавит) | ✔️ | ✔️ |
| Китайский (хантийский алфавит) | ✔️ | ✔️ |
| Крымский татарин | ✔️ | — |
| хорватский | ✔️ | ✔️ |
| чешский | ✔️ | ✔️ |
| датский | ✔️ | ✔️ |
| Голландский | ✔️ | ✔️ |
| Дьюла | ✔️ | — |
| Дзонгкха | ✔️ | — |
| египетский арабский | ✔️ | ✔️ |
| Английский | ✔️ | ✔️ |
| эстонский | ✔️ | ✔️ |
| филиппинский | ✔️ | ✔️ |
| финский | ✔️ | — |
| Французский | ✔️ | ✔️ |
| галисийский | ✔️ | ✔️ |
| Ганда | ✔️ | ✔️ |
| грузинский | ✔️ | ✔️ |
| немецкий | ✔️ | ✔️ |
| греческий | ✔️ | ✔️ |
| Гуарани | ✔️ | — |
| гуджарати | ✔️ | ✔️ |
| гаитянский креольский | ✔️ | ✔️ |
| Халх Монгольский | ✔️ | ✔️ |
| Хауса | ✔️ | ✔️ |
| иврит | ✔️ | ✔️ |
| хинди | ✔️ | ✔️ |
| венгерский | ✔️ | ✔️ |
| исландский | ✔️ | ✔️ |
| Игбо | ✔️ | — |
| Илоко | ✔️ | ✔️ |
| индонезийский | ✔️ | ✔️ |
| иранский персидский | ✔️ | ✔️ |
| итальянский | ✔️ | ✔️ |
| японский | ✔️ | ✔️ |
| яванский | ✔️ | ✔️ |
| Кабиль | ✔️ | — |
| Камба | ✔️ | ✔️ |
| Каннада | ✔️ | ✔️ |
| Кашмирский (арабский алфавит) | ✔️ | ✔️ |
| Кашмирский (письмо Дева) | ✔️ | ✔️ |
| казахский | ✔️ | ✔️ |
| кхмерский | ✔️ | ✔️ |
| Кикую | ✔️ | ✔️ |
| Киньяруанда | ✔️ | ✔️ |
| Конго | ✔️ | ✔️ |
| корейский | ✔️ | ✔️ |
| кыргызы | ✔️ | ✔️ |
| Лао | ✔️ | ✔️ |
| Латгальский | ✔️ | — |
| Лингала | ✔️ | ✔️ |
| литовский | ✔️ | — |
| люксембургский | ✔️ | — |
| македонский | ✔️ | ✔️ |
| Магахи | ✔️ | ✔️ |
| Майтхили | ✔️ | ✔️ |
| Малаялам | ✔️ | ✔️ |
| мальтийский | ✔️ | ✔️ |
| Манипури | ✔️ | ✔️ |
| маратхи | ✔️ | ✔️ |
| Минангкабау (арабская письменность) | ✔️ | ✔️ |
| Минангкабау (лат.) | ✔️ | — |
| Мизо | ✔️ | ✔️ |
| Непальский (отдельный язык) | ✔️ | ✔️ |
| Нигерийский Фульфульде | ✔️ | ✔️ |
| Северный Азербайджан | ✔️ | ✔️ |
| Северный Сото | ✔️ | ✔️ |
| Северный узбек | ✔️ | ✔️ |
| норвежский букмол | ✔️ | ✔️ |
| Норвежский Нюнорск | ✔️ | ✔️ |
| Ньянджа | ✔️ | ✔️ |
| окситанский | ✔️ | — |
| Одиа (отдельный язык) | ✔️ | ✔️ |
| Пангасинан | ✔️ | — |
| Персидский (Афганистан) | ✔️ | ✔️ |
| польский | ✔️ | ✔️ |
| португальский | ✔️ | ✔️ |
| Пенджаби | ✔️ | ✔️ |
| румынский | ✔️ | ✔️ |
| Русский | ✔️ | ✔️ |
| Сантали | ✔️ | ✔️ |
| сербский | ✔️ | ✔️ |
| Синдхи | ✔️ | — |
| сингальский | ✔️ | ✔️ |
| словацкий | ✔️ | ✔️ |
| словенский | ✔️ | — |
| сомалийский | ✔️ | — |
| Южный Азербайджан | ✔️ | ✔️ |
| Южный пушту | ✔️ | ✔️ |
| Южный Сото | ✔️ | — |
| испанский | ✔️ | ✔️ |
| Стандартный арабский язык (арабская письменность) | ✔️ | ✔️ |
| Стандартный арабский язык (лат. алфавит) | ✔️ | ✔️ |
| Стандартный латышский | ✔️ | ✔️ |
| Стандартный малайский | ✔️ | ✔️ |
| Суахили (отдельный язык) | ✔️ | — |
| Свати | ✔️ | — |
| шведский | ✔️ | — |
| Таджик | ✔️ | — |
| тамильский | ✔️ | ✔️ |
| телугу | ✔️ | ✔️ |
| Тайский | ✔️ | — |
| тигринья | ✔️ | — |
| Тоск Албанский | ✔️ | — |
| турецкий | ✔️ | ✔️ |
| уйгурский | ✔️ | — |
| вьетнамский | ✔️ | ✔️ |
Поддерживаемые модели
| Модель | Один динамик | Многоканальный | Дизайн голоса | репликация голоса |
|---|---|---|---|---|
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 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(который по умолчанию возвращал необработанный PCMAUDIO_L16без заголовка), модели Gemini 3.8 TTS возвращают полный аудиофайл WAV (AUDIO_WAV) с заголовком RIFF (24 кГц, моно, 16-битный PCM) при унарных запросах:- Если в вашем коде ранее необработанные PCM-байты были упакованы в заголовок WAV (например, с помощью модуля
waveв Python или пакетаwavв Node), удалите эту ручную упаковку заголовка и записывайте декодированные аудиобайты непосредственно в файл.wav. - Если ваш существующий конвейер обработки данных требует необработанного аудиоформата PCM, mu-law или A-law без заголовка, явно установите
response_format.audio.mime_typeв"AUDIO_L16","AUDIO_MULAW"или"AUDIO_ALAW"(например,{"response_format": {"audio": {"mime_type": "AUDIO_L16"}}}вgenerateContentили{"response_format": {"type": "audio", "mime_type": "audio/l16"}}в API Interactions). См. раздел «Форматы аудиовыхода» .
- Если в вашем коде ранее необработанные 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|) в реплику активного говорящего:- Первый ход (говорящий А):
"So the launch is Thursday |oh hmm| Are we actually ready?" - Поворот 2 (говорящий B):
"Ready enough |oh really?| The last blocker cleared this morning." - Третий ход (говорящий А):
"Then let's ship it |absolutely| and watch the dashboards."
- Первый ход (говорящий А):
- Перекрывающаяся и чередующаяся речь: Используйте несколько сегментов конвейера для имитации одновременной или чередующейся речи двух говорящих (лучше всего работает с
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 обучены сначала ориентироваться на аудиоэталонный сигнал. Не включайте инструкции, указывающие модели на необходимость поддерживать стабильный голос (например
"do not switch speaker identity"или"maintain identical timbre") — лишний текст подсказок увеличивает дрейф. Удалите ненужные указания на стиль и позвольте модели естественным образом изменять свой голос вокруг стабильной точки, обеспечиваемой эталонным голосом. - Не пытайтесь изменять неизменяемые характеристики говорящего в
style: избегайте указания возраста, пола, имен или постоянных изменений акцента вspeech_metadata.style. Вместо этого выберите региональный голос из расширенной библиотеки голосов или создайте его с помощью инструмента проектирования голоса .
Рекомендуемый рабочий процесс
- Создайте персонажа один раз: настройте голос персонажа в разделе «Озвучивание» или выберите региональный голос из расширенной библиотеки голосов, соответствующий вашему целевому языку и образу.
- Пишите естественные устные транскрипции с учетом неплавности речи: для максимальной естественности записывайте
textкак реальную устную транскрипцию, включая естественные разговорные неплавности и паузы (например,"Oh uh yeah I think... hm, so that's interesting"). - Сначала протестируйте обычный TTS: сначала синтезируйте свою расшифровку с пустым полем
style— большинству запросов вообще не нужны указанияstyle. - Добавляйте короткие
styleподсказки только для внесения изменений: используйте лаконичнуюstyleстроку (например,"casual, friendly"или"muttering, then reassuring") только для реплик, требующих конкретной корректировки подачи, и используйте эту же короткую строку для разных реплик, если вам нужен единый базовый уровень.
Многоходовые диалоги и голосовые агенты
При создании голосовых агентов для диалогового взаимодействия в реальном времени или многошаговых приложений:
- Совершайте один вызов TTS за ход по мере поступления текстовых фрагментов LLM.
- Пусть настроенный
voice(предварительно созданный, разработанныйvoice_...или реплицированныйvoice_.../voicekey_...) передает личность говорящего между ходами — никогда не отправляйте длинный текст с именем персонажа каждый ход. - Оставьте поле
styleдля каждого хода пустым или отправьте одну короткую постоянную строку (например,"casual, friendly") для всего разговора. - Разделите длинные ответы агентов на более короткие реплики, вместо того чтобы использовать более сложные стилистические приемы.
Генерация потокового речи
Вы можете передавать сгенерированный звук в режиме реального времени по мере его синтеза моделью. В отличие от унарных запросов (которые возвращают полный WAV-файл с заголовком RIFF), потоковые запросы по умолчанию возвращают необработанные 16-битные знаковые линейные PCM-фрагменты в формате little-endian ( 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();
ОТДЫХ
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) с заголовком RIFF (24 кГц, моно, 16-битный знаковый PCM в формате little-endian). Вы можете записывать декодированные аудиобайты непосредственно в файл.wavбез ручного добавления контейнера WAV. - Запросы потоковой передачи (
models.generate_content_stream/streamGenerateContent): По умолчанию возвращают необработанные фрагменты линейного PCM (AUDIO_L16) без заголовков (24 кГц, моно, 16-битный знаковый PCM в формате little-endian), чтобы фрагменты можно было передавать или объединять непрерывно без заголовков контейнера для каждого фрагмента.
Вы можете переопределить кодировку и частоту дискретизации выходного аудиосигнала с помощью generationConfig.responseFormat.audio :
значение mimeType | Формат | Описание |
|---|---|---|
"AUDIO_WAV" (унарный параметр по умолчанию) | WAV ( audio/wav ) | Полный WAV-файл с заголовком RIFF (24 кГц, моно, 16-битный PCM). |
"AUDIO_L16" (потоковое воспроизведение по умолчанию) | Линейный PCM ( audio/l16 ) | Необработанный 16-битный линейный PCM-файл без заголовка, с маленькой очередностью байтов. Идеально подходит для потоковой передачи, создания пользовательских аудиоконвейеров или объединения многооборотных клипов. |
"AUDIO_MULAW" | μ-закон ( audio/basic / audio/mulaw ) | Компандированный аудиосигнал G.711 μ-law. Широко используется в североамериканской и японской телефонии (8 кГц). |
"AUDIO_ALAW" | A-law ( audio/alaw ) | Компандированный аудиосигнал G.711 A-law. Широко используется в европейской и международной телефонии (8 кГц). |
Также можно дополнительно указать sampleRate (например, 24000 , 16000 или 8000 Гц; по умолчанию — 24000 Гц).
В следующем примере запрашивается необработанный 16-битный PCM-сигнал без заголовка ( AUDIO_L16 ) с частотой 24 кГц:
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"],
"response_format": {
"audio": {
"mime_type": "AUDIO_L16",
"sample_rate": 24000,
}
},
"speech_config": {
"voice_config": {"voice": "Kore"}
},
},
)
data = response.candidates[0].content.parts[0].inline_data.data
with open("out.pcm", "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'],
responseFormat: {
audio: {
mimeType: 'AUDIO_L16',
sampleRate: 24000,
},
},
speechConfig: {
voiceConfig: { voice: 'Kore' },
},
},
});
const data = response.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
const audioBuffer = Buffer.from(data, 'base64');
fs.writeFileSync('out.pcm', audioBuffer);
}
await main();
ОТДЫХ
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) поддерживает до 2 говорящих, используя предварительно созданные голоса. Для объединения голосов, разработанных пользователем (voice_...) или реплицированных (voice_.../voicekey_...) в многосимвольном диалоге, синтезируйте реплику каждого говорящего по отдельности. Поскольку унарные запросы по умолчанию возвращаютaudio/wavс 44-байтовым заголовком RIFF, запрашивайте необработанный PCM (AUDIO_L16) или удаляйте заголовок WAV из каждой реплики перед объединением 24 кГц PCM аудиокадров. - Настраиваемые ограничения на объем хранилища голосовых данных и значение TTL:
- Голоса с сохранением состояния (
store=True, с запросом или репликацией): Максимум 200 голосов на проект с временем жизни ( TTL) 1 год . - Бессостоятельные голосовые ключи (
store=False,voicekey_...): 7-дневное время жизни (TTL ).
- Голоса с сохранением состояния (
- Для получения информации о поддерживаемых языках ознакомьтесь с разделом «Поддерживаемые языки».
Что дальше?
- Создавайте индивидуальные голосовые образы на основе естественного языка с помощью функции Voice Design .
- Воспроизведите голос существующего говорящего в функции «Воспроизведение голоса» .
- Сравните технические характеристики моделей Gemini 3.8 Flash TTS и Gemini 3.8 Flash-Lite TTS на страницах соответствующих товаров.
- Изучите возможности интерактивного двунаправленного звука с помощью Live API .