Реализация голосового бота (Voice Bot) в мобильном приложении
Представьте: вы запускаете голосового ассистента в навигационном приложении. Пользователь произносит «Проложи маршрут до Минска, избегая платных дорог», но ответ приходит через 4 секунды, а половина слов распознана с ошибками — «Минска» превратилось в «минского». Это не гипотеза, а типичная ситуация при интеграции голосового бота без учёта latency, шумов окружения и особенностей русской речи. Мы сталкивались с такими кейсами в проектах для логистических компаний и ретейла: потеря 30% пользователей на первом взаимодействии из-за медленного отклика.
Чтобы избежать этого, мы строим пайплайн Speech-to-Text → NLU/LLM → Text-to-Speech с суммарным временем отклика менее 1,5 секунды. Ключевой приём — потоковая обработка на каждом этапе: начинаем транскрипцию до окончания фразы, генерируем ответ по первым токенам, синтезируем речь одновременно с выводом. Дополнительно тюним конфигурации под конкретное устройство (iOS/Android) и акустическую среду (тихий офис vs. шумная улица).
Ниже — разбор основных компонентов и их влияния на качество диалога: STT-движок, TTS-синтезатор, управление аудиосессией и wake word. Каждый блок мы оптимизировали на реальных проектах с нагрузкой до 10 000 запросов в сутки.
Почему latency — главный враг голосового бота?
Типичный breakdown задержки показывает, где теряется время:
| Этап | Облачный вариант | Оптимизированный (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 |
Сравнение: оптимизированный вариант быстрее в 2–3 раза. Ключ — не ждать завершения каждого этапа:
- STT с
shouldReportPartialResults = true— начинаем обработку до конца фразы. - LLM streaming — как только пришли первые токены, запускаем синтез.
- TTS streaming — начинаем воспроизведение, пока остаток фразы ещё синтезируется.
Какой 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 зависит от бюджета и требований к натуральности: для простых ответов достаточно нативного, для сервиса «помощник-консультант» — только облачные решения. Свяжитесь с нами для подбора оптимального TTS под ваш сценарий.
Управление аудио: как избежать эха и прерываний
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 неделя.
- С облачными движками (Yandex SpeechKit / ElevenLabs), streaming и latency ~1 с — 3–5 недель.
- С wake word и hands-free — +1–2 недели.
Этапы работы
- Аналитика и прототип — 2–4 дня.
- Проектирование аудио-пайплайна — 2–3 дня.
- Реализация — 1–3 недели.
- Тестирование и отладка — 3–5 дней.
- Деплой в App Store / Google Play — 1–2 дня.
Свяжитесь с нами для оценки вашего проекта — мы подберём оптимальную конфигурацию под ваш бюджет и требования. Закажите демонстрацию уже работающего голосового бота на реальных данных.







