Як інтегрувати голосового бота в мобільний застосунок: STT, TTS та latency
Уявіть: ви запускаєте голосового асистента в навігаційному застосунку. Користувач вимовляє «Проклади маршрут до Києва, уникаючи платних доріг», але відповідь приходить через 4 секунди, а половина слів розпізнана з помилками — «Києва» перетворилося на «київського». Це не гіпотеза, а типова ситуація при інтеграції голосового бота без урахування latency, шумів оточення та особливостей української мови. Ми стикалися з такими кейсами в проєктах для логістичних компаній та рітейлу: втрата 30% користувачів на першій взаємодії через повільний відгук.
Щоб уникнути цього, ми будуємо пайплайн Speech-to-Text → NLU/LLM → Text-to-Speech із сумарним часом відгуку менше 1,5 секунди. Ключовий прийом — потокова обробка на кожному етапі: починаємо транскрипцію до закінчення фрази, генеруємо відповідь за першими токенами, синтезуємо мову одночасно з виведенням. Додатково тюнімо конфігурації під конкретний пристрій (iOS/Android) та акустичне середовище (тихий офіс vs. шумна вулиця).
Нижче — розбір основних компонентів та їхнього впливу на якість діалогу: STT-двигун, TTS-синтезатор, керування аудіосесією та wake word. Кожен блок ми оптимізували на реальних проєктах із навантаженням до 10 000 запитів на добу. Наша компанія має понад 5 років досвіду, реалізували 30+ проєктів.
Чому latency — головний ворог голосового бота?
Типовий breakdown затримки показує, де губиться час. Streaming-архітектура швидша в 2-3 рази.
Порівняльна таблиця latency
| Етап | Хмарний варіант | Оптимізований (streaming) |
|---|---|---|
| STT (транскрипція) | 400–800ms | 200–400ms |
| NLP / LLM відповідь | 500–2000ms | 150–400ms (streaming + кеш) |
| TTS (синтез) | 300–600ms | 100–200ms |
| Мережа (2x) | 100–300ms | — |
| Разом | 1,3–3,7s | ~1s |
Ключ — не чекати завершення кожного етапу:
- STT з
shouldReportPartialResults = true— починаємо обробку до кінця фрази. - LLM streaming — щойно прийшли перші токени, запускаємо синтез.
- TTS streaming — починаємо відтворення, поки решта фрази ще синтезується.
Який STT-двигун обрати для української та російської мови?
Порівняння STT-двигунів
| Двигун | Якість укр./рос. | Latency | Offline | Вартість |
|---|---|---|---|---|
| Нативний (SFSpeechRecognizer / SpeechRecognizer) | Середня (короткі команди) | 200–300ms | Так | Безкоштовно |
| Yandex SpeechKit | Відмінна | 200–400ms (streaming) | Ні | Похвилинна |
| Whisper API (OpenAI) | Дуже висока | 200–500ms | Ні | За запит |
| Google Cloud Speech-to-Text | Висока | 200–400ms (gRPC streaming) | Ні | Похвилинна |
Для розмовних діалогів з нестандартною лексикою (медицина, юриспруденція) ми рекомендуємо Yandex SpeechKit — він навчений на великому російськомовному корпусі та дає на 15–20% менше помилок, ніж нативний STT. Для української мови радимо тестувати конкретні моделі.
// iOS: AVAudioEngine → Yandex SpeechKit streaming
class VoiceBotRecorder {
private let audioEngine = AVAudioEngine()
private var recognitionStream: RecognitionStream?
func startRecording() throws {
let inputNode = audioEngine.inputNode
let format = AVAudioFormat(commonFormat: .pcmFormatInt16,
sampleRate: 16000,
channels: 1,
interleaved: false)!
recognitionStream = speechKitClient.createStream(config: streamConfig)
inputNode.installTap(onBus: 0, bufferSize: 4096, format: format) { [weak self] buffer, _ in
guard let pcmData = buffer.int16ChannelData?[0] else { return }
let bytes = Data(bytes: pcmData, count: Int(buffer.frameLength) * 2)
try? self?.recognitionStream?.send(audio: bytes)
}
audioEngine.prepare()
try audioEngine.start()
}
}
TTS: синтез мови, який не дратує
- ElevenLabs — найкраща якість, клонування голосу для бренду, streaming через WebSocket.
-
OpenAI TTS — моделі
tts-1(швидкий) таtts-1-hd(якісний); для української найприродніший голосnova(перевіряйте підтримку). -
Yandex SpeechKit TTS — голоси
alena,filipp,jane; streaming через gRPC, naturalness на рівні ElevenLabs для російськомовної аудиторії. - Нативний синтез —
AVSpeechSynthesizer(iOS) таTextToSpeech(Android) — безкоштовно, offline, але звучить роботизовано.
Вибір TTS залежить від бюджету та вимог до натуральності: для простих відповідей достатньо нативного, для сервісу «помічник-консультант» — тільки хмарні рішення. Економія від використання streaming TTS — до 30% часу синтезу.
Керування аудіо: як уникнути еха та переривань
iOS. Категорія AVAudioSession має бути .playAndRecord з опцією .defaultToSpeaker. При відтворенні TTS тимчасово деактивуємо мікрофон: AVAudioSession.sharedInstance().setActive(false) перед синтезом, true — після.
try AVAudioSession.sharedInstance().setCategory(
.playAndRecord,
options: [.defaultToSpeaker, .allowBluetooth]
)
Android. Використовуємо AudioManager.requestAudioFocus() на час відтворення, abandonAudioFocus() — після. Bluetooth-гарнітури вимагають окремої обробки через BluetoothHeadset.
Barge-in (переривання). Якщо користувач починає говорити, поки бот ще відповідає, потрібно виявити мову → зупинити TTS → почати запис. Voice Activity Detection можна реалізувати через AudioRecord.getMaxAmplitude() або використовувати WebRTC VAD для більшої точності.
Wake word та hands-free режим
Для сценаріїв «навігація за кермом» або «розумні окуляри» додаємо wake word, наприклад «Привіт, асистент», що активує бота без натискання кнопки. Використовуємо Picovoice Porcupine — підтримує кастомні wake words і працює повністю on-device. Альтернатива — OpenWakeWord (open source). Споживання ресурсів: ~50 MB RAM, вмикається лише на час прослуховування.
Що входить у роботу (під ключ)
- Аудит поточної архітектури — оцінка вимог до мови, latency, спікер-діаризації.
- Вибір двигунів — STT/TTS під завдання (бюджет, точність, offline-режим).
- Розробка аудіо-пайплайну — захоплення з мікрофона, кодування PCM/WAV, streaming у хмарні API.
- Інтеграція NLU/LLM — від простих intent-роутингів до генерації відповідей через OpenAI або Yandex GPT.
- Оптимізація latency — streaming, кешування, гранульоване налаштування буферів.
- UI/UX — візуалізація станів (слухає, думає, говорить), анімація звукової хвилі, обробка помилок.
- Тестування — на реальних пристроях з різними акцентами, фоновими шумами (кафе, вулиця, метро).
- Документація та навчання — опис інтеграції, ключів API, процедур підтримки.
- Підтримка після запуску — моніторинг, доналаштування моделей під зростаючу базу фраз.
Наш досвід та гарантії
Ми працюємо з голосовими інтерфейсами понад 5 років — за цей час реалізували більше 30 проєктів для iOS та Android в українських та міжнародних компаніях. Наші інженери — сертифіковані розробники Swift та Kotlin, мають досвід інтеграції з Yandex SpeechKit, ElevenLabs та OpenAI. Гарантуємо стабільність роботи при навантаженні до 10 000 запитів на добу та SLA на час відгуку не більше 2 секунд.
Орієнтири за термінами та вартістю
- Базова версія з нативними STT/TTS — 1 тиждень, від $500.
- З хмарними двигунами (Yandex SpeechKit / ElevenLabs), streaming та latency ~1 с — 3–5 тижнів, від $2000.
- З wake word та hands-free — +1–2 тижні, від $500.
Етапи роботи
- Аналітика та прототип — 2–4 дні.
- Проектування аудіо-пайплайну — 2–3 дні.
- Реалізація — 1–3 тижні.
- Тестування та налагодження — 3–5 днів.
- Деплой в App Store / Google Play — 1–2 дні.
Оцінимо ваш проект безкоштовно — пишіть нам. Замовте демонстрацію вже працюючого голосового бота на реальних даних.
Технічна реалізація голосового бота потребує глибоких знань аудіообробки та оптимізації. Ми допоможемо впровадити голосовий інтерфейс у ваш застосунок.







