Генерация речи (преобразование текста в речь)

API Gemini позволяет преобразовывать текстовый ввод в аудио для одного или нескольких говорящих, используя встроенные функции преобразования текста в речь (TTS). Процесс преобразования текста в речь (TTS) управляем , то есть вы можете использовать естественный язык для структурирования взаимодействия и управления стилем , акцентом , темпом и тоном аудио.

Функция TTS отличается от функции генерации речи, предоставляемой через Live API , которая разработана для интерактивного, неструктурированного аудио и многомодальных входов и выходов. В то время как Live API отлично подходит для динамических разговорных контекстов, TTS через Gemini API предназначен для сценариев, требующих точного воспроизведения текста с точным контролем стиля и звука, например, для создания подкастов или аудиокниг.

В этом руководстве показано, как создать из текста аудиофайл для одного или нескольких говорящих.

Прежде чем начать

Убедитесь, что вы используете версию Gemini 2.5 с поддержкой встроенного преобразования текста в речь (TTS), как указано в разделе «Поддерживаемые модели» . Для достижения оптимальных результатов определите, какая модель лучше всего подходит для вашего конкретного случая.

Перед началом сборки вам может быть полезно протестировать модели Gemini 2.5 TTS в AI Studio .

Преобразование текста в речь одним диктором

Чтобы преобразовать текст в аудиосигнал, воспроизводимый одним динамиком, установите модальность ответа «audio» и передайте объект SpeechConfig с установленным параметром VoiceConfig . Вам потребуется выбрать имя голоса из списка готовых выходных голосов .

В этом примере выходной аудиосигнал модели сохраняется в WAV-файле:

Питон

from google import genai
from google.genai import types
import wave

# Set up the wave file to save the output:
def wave_file(filename, pcm, channels=1, rate=24000, sample_width=2):
   with wave.open(filename, "wb") as wf:
      wf.setnchannels(channels)
      wf.setsampwidth(sample_width)
      wf.setframerate(rate)
      wf.writeframes(pcm)

client = genai.Client()

response = client.models.generate_content(
   model="gemini-2.5-flash-preview-tts",
   contents="Say cheerfully: Have a wonderful day!",
   config=types.GenerateContentConfig(
      response_modalities=["AUDIO"],
      speech_config=types.SpeechConfig(
         voice_config=types.VoiceConfig(
            prebuilt_voice_config=types.PrebuiltVoiceConfig(
               voice_name='Kore',
            )
         )
      ),
   )
)

data = response.candidates[0].content.parts[0].inline_data.data

file_name='out.wav'
wave_file(file_name, data) # Saves the file to current directory

JavaScript

import {GoogleGenAI} from '@google/genai';
import wav from 'wav';

async function saveWaveFile(
   filename,
   pcmData,
   channels = 1,
   rate = 24000,
   sampleWidth = 2,
) {
   return new Promise((resolve, reject) => {
      const writer = new wav.FileWriter(filename, {
            channels,
            sampleRate: rate,
            bitDepth: sampleWidth * 8,
      });

      writer.on('finish', resolve);
      writer.on('error', reject);

      writer.write(pcmData);
      writer.end();
   });
}

async function main() {
   const ai = new GoogleGenAI({});

   const response = await ai.models.generateContent({
      model: "gemini-2.5-flash-preview-tts",
      contents: [{ parts: [{ text: 'Say cheerfully: Have a wonderful day!' }] }],
      config: {
            responseModalities: ['AUDIO'],
            speechConfig: {
               voiceConfig: {
                  prebuiltVoiceConfig: { voiceName: 'Kore' },
               },
            },
      },
   });

   const data = response.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
   const audioBuffer = Buffer.from(data, 'base64');

   const fileName = 'out.wav';
   await saveWaveFile(fileName, audioBuffer);
}
await main();

ОТДЫХ

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
        "contents": [{
          "parts":[{
            "text": "Say cheerfully: Have a wonderful day!"
          }]
        }],
        "generationConfig": {
          "responseModalities": ["AUDIO"],
          "speechConfig": {
            "voiceConfig": {
              "prebuiltVoiceConfig": {
                "voiceName": "Kore"
              }
            }
          }
        },
        "model": "gemini-2.5-flash-preview-tts",
    }' | jq -r '.candidates[0].content.parts[0].inlineData.data' | \
          base64 --decode >out.pcm
# You may need to install ffmpeg.
ffmpeg -f s16le -ar 24000 -ac 1 -i out.pcm out.wav

Многоканальное преобразование текста в речь

Для воспроизведения звука с нескольких динамиков вам понадобится объект MultiSpeakerVoiceConfig , в котором каждый динамик (до двух) будет настроен как SpeakerVoiceConfig . Вам нужно будет определить каждый speaker с теми же именами, что и в командной строке :

Питон

from google import genai
from google.genai import types
import wave

# Set up the wave file to save the output:
def wave_file(filename, pcm, channels=1, rate=24000, sample_width=2):
   with wave.open(filename, "wb") as wf:
      wf.setnchannels(channels)
      wf.setsampwidth(sample_width)
      wf.setframerate(rate)
      wf.writeframes(pcm)

