Реалізація голосового бота (Voice Bot) у мобільних додатках
Голосовий бот — це конвеєр з трьох ланок: Speech-to-Text → NLP/LLM → Text-to-Speech. Кожна ланка додає затримку. Загальна затримка менше 1,5 секунди — це межа прийнятного для розмовного UX. Якщо перевищити — користувач думає, що бот зависнув.
Оптимізація затримки: де втрачається час
Типовий розподіл затримки:
| Етап | Хмарний варіант | Оптимізований |
|---|---|---|
| STT (транскрипція) | 400–800ms | 200–400ms (streaming) |
| NLP / LLM відповідь | 500–2000ms | 150–400ms (streaming + кеш) |
| TTS (синтез) | 300–600ms | 100–200ms (streaming) |
| Мережа (2x) | 100–300ms | — |
| Всього | 1,3–3,7s | ~1s зі streaming |
Ключ до низької затримки — скрізь, де можливо, не чекати повного завершення попереднього кроку:
- STT з
shouldReportPartialResults = true— починаємо обробку до завершення фрази - LLM streaming — як тільки перші токени прибули, починаємо синтез
- TTS streaming — починаємо відтворення, поки решта фрази ще синтезується
Speech-to-Text: вибір ядра
Вбудовані API. iOS — SFSpeechRecognizer, Android — SpeechRecognizer. Безплатно, офлайн-підтримка (обмежена). Точність для російської мови — прийнятна для коротких команд, гірша для розгорнутих фраз.
Whisper API (OpenAI). Найкраща якість транскрипції на російській, особливо з професійною термінологією. Затримка — 200–500ms для запису 5–15 секунд. Модель whisper-1, language: "ru".
Google Cloud Speech-to-Text. API потокової передачі дозволяє отримувати часткові результати в реальному часі. StreamingRecognizeRequest + gRPC — мінімальна затримка серед хмарних варіантів.
Yandex SpeechKit. Найкращі результати для російської серед усіх варіантів (навчена на російськомовному корпусі). Потокове розпізнавання через gRPC. Якщо бот працює тільки з російськомовними користувачами — перший вибір.
// 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()
}
}
Text-to-Speech: синтез мовлення
ElevenLabs. Найкраща якість мовлення, підтримує російську. API потокової передачі через WebSocket або HTTP chunked response. Клонування голосу — якщо бот повинен говорити специфічним голосом бренду.
OpenAI TTS. tts-1 (швидкий) та tts-1-hd (якісний). Потокова передача через HTTP range requests. Голоси alloy, echo, nova та інші — для російської nova звучить найприродніше.
Yandex SpeechKit TTS. Для російської мови — один із найкращих варіантів за природністю. Голоси alena, filipp, jane. Потокова передача через gRPC.
Вбудований синтез. iOS — AVSpeechSynthesizer, Android — TextToSpeech. Безплатно, працює офлайн, але якість значно нижча, ніж у хмарних варіантах — робот-подібне звучання.
Управління аудіо на мобільному
iOS. Категорія AVAudioSession повинна бути .playAndRecord з опцією .defaultToSpeaker. При відтворенні TTS потрібно деактивувати мікрофон — інакше бот почує сам себе (еха). AVAudioSession.setActive(false) перед відтворенням, true після.
try AVAudioSession.sharedInstance().setCategory(
.playAndRecord,
options: [.defaultToSpeaker, .allowBluetooth]
)
Android. AudioManager.requestAudioFocus() перед відтворенням, abandonAudioFocus() після. Bluetooth-навушники потребують окремої обробки через профіль BluetoothHeadset.
Переривання розмови. Користувач починає говорити, поки бот ще відповідає (barge-in). Потрібно: виявити початок мовлення користувача → зупинити відтворення TTS → почати запис. VAD (Voice Activity Detection) — або вбудований через AudioRecord.getMaxAmplitude(), або більш точний через WebRTC VAD.
Wake word та режим hands-free
Для сценаріїв hands-free (навігація за кермом, розумні пристрої) — детектування wake word: «Привіт, асистент» активує бота без натискання. Рішення: Porcupine (Picovoice) з підтримкою кастомних wake words, OpenWakeWord (open source). Працюють повністю on-device, без мережевих запитів.
Процес впровадження
Вибір STT/TTS ядер за вимогами (мова, точність, затримка, бюджет).
Розробка аудіо-конвеєру: захоплення, кодування, потокова передача.
NLP/LLM логіка для розуміння голосових команд.
Оптимізація затримки: потокова передача на всіх етапах, кешування часто використовуваних відповідей.
UI: візуалізація станів (слухає / думає / говорить), анімація звукової хвилі.
Тестування в умовах фонового шуму, з різними акцентами та швидкістю мовлення.
Часові орієнтири
Голосовий бот із вбудованими STT/TTS — 1 тиждень. З хмарними ядрами (Yandex SpeechKit / ElevenLabs), потоковою передачею та оптимізацією затримки — 3–5 тижнів. З wake word та режимом hands-free — плюс 1–2 тижні.







