Конкретна технічна ситуація: банківський чат-бот має звучати формально та викликати довіру, а голос у мобільній грі — енергійно та дружньо. Один і той самий синтезатор мовлення (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 успішних інтеграцій.