client = genai.Client()

prompt = """TTS the following conversation between Joe and Jane:
         Joe: How's it going today Jane?
         Jane: Not too bad, how about you?"""

response = client.models.generate_content(
   model="gemini-2.5-flash-preview-tts",
   contents=prompt,
   config=types.GenerateContentConfig(
      response_modalities=["AUDIO"],
      speech_config=types.SpeechConfig(
         multi_speaker_voice_config=types.MultiSpeakerVoiceConfig(
            speaker_voice_configs=[
               types.SpeakerVoiceConfig(
                  speaker='Joe',
                  voice_config=types.VoiceConfig(
                     prebuilt_voice_config=types.PrebuiltVoiceConfig(
                        voice_name='Kore',
                     )
                  )
               ),
               types.SpeakerVoiceConfig(
                  speaker='Jane',
                  voice_config=types.VoiceConfig(
                     prebuilt_voice_config=types.PrebuiltVoiceConfig(
                        voice_name='Puck',
                     )
                  )
               ),
            ]
         )
      )
   )
)

data = response.candidates[0].content.parts[0].inline_data.data

file_name='out.wav'
wave_file(file_name, data) # Saves the file to current directory

JavaScript

import {GoogleGenAI} from '@google/genai';
import wav from 'wav';

async function saveWaveFile(
   filename,
   pcmData,
   channels = 1,
   rate = 24000,
   sampleWidth = 2,
) {
   return new Promise((resolve, reject) => {
      const writer = new wav.FileWriter(filename, {
            channels,
            sampleRate: rate,
            bitDepth: sampleWidth * 8,
      });

      writer.on('finish', resolve);
      writer.on('error', reject);

      writer.write(pcmData);
      writer.end();
   });
}

async function main() {
   const ai = new GoogleGenAI({});

   const prompt = `TTS the following conversation between Joe and Jane:
         Joe: How's it going today Jane?
         Jane: Not too bad, how about you?`;

   const response = await ai.models.generateContent({
      model: "gemini-2.5-flash-preview-tts",
      contents: [{ parts: [{ text: prompt }] }],
      config: {
            responseModalities: ['AUDIO'],
            speechConfig: {
               multiSpeakerVoiceConfig: {
                  speakerVoiceConfigs: [
                        {
                           speaker: 'Joe',
                           voiceConfig: {
                              prebuiltVoiceConfig: { voiceName: 'Kore' }
                           }
                        },
                        {
                           speaker: 'Jane',
                           voiceConfig: {
                              prebuiltVoiceConfig: { voiceName: 'Puck' }
                           }
                        }
                  ]
               }
            }
      }
   });

   const data = response.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
   const audioBuffer = Buffer.from(data, 'base64');

   const fileName = 'out.wav';
   await saveWaveFile(fileName, audioBuffer);
}

await main();

ОТДЫХ

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "contents": [{
    "parts":[{
      "text": "TTS the following conversation between Joe and Jane:
                Joe: Hows it going today Jane?
                Jane: Not too bad, how about you?"
    }]
  }],
  "generationConfig": {
    "responseModalities": ["AUDIO"],
    "speechConfig": {
      "multiSpeakerVoiceConfig": {
        "speakerVoiceConfigs": [{
            "speaker": "Joe",
            "voiceConfig": {
              "prebuiltVoiceConfig": {
                "voiceName": "Kore"
              }
            }
          }, {
            "speaker": "Jane",
            "voiceConfig": {
              "prebuiltVoiceConfig": {
                "voiceName": "Puck"
              }
            }
          }]
      }
    }
  },
  "model": "gemini-2.5-flash-preview-tts",
}' | jq -r '.candidates[0].content.parts[0].inlineData.data' | \
    base64 --decode > out.pcm
# You may need to install ffmpeg.
ffmpeg -f s16le -ar 24000 -ac 1 -i out.pcm out.wav

Управление стилем речи с помощью подсказок

Вы можете управлять стилем, тоном, акцентом и темпом, используя подсказки на естественном языке как для одного, так и для нескольких говорящих. Например, в подсказке для одного говорящего вы можете сказать:

Say in an spooky whisper:
"By the pricking of my thumbs...
Something wicked this way comes"

В подсказке для нескольких говорящих предоставьте модели имя каждого говорящего и соответствующую расшифровку. Вы также можете предоставить инструкции для каждого говорящего индивидуально:

Make Speaker1 sound tired and bored, and Speaker2 sound excited and happy:

Speaker1: So... what's on the agenda today?
Speaker2: You're never going to guess!

Попробуйте использовать вариант голоса , соответствующий стилю или эмоции, которые вы хотите передать, чтобы ещё больше подчеркнуть их. Например, в предыдущей подсказке придыхание Энцелада могло бы подчеркнуть «усталость» и «скучно», а жизнерадостный тон Пака мог бы дополнить «возбуждённость» и «счастливость».

Создание запроса на конвертацию в аудио

