Генерация речи из текста (TTS)

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

  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" , persistent store=True по умолчанию или необязательно stateless store=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 ) ознакомьтесь с пятью ключевыми изменениями:

  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 без заголовка, явно установите 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). См. раздел «Форматы аудиовыхода» .

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

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