Gemini 3.8 TTS озвучивает инструкции? Отделите текст от speech_metadata

Как перенести запрос в Gemini 3.8 Flash TTS: буквальный текст, speech_metadata, единый формат Interactions API и проверка контейнера аудио.

Чёрный линейный рисунок листа-трафарета на светлой карточке, шалфейно-зелёный фон и заголовок Gemini 3.8 TTS.

В Gemini 3.8 Flash TTS произносимые слова следует передавать как текст реплики, а постоянные указания о подаче — как метаданные речи. Если вставить «говори спокойно» в поле, воспринимаемое как буквальный текст, модель может произнести и эти слова. Руководство по миграции Gemini 3.8 Flash TTS прямо разделяет текст и метаданные подачи.

Google анонсировала новые TTS-модели в журнале Gemini API от 22 сентября 2026 года. Здесь приведён пример миграции для Interactions REST API, составленный по документации. Структуру запроса и логику декодирования можно проверить локально. Статья не заявляет о прослушивании реального результата, улучшении качества голоса или текущей поддержке этого эндпоинта в Ofox.

Разделите содержание и манеру речи

ИнформацияПоле в этом примере
Слова, которые должен услышать слушательtext в текстовом блоке
Постоянная подача, например спокойная и чёткаяstyle в аннотации speech_metadata
Выбранный голосgeneration_config.speech_config
Запрос аудиовыводаresponse_format

Сохраняйте разделение даже для короткой инструкции. Так проще проверить запрос и не перепутать указание со сценарием. Если персонаж действительно должен сказать «говори спокойно», эти слова, наоборот, относятся к тексту реплики.

Документация также описывает вокальные события в определённый момент. Не предполагайте поддержку любых старых тегов или произвольных аннотаций: используйте актуальную справку выбранной модели и API.

Не смешивайте семейства API

Пример ниже использует Interactions API. Не переносите его массив input и аннотации в тело GenerateContent и не смешивайте их с полями старого SDK. Источник для этого формата — официальное руководство по генерации речи.

Сохраните файл request.json. Английская реплика оставлена для сопоставления структуры; пример не является проверкой русского произношения.

{
  "model": "gemini-3.8-flash-tts",
  "input": [{
    "type": "user_input",
    "content": [{
      "type": "text",
      "text": "The next train leaves at noon.",
      "annotations": [{
        "type": "speech_metadata",
        "style": "calm and clear"
      }]
    }]
  }],
  "response_format": {"type": "audio"},
  "generation_config": {
    "speech_config": [{"voice": "Kore"}]
  }
}

Для прямого аккаунта Google с разрешённым доступом запрос выглядит так:

curl --fail-with-body --silent --show-error \
  'https://generativelanguage.googleapis.com/v1beta/interactions' \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-binary @request.json > response.json

Передавайте собственный ключ безопасно через переменную окружения. Команда обращается к API провайдера и может расходовать оплачиваемые ресурсы. Успешный локальный разбор JSON не подтверждает ни доступ к модели, ни принятие запроса провайдером.

Это пример с одним говорящим. Официальная конфигурация для нескольких голосов устроена иначе; не превращайте массив speech_config в самостоятельно придуманную схему диалога. Говорящий в каждой реплике должен совпадать с настроенными участниками.

Проверяйте ответ до декодирования

HTTP-ошибка, сохранённая в response.json, не является аудио. Перед декодированием base64 проверьте HTTP-результат и структуру ответа. В REST-ответе Interactions ищите блоки content в шагах model_output. Не предполагайте, что удобное свойство SDK вроде output_audio существует в исходном JSON.

Надёжный декодер должен:

  1. Отклонять ответы с ошибкой, а не записывать их как аудиофайл.
  2. Выбирать аудиоблоки из шагов model_output, пропуская текст и содержимое инструментов.
  3. Проверять MIME-тип до выбора расширения файла.
  4. Декодировать base64, сохраняя фактический контейнер.

Руководство по миграции указывает WAV как формат по умолчанию для непотокового ответа. Не добавляйте автоматически WAV-заголовок из старого примера для raw PCM: второй заголовок может испортить уже корректный WAV. Если запрошен другой формат, учитывайте его MIME-тип и контейнер, а не просто меняйте расширение.

Начните миграцию с короткой проверки

Используйте одного говорящего, короткий текст и одно указание о подаче. Прослушайте результат: нет ли пропущенных слов, произнесённых инструкций, ошибок произношения или неожиданной смены голоса. Сохраните запрос, ID модели, время и аудиофайл вместе. Это предлагаемые критерии приёмки, а не результаты, полученные для статьи.

Только затем увеличивайте текст или добавляйте голоса. Меняйте одну переменную за раз: одновременный перенос инструкции в метаданные, смена голоса, разбиение текста и переход на другой API затрудняют диагностику.

Перед монтажом озвучки в видео сравните её с точным текстом. Руководство по созданию видео без ведущего в кадре описывает более широкий процесс. Миграция TTS не гарантирует длительность, произношение или право использования определённого голоса.

Что проверить у другого провайдера

OpenAI-совместимый текстовый эндпоинт не подразумевает поддержку Google Interactions API и его метаданных речи. Проверьте отдельный аудиомаршрут, точный ID модели и формат вывода. Прямой пример Google выше не является конфигурацией эндпоинта Ofox.

Выбор модели отделяйте от смены формата API. Gemini 3.8 Flash-Lite TTS — связанное предложение, но перед заменой строки модели нужно проверить его собственную документацию и поддержку. Обзор мультимодальных API (на английском) даёт контекст, но не заменяет актуальную справку провайдера.

Часто задаваемые вопросы

Почему модель может произнести указание о подаче?
Новая модель воспринимает входной текст как буквальную реплику. Постоянные указания передавайте в документированном поле метаданных речи, а не внутри сценария.
Можно отправить этот JSON в GenerateContent?
Нет. Здесь использованы input и аннотации Interactions. У GenerateContent другая структура; следуйте его примеру от запроса до ответа.
Вывод всегда представляет собой raw PCM?
Нет. По руководству миграции непотоковый вывод по умолчанию — WAV. Проверяйте фактический формат и не добавляйте второй WAV-заголовок.