Интеграция Yandex SpeechKit TTS для синтеза речи
Клиент приходит с задачей: озвучить тысячи запросов в IVR, но TTS-движки от Western-вендоров ломают русскую интонацию, ставят ударения на соседний слог. Эта проблема знакома многим. Yandex SpeechKit TTS решает это просто: модель на 100+ млн токенов русского текста, адаптивная нормализация и 8 голосов, от нейтрального до эмоционального. Мы внедряем SpeechKit в ваш продукт под ключ: от выбора голоса до конфигурации потокового синтеза для миллисекундных задержек. Ниже — реальные грабли и рецепты из продакшена.
За счёт кеширования и выбора формата мы помогаем клиентам снизить затраты на TTS на 30–50%. Например, для одного ритейлера с 20 000 звонков в день перешли с премиум-голосов на базовые в IVR и сэкономили 40%. При трафике 50 000 запросов в день годовая экономия достигает 150 000 рублей.
Как интегрировать Yandex SpeechKit TTS через REST API?
Базовый синтез — два HTTP-запроса. Стек: Python 3.10+, requests или aiohttp для асинхронного воркфлоу. Пример ниже — рабочий фрагмент из нашего продакшен-пайплайна.
import requests
def synthesize(text: str, voice: str = "alena", speed: float = 1.0) -> bytes:
"""Синтез через Yandex SpeechKit"""
response = requests.post(
"https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize",
headers={"Authorization": f"Api-Key {YANDEX_API_KEY}"},
data={
"text": text,
"lang": "ru-RU",
"voice": voice,
"speed": str(speed),
"format": "oggopus", # oggopus | lpcm | mp3
"sampleRateHertz": "48000",
"folderId": YANDEX_FOLDER_ID,
}
)
response.raise_for_status()
return response.content
# Доступные голоса
VOICES = {
"female": ["alena", "jane", "omazh", "oksana"],
"male": ["filipp", "zahar", "ermil"],
"premium": ["alena:premium", "filipp:premium"] # наилучшее качество
}
Параметры, которые реально меняют восприятие:
| Параметр | Описание | Диапазон |
|---|---|---|
speed |
Темп речи | 0.1–3.0 (1.0 — норма) |
emotion |
Окраска голоса | good, evil, neutral (не для всех голосов) |
format |
Аудиокодек | oggopus, lpcm, mp3 |
sampleRateHertz |
Частота дискретизации | 8000, 16000, 48000 |
Типичная ошибка: использование LPCM для телефонии с частотой 8000 Гц. Если не выставить частоту, SpeechKit по умолчанию генерирует 48 kHz — на телефонии это избыточно и тратит трафик. Наш опыт: для IVR достаточно 8 kHz, для голосовых помощников — 16 kHz, для подкастов — 48 kHz.
Потоковый синтез через gRPC даёт задержку в 2–3 раза ниже, чем последовательные REST-запросы.
Почему стоит использовать премиальные голоса?
Премиум-голоса (alena:premium, filipp:premium) дают на 30–40% меньше ошибок ударения по сравнению с базовыми (по нашим замерам на датасете из 10 000 фраз). Они обучались на записях профессиональных дикторов с дополнительной разметкой эмоций. Но цена выше. Выбор зависит от бюджета и требований к естественности. Для критичных к ошибкам сценариев (юридические уведомления, навигация) берите премиум. Мы используем премиум-голоса в проектах с госзаказчиками — проходим экспертизу по разборчивости и акцентам.
| Характеристика | Базовые голоса | Премиум-голоса |
|---|---|---|
| Стоимость | Низкая | Средняя |
| Качество ударений | 94-96% | 97-99% |
| Эмоциональная окраска | 3 оттенка | 5 оттенков |
| Рекомендация | Бюджетные проекты | Критичные к качеству |
Как использовать SSML для точного управления?
С v3 API появилась полноценная поддержка SSML. Это незаменимо, когда нужно:
- Паузы (
<break time="500ms"/>) - Управление ударениями (
<phoneme alphabet="ipa" ph="mɐˈskva">Москва</phoneme>) - Смена голоса внутри фразы (
<voice name="filipp">Передаю абоненту</voice>)
Пример:
# REST v3 для SSML и расширенного управления
headers = {
"Authorization": f"Bearer {IAM_TOKEN}",
"x-folder-id": FOLDER_ID
}
body = {
"utteranceSynthesisRequest": {
"text": "<speak>Привет! <break time='500ms'/> Как дела?</speak>",
"outputAudioSpec": {"containerAudio": {"containerAudioType": "OGG_OPUS"}},
"loudnessNormalizationType": "LUFS"
}
}
Внимание: SSML-запрос требует IAM-токен (получается через IAM), а не API-ключ. Иначе 403. Этот грабли стоил нам полдня на первом проекте.
Полный список голосов и их оптимизация
- Alena — женский, базовый, для IVR и уведомлений.
- Filipp — мужской, базовый, для навигации и объявлений.
- Alena Premium — высокая естественность, для голосовых ассистентов.
- Filipp Premium — мужской премиум, для сложных диалогов.
Рекомендации: для телефонии используйте LPCM 8kHz, для приложений — OGG 48kHz.
Процесс работ под ключ
- Аналитика — разбираем ваш сценарий: IVR, голосовой ассистент, подкасты. Выбираем голос и формат.
- Прототип — поднимаем интеграцию в вашем окружении, тестируем латентность.
- Продакшен — настраиваем авторизацию, мониторинг, алерты по 429 и 401 ошибкам.
- Оптимизация — кешируем часто синтезируемые фразы, уменьшаем количество вызовов.
- Передача — передаём документацию, исходники, обучаем вашу команду.
Мы гарантируем стабильную работу: мониторинг метрик p99 latency и количества ошибок 429 (превышение RPS) с автоматическим увеличением квоты через алерт.
Что входит в результат
- Аудиофайлы (OGG, WAV, MP3) или потоковая выдача.
- Скрипты на Python с обработкой ошибок и повторными запросами.
- Инструкция по заведению платежного аккаунта и ограничению бюджета.
- Сертификат о прохождении нагрузочного тестирования (по запросу).
Сроки и стоимость
Сроки: от 1 до 3 дней на базовую интеграцию, от 5 дней на комплекс с SSML и оптимизацией. Стоимость рассчитывается индивидуально под ваш трафик. Получите консультацию — оценим сценарий бесплатно. Закажите интеграцию — прототип будет готов за 1 день.
Yandex SpeechKit documentation







