Синтез речи

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 поддерживает четыре способа выбора или создания голосов:

  1. Готовые студийные голоса. 30 голосов, перечисленных в таблице ниже.
  2. Расширенная библиотека голосов. Сотни дополнительных голосов на разных языках, с разными акцентами и архетипами персонажей, доступные через client.voices.list() (GET /v1beta/voices).
  3. Создание голоса. Сгенерируйте уникальный голос на основе описания на естественном языке в Google AI Studio или с помощью функции POST /v1beta/voices (type="prompted", которая возвращает постоянный идентификатор voice_... и предварительную версию WAV-файла sample_audio в CreateVoice и GetVoice).
  4. Воспроизведение голоса. Воспроизведите голос говорящего на основе аудиозаписи с его голосом и согласия в 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) обратите внимание на пять ключевых изменений:

  1. Отделяйте стиль от расшифровки. Переместите инструкции по актерской игре, тону, просодии и темпу (например, "whispering", "out of breath" или "speaking slowly") из обычного текста в speech_metadata.style. text должен содержать только дословную расшифровку и встроенные теги вокализации.
  2. Создавайте персонажей с помощью Voice Design. Замените длинные блоки "Audio Profile" или "Director's Notes" голосом, созданным в Voice Design, а затем передавайте идентификатор voice_... в запросах TTS с минимальными или пустыми строками style.
  3. Используйте структурированные диалоги. В диалогах с несколькими говорящими передавайте по одному тегу part на каждую реплику с помощью тега speech_metadata.speaker вместо того, чтобы встраивать префиксы Speaker: ... в один текстовый блок.
  4. Используйте угловые скобки для встроенных тегов вокализации. Угловые скобки (<laugh>, <sigh>, <cough>, <breath>, <short pause>) используются для обозначения моментов, когда человек произносит что-либо или делает паузу. Не добавляйте теги для звуковых эффектов, не связанных с речью (например, аплодисментов или стука).
  5. Учитывайте выходные данные 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). Подробнее о форматах аудиовыхода…

Руководство по запросам

Модели 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."
  • Перекрывающаяся и чередующаяся речь. Используйте несколько сегментов, разделенных вертикальной чертой, чтобы имитировать одновременную или чередующуюся речь двух говорящих (лучше всего работает с 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.
  1. Создайте персонажа один раз. Сделайте это в разделе Дизайн голоса или выберите региональный голос из расширенной библиотеки голосов, который соответствует целевому языку и характеру персонажа.
  2. Пишите естественные расшифровки устной речи с речевыми ошибками. Чтобы текст звучал максимально естественно, пишите text как расшифровку реальной устной речи, включая естественные речевые ошибки и заминки (например, "Oh uh yeah I think... hm, so that's interesting").
  3. Сначала попробуйте обычное преобразование текста в речь. Синтезируйте речь из расшифровки с пустым полем style. В большинстве случаев инструкции style не нужны.
  4. Добавляйте короткие запросы 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 (время жизни).
  • Ознакомьтесь с разделом Поддерживаемые языки.

Дальнейшие действия