Gemini 3.8 TTS озвучивает инструкции? Отделите текст от speech_metadata
Как перенести запрос в Gemini 3.8 Flash TTS: буквальный текст, speech_metadata, единый формат Interactions API и проверка контейнера аудио.
В 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.
Надёжный декодер должен:
- Отклонять ответы с ошибкой, а не записывать их как аудиофайл.
- Выбирать аудиоблоки из шагов model_output, пропуская текст и содержимое инструментов.
- Проверять MIME-тип до выбора расширения файла.
- Декодировать 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-заголовок.