Модели TTS выводят только аудио, но вы можете использовать другие модели , чтобы сначала создать транскрипт, а затем передать этот транскрипт в модель TTS для озвучивания.

Питон

from google import genai
from google.genai import types

client = genai.Client()

transcript = client.models.generate_content(
   model="gemini-2.0-flash",
   contents="""Generate a short transcript around 100 words that reads
            like it was clipped from a podcast by excited herpetologists.
            The hosts names are Dr. Anya and Liam.""").text

response = client.models.generate_content(
   model="gemini-2.5-flash-preview-tts",
   contents=transcript,
   config=types.GenerateContentConfig(
      response_modalities=["AUDIO"],
      speech_config=types.SpeechConfig(
         multi_speaker_voice_config=types.MultiSpeakerVoiceConfig(
            speaker_voice_configs=[
               types.SpeakerVoiceConfig(
                  speaker='Dr. Anya',
                  voice_config=types.VoiceConfig(
                     prebuilt_voice_config=types.PrebuiltVoiceConfig(
                        voice_name='Kore',
                     )
                  )
               ),
               types.SpeakerVoiceConfig(
                  speaker='Liam',
                  voice_config=types.VoiceConfig(
                     prebuilt_voice_config=types.PrebuiltVoiceConfig(
                        voice_name='Puck',
                     )
                  )
               ),
            ]
         )
      )
   )
)

# ...Code to stream or save the output

JavaScript

import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI({});

async function main() {

const transcript = await ai.models.generateContent({
   model: "gemini-2.0-flash",
   contents: "Generate a short transcript around 100 words that reads like it was clipped from a podcast by excited herpetologists. The hosts names are Dr. Anya and Liam.",
   })

const response = await ai.models.generateContent({
   model: "gemini-2.5-flash-preview-tts",
   contents: transcript,
   config: {
      responseModalities: ['AUDIO'],
      speechConfig: {
         multiSpeakerVoiceConfig: {
            speakerVoiceConfigs: [
                   {
                     speaker: "Dr. Anya",
                     voiceConfig: {
                        prebuiltVoiceConfig: {voiceName: "Kore"},
                     }
                  },
                  {
                     speaker: "Liam",
                     voiceConfig: {
                        prebuiltVoiceConfig: {voiceName: "Puck"},
                    }
                  }
                ]
              }
            }
      }
  });
}
// ..JavaScript code for exporting .wav file for output audio

await main();

Голосовые опции

Модели TTS поддерживают следующие 30 голосовых опций в поле voice_name :

Зефир -- Яркий Пакоптимистичный Харон -- Информативный
Коре -- Фирма Фенрир -- Возбудимый Леда -- Юная
Орус -- Фирма Aoede -- Breezy Каллироя -- Легкая на подъем
Автоное -- Яркое Энцелад -- Дыхательный Япет -- Ясно
Умбриэльлёгкий на подъем Альгиеба -- Гладкая Деспина -- Гладкая
Эринома -- Ясно Альгениб -- Гравий Расалгети -- Информационный
Лаомедеяоптимистичная Ахернар -- Мягкий Альнилам -- Фирма
Шедар -- Эвен Гакрукс -- Зрелый Пульчеррима -- Вперед
Ахирд -- Дружелюбный Зубенелгенуби -- Повседневный Виндемиатрикс -- Нежная
Садачбия -- Живая Садалтагер -- Знающий Сульфат -- Теплый

Все варианты голоса можно прослушать в AI Studio .

Поддерживаемые языки

Модели TTS автоматически определяют язык ввода. Они поддерживают следующие 24 языка:

Язык Код BCP-47 Язык Код BCP-47
Арабский (египетский) ar-EG Немецкий (Германия) de-DE
Английский (США) en-US Испанский (США) es-US
Французский (Франция) fr-FR Хинди (Индия) hi-IN
Индонезийский (Индонезия) id-ID Итальянский (Италия) it-IT
Японский (Япония) ja-JP Корейский (Корея) ko-KR
Португальский (Бразилия) pt-BR Русский (Россия) ru-RU
Голландский (Нидерланды) nl-NL Польский (Польша) pl-PL
Тайский (Таиланд) th-TH Турецкий (Турция) tr-TR
Вьетнамский (Вьетнам) vi-VN Румынский (Румыния) ro-RO
Украинский (Украина) uk-UA Бенгальский (Бангладеш) bn-BD
Английский (Индия) en-IN hi-IN Маратхи (Индия) mr-IN
Тамильский (Индия) ta-IN Телугу (Индия) te-IN

Поддерживаемые модели

Модель Один динамик Мультиспикер
Gemini 2.5 Flash Preview TTS ✔️ ✔️
Gemini 2.5 Pro Preview TTS ✔️ ✔️

Ограничения

  • Модели TTS могут только принимать текстовые входные данные и генерировать аудиовыходы.
  • Сеанс TTS имеет ограничение на размер контекстного окна в 32 тыс. токенов.
  • Ознакомьтесь с разделом «Языки» для получения информации о языковой поддержке.

Что дальше?