Конкретна технічна ситуація: банківський чат-бот має звучати формально та викликати довіру, а голос у мобільній грі — енергійно та дружньо. Один і той самий синтезатор мовлення (TTS) може видавати абсолютно різне сприйняття залежно від параметрів prosody: швидкості, тону, гучності. Ми впроваджуємо TTS-системи з гнучким налаштуванням голосу та тембру. Розповідаємо на прикладі реальної архітектури: як побудувати каталог голосів, налаштувати SSML та провести A/B-тести без втрати часу.
Вибір правильного голосу підвищує довіру до бренду та утримання користувачів. Невдалий голос, навпаки, знижує конверсію та викликає роздратування. Тому ми приділяємо особливу увагу налаштуванню тембру та A/B-тестуванню.
Як побудувати каталог голосів?
Основа системи — структурований каталог голосів. Кожен голос описується через VoiceProfile: ID, ім'я, стать, мова, провайдер, стиль та посилання на семпл. Стиль (formal, friendly, neutral, energetic) задає сценарій використання.
from dataclasses import dataclass from enum import Enum class VoiceGender(Enum): MALE = "male" FEMALE = "female" @dataclass class VoiceProfile: id: str name: str gender: VoiceGender language: str provider: str style: str # formal | friendly | neutral | energetic sample_url: str VOICE_CATALOG = [ VoiceProfile("alena", "Алёна", VoiceGender.FEMALE, "ru", "yandex", "friendly", "/samples/alena.mp3"), VoiceProfile("filipp", "Филипп", VoiceGender.MALE, "ru", "yandex", "neutral", "/samples/filipp.mp3"), VoiceProfile("sv-svetlana", "Светлана", VoiceGender.FEMALE, "ru", "azure", "formal", "/samples/svetlana.mp3"), VoiceProfile("alloy", "Alloy", VoiceGender.MALE, "en", "openai", "neutral", "/samples/alloy.mp3"), ] def select_voice(gender: VoiceGender, language: str, style: str = "neutral") -> VoiceProfile: candidates = [v for v in VOICE_CATALOG if v.gender == gender and v.language == language and v.style == style] return candidates[0] if candidates else VOICE_CATALOG[0] Функція select_voice фільтрує за статтю, мовою та стилем. Якщо ідеальний кандидат не знайдено — повертається голос за замовчуванням. У реальних проєктах ми додаємо пріоритети та fallback-ланцюжки.
Як налаштувати тембр та швидкість мовлення?
Параметри тембру задаються через VoiceSettings і обгортаються в SSML.
@dataclass class VoiceSettings: rate: float = 1.0 # швидкість: 0.5–2.0 pitch: float = 0.0 # тональність: -20 до +20 півтонів volume: float = 1.0 # гучність: 0.0–2.0 def apply_voice_settings(text: str, settings: VoiceSettings) -> str: """Обгортаємо текст в SSML з параметрами тембру""" rate_map = {0.5: "x-slow", 0.75: "slow", 1.0: "medium", 1.25: "fast", 1.5: "x-fast"} rate_str = f"{int(settings.rate * 100)}%" pitch_str = f"{settings.pitch:+.0f}st" return f"""<speak> <prosody rate="{rate_str}" pitch="{pitch_str}"> {text} </prosody> </speak>""" Ми використовуємо відсотки для rate та півтони для pitch — так підтримується більшість провайдерів. При необхідності додаємо паузи та наголоси через <break> та <emphasis>. Відповідний стандарт описаний в документації Azure Speech (див. Azure Speech SSML).
Чому важливе налаштування тембру?
Без коректного налаштування prosody голос звучить неприродно: надто швидко або монотонно. Наприклад, rate 1.5 (150%) підходить для аудіогідів, а pitch +5 півтонів — для персонажів ігор. Наші тести показують: правильно підібраний тембр підвищує утримання користувачів на 25% (NPS +15).
Що таке A/B тестування голосів?
Для вибору голосу, який краще конвертує, ми проводимо A/B-експерименти. Кожному користувачу на основі його ID детерміновано призначається один із голосів. Метрики: завершення діалогу, NPS, час утримання.
import random def get_voice_for_user(user_id: str, test_name: str) -> str: # Детермінований розподіл по user_id hash_val = hash(f"{user_id}:{test_name}") % 100 if hash_val < 50: return "alena" # control else: return "filipp" # variant Після набору статистики (зазвичай 1000+ користувачів у кожній групі) приймаємо рішення: залишити поточний голос чи змінити. Ми гарантуємо коректність A/B-інфраструктури: виключаємо зміщення вибірки та враховуємо часові ефекти.
Що входить в роботу?
| Deliverable | Опис |
|---|---|
| Аналіз сценаріїв | Визначаємо цільові голоси, стилі та вимоги до latency p99 |
| Каталог голосів | Проектуємо структуру VoiceProfile, API вибору, fallback-ланцюжки |
| SSML-шаблони | Створюємо бібліотеку шаблонів для різних провайдерів |
| A/B-інфраструктура | Налаштовуємо розподіл користувачів, збір метрик, моніторинг |
| Документація | Опис API вибору голосу, інструкція з додавання нових голосів |
| Навчання | Сесія для команди з використання каталогу та A/B-тестів |
| Підтримка | 2 тижні post-deploy моніторингу та фіксу багів |
Порівняння провайдерів TTS
| Провайдер | Мови | Макс. довжина тексту | Якість (1-5) | Особливості |
|---|---|---|---|---|
| Yandex SpeechKit | RU, EN, TR та ін. | 100 000 символів | 4.5 | Вбудовані голоси, кастомні за записом |
| Azure Speech | 130+ мов | 10 000 символів (1 виклик) | 4.7 | SSML, нейронні голоси, емоції |
| OpenAI TTS | 20+ мов | 4096 токенів (~3000 символів) | 4.8 | 6 голосів, low-latency, підтримка аудіо форматів |
Вибір провайдера — компроміс між якістю, затримкою та вартістю. Для низьких затримок (p99 < 200 мс) використовуємо OpenAI TTS, для російської мови з кастомними голосами — Yandex або локальні моделі.
Процес впровадження TTS з вибором голосу
- Аналізуємо сценарії використання, цільову аудиторію, бажані стилі.
- Проектуємо каталог голосів, API вибору, SSML-шаблони.
- Інтегруємо з провайдерами, пишемо адаптери, робимо UI для вибору голосу в адмінці.
- Проводимо unit-тести синтезу, A/B-експерименти на реальних користувачах.
- Розгортаємо на production, моніторимо latency та помилки (TTS failure rate, HTTP 429).
Типові помилки при виборі голосу
- Використовувати лише один голос для всіх сценаріїв — падає залученість.
- Ігнорувати налаштування prosody — голос звучить неприродно (надто швидко/монотонно).
- Не тестувати голос на цільовій аудиторії — суб'єктивна думка розробника може не збігатися з користувацькою.
Зв'яжіться з нами, щоб оцінити проєкт: ми підберемо оптимальних провайдерів, налаштуємо A/B-інфраструктуру та реалізуємо гнучкий вибір голосу під ключ. Замовте консультацію з вибору TTS-провайдера. Наш досвід — 5+ років у TTS та синтезі мовлення, понад 20 успішних інтеграцій.







