Задача
Клиент хочет голосового бота, который принимает звонки как живой оператор: понимает речь, отвечает по делу, не перебивает и не тупит. На словах просто, на практике – зло. Вопрос был один: какую архитектуру брать, чтобы вышло и быстро, и естественно, и не разорительно.
Я решил не гадать, а измерить. Собрал рабочие варианты и прогнал каждый реальными звонками с секундомером в логах: когда человек замолчал, когда система это поняла, когда пошёл первый звук ответа. Семь часов, 55 замеров.
Решение
За основу – стек Яндекса (распознавание, языковая модель, синтез – всё в российском облаке), телефонная платформа как «труба» до звонка. Собрал три разные схемы и гонял каждую живыми звонками.
| АРХИТЕКТУРА | КАК УСТРОЕНА |
|---|---|
| ① Speech-to-speech | одна модель Яндекса слышит, думает и отвечает своим голосом – распознавание, логика, синтез и определение конца реплики внутри неё |
| ② Каскад через платформу | три отдельных кирпича: распознавание, языковая модель, синтез; конец реплики ловит сама платформа плюс пара моделей-детекторов |
| ③ Каскад с прямым распознаванием | те же кирпичи, но распознавание подключено к SpeechKit напрямую, через свой небольшой мост – он и приносит сигнал «реплика закончена» |
Языковая модель в каскаде – YandexGPT; её при желании меняют на другую (DeepSeek, Qwen) в одну строку – это отдельный сменный «мозг» между распознаванием и синтезом.
Кто ловит конец фразы
Вот где всё и решается. Человек в разговоре делает паузы внутри фразы – задумался, подбирает слово. Плохой детектор принимает такую паузу за конец реплики, бот влезает – и перебивает. Хороший ждёт, пока ты действительно договорил. Это, а не голос и не «мозг», оказалось самой трудной частью.
Я прошёл три уровня. Встроенное определение конца реплики у платформы стреляло прямо посреди длинной фразы – это и был корень всех перебиваний. Самодельная связка детекторов работала лучше, но то резала длинные фразы, то, наоборот, зависала на несколько секунд. А родное определение конца реплики у SpeechKit, обученное на живом русском, держало длинную фразу с паузами целиком и срабатывало ровно там, где надо.
Как это работает
- шаг 01Звонок приходит на номер, платформа поднимает трубку.
- шаг 02Аудио потоком уходит на мой мост, а с него – в потоковое распознавание Яндекса.
- шаг 03SpeechKit возвращает расшифровку кусками и сигнал «реплика закончена».
- шаг 04По сигналу текст реплики уходит в языковую модель.
- шаг 05Модель стримит ответ – бот начинает говорить, не дожидаясь всего текста; синтез озвучивает в трубку.
- шаг 06Заговорил – бот замолк. Если человек перебил, ответ обрывается.
Результат
Модель Яндекса думает почти мгновенно – от «реплика закончена» до первого слова ответа уходят доли секунды. Остальную задержку держит телефонный транспорт, а не ИИ. Что до денег: языковая модель в цене минуты – копейки, основное держат распознавание, телефония и синтез. Сами ~8 ₽ – это на дорогих моделях Яндекса; берёшь модели попроще – выходит в полтора-два раза меньше, а на простых сценариях качества хватает.
Стек
Мост – маленький сервис: принимает аудио звонка, гонит в потоковое распознавание, возвращает текст и сигнал конца реплики. Он же переиспользуется под запись данных в CRM и сводку звонка.
Грабли, на которые уже наступил
Эхо от громкой связи. На громкой связи бот слышал собственный голос из динамика, принимал его за речь абонента и перебивал сам себя. С трубкой у уха – пропадает; на реальной линии обычно гасится оператором, но на стенде укусило знатно.
Встроенный детектор платформы стрелял посреди фразы. Корень перебиваний. Вылечилось тем, что ответ запускается строго по сигналу нормального детектора, а не по «самодеятельности» распознавания.
Голос – отдельная боль. В speech-to-speech голоса Яндекса звучат не самыми живыми, а свой брендовый – для небольшой компании ощутимые деньги каждый месяц. Отсюда частый выбор рынка: берут голос поестественнее у зарубежных синтезаторов – он и приятнее, и обычно дешевле, – но платят за это тем, что речь клиента уходит из российского контура. «Данные дома» против «голос красивее» – каждый решает сам.
И пара упрямых потолков. Конец реплики короче полусекунды не выкрутить – у SpeechKit это нижняя граница, быстрее уже начинает резать паузы. А однажды полчаса грешил на «плохую модель», пока не понял: тестовая консоль ломала кириллицу, и модель получала кашу вместо русского. Классика.
Вопросы и ответы
Какая архитектура в итоге лучше?
Для «живого» разговора – каскад с прямым распознаванием SpeechKit: чистое определение конца реплики, ответ за 0,4–0,5 секунды, полный контроль над языковой моделью. Speech-to-speech проще собрать и не требует своего сервера, но голос – только штатный.
Сколько стоит минута разговора?
Ориентир ~8 ₽ за минуту – и это на дорогих моделях Яндекса; на моделях попроще выходит в полтора-два раза меньше, а простым сценариям их хватает. Основное в цене – распознавание, телефония и синтез; языковая модель почти не заметна, поэтому выбор модели – про качество и скорость, а не про деньги.
Бот сможет заводить заявки в CRM?
Да. Языковая модель по ходу разговора сама вызывает функцию «создать лид» с данными клиента – проверено, поля извлекаются верно. Тяжёлое – сводку звонка и разбор на поля – удобнее делать уже после звонка, когда спешить некуда.
Почему не одна модель на всё?
Speech-to-speech – хороший вариант, но голос жёстко привязан к модели, а свой брендовый – дорогой. Каскад даёт выбор голоса и контроль над логикой ответа. Разбор одной такой быстрой связки – в статье про голосового бота с задержкой 850 мс.
Данные клиентов не утекают?
Весь речевой контур – в российском облаке Яндекса, по ключу клиента. Телефония – отдельная платформа с серверами в РФ. Наружу ничего лишнего.
За сколько подключается клиенту?
Настройка софта – около получаса. Отдельно, разово, оформляется телефонный номер и безусловная переадресация с рабочего номера клиента.