Синтез мовлення з вибором голосу та тембру

Конкретна технічна ситуація: банківський чат-бот має звучати формально та викликати довіру, а голос у мобільній грі — енергійно та дружньо. Один і той самий синтезатор мовлення (TTS) може видавати абсолютно різне сприйняття залежно від параметрів prosody: швидкості, тону, гучності. Ми впроваджуємо T

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    998
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1267
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1003

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

  1. Аналізуємо сценарії використання, цільову аудиторію, бажані стилі.
  2. Проектуємо каталог голосів, API вибору, SSML-шаблони.
  3. Інтегруємо з провайдерами, пишемо адаптери, робимо UI для вибору голосу в адмінці.
  4. Проводимо unit-тести синтезу, A/B-експерименти на реальних користувачах.
  5. Розгортаємо на production, моніторимо latency та помилки (TTS failure rate, HTTP 429).

Типові помилки при виборі голосу

  • Використовувати лише один голос для всіх сценаріїв — падає залученість.
  • Ігнорувати налаштування prosody — голос звучить неприродно (надто швидко/монотонно).
  • Не тестувати голос на цільовій аудиторії — суб'єктивна думка розробника може не збігатися з користувацькою.

Зв'яжіться з нами, щоб оцінити проєкт: ми підберемо оптимальних провайдерів, налаштуємо A/B-інфраструктуру та реалізуємо гнучкий вибір голосу під ключ. Замовте консультацію з вибору TTS-провайдера. Наш досвід — 5+ років у TTS та синтезі мовлення, понад 20 успішних інтеграцій.