Інтеграція Yandex SpeechKit TTS для синтезу мовлення
Клієнт приходить із задачею: озвучити тисячі запитів в IVR, але TTS-двигуни від Western-вендорів ламають російську інтонацію, ставлять наголоси на сусідній склад. Ця проблема знайома багатьом. Yandex SpeechKit TTS вирішує це просто: модель на 100+ млн токенів російського тексту, адаптивна нормалізація та 8 голосів, від нейтрального до емоційного. Ми впроваджуємо SpeechKit у ваш продукт під ключ: від вибору голосу до конфігурації потокового синтезу для мілісекундних затримок. Нижче — реальні граблі та рецепти з продакшену.
За рахунок кешування та вибору формату ми допомагаємо клієнтам знизити витрати на TTS на 30–50%. Наприклад, для одного рітейлера з 20 000 дзвінків на день перейшли з преміум-голосів на базові в IVR і заощадили 40%. При трафіку 50 000 запитів на день річна економія сягає $1.4k–1.9kів.
Як інтегрувати 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







