Voicemail-детектирование в исходящих AI-звонках: разбор Vapi, Retell, Bland, Pipecat, LiveKit и почему мы написали своё

Запустить AI-голосового агента сегодня - проект на выходные. Поднимаете Vapi или Retell, прописываете промпт, привязываете SIP - и бот звонит. А вот распознать, кто реально взял трубку, и подключиться достаточно быстро, чтобы не упустить живого человека - это та часть, на которой ломается каждый outbound-стек.

Voicemail-детектирование в исходящих AI-звонках: разбор Vapi, Retell, Bland, Pipecat, LiveKit и почему мы написали своё

Если вы строите outbound (продажи, ресерч, поддержку) - это решение принимается первым. Промахнётесь с детектированием - агент будет питчить голосовую почту. Промахнётесь со скоростью - человек уже положил трубку.

Ниже - текущий ландшафт voicemail-детектирования и наш кейс в TwinsAI: что мы пробовали, почему ни один из готовых сервисов не дотянул до нашей планки и что в итоге собрали сами.

Зачем вообще детектировать

Когда вы делаете исходящий звонок, трубку может взять:

  • Реальный человек - целевой кейс
  • Голосовая почта или автоответчик
  • IVR-меню ("Нажмите 1, чтобы...")
  • Колл-скриннер - Pixel Call Screen в Pixel-смартфонах, Hiya, Truecaller-режимы; в США набирает популярность
  • Факс или просто шум

Каждый случай требует разной реакции. Если ваш агент думает, что говорит с человеком, а на линии IVR - вы сжигаете минуты разговора, портите статистику и легко получаете жалобы. Если же на линии живой человек, а агент ждёт три-пять секунд "подтверждения" - человек кладёт трубку, потому что слышит тишину.

Главная задача: определить тип трубки максимально быстро и точно, и в момент детектирования живого человека сразу подключить его к боту.

Managed-решения: Vapi, Retell, Bland

Vapi

Vapi - один из самых популярных voice-AI-сервисов. Voicemail Detection из коробки умеет работать через несколько провайдеров:

  • Twilio AMD (помечен как legacy) - быстрый, но прямолинейный
  • Google - на основе Google Speech
  • OpenAI - используется в новых конфигурациях
  • Vapi Voicemail Tool (beta) - собственное решение

Источник: docs.vapi.ai. Удобно, что можно переключаться, но непрозрачно, когда что-то ломается. Если детектирование промахивается, ваш агент уже разговаривает с автоответчиком, а вы узнаёте об этом по логам.

Retell

Retell - конкурент Vapi с собственным real-time-классификатором. Из их документации: добавляет менее 30 мс задержки. Цифру по точности они официально не публикуют - в комьюнити встречаются жалобы на ~15% ложных срабатываний, но проверить это нечем.

Источник: docs.retellai.com/build/handle-voicemail.

Bland

Bland пошли путём собственной модели - дообучили Wav2Vec2 на voicemail-данных. Модель опубликована на Hugging Face одним из их инженеров: huggingface.co/jakeBland/wav2vec-vm-finetune.

Ограничения, заявленные ими самими:

  • Только английский язык
  • Оптимизирована под первые 2 секунды записи
  • Предполагает изолированную дорожку voicemail

То есть на стандартных голосовых почтах работает хорошо, на edge cases - проседает.

Фреймворки: Pipecat и LiveKit Agents

Если вы хотите рулить стеком сами, есть два основных фреймворка.

Pipecat

Open-source-фреймворк от Daily. Из коробки есть класс VoicemailDetector - он работает через STT + LLM-гейтинг: транскрибируем приветствие, скармливаем LLM, она решает.

Источник: docs.pipecat.ai/pipecat/fundamentals/voicemail.

LiveKit Agents

Встроенного детектора у LiveKit нет. Зато есть prewarm - функция, которая предзагружает модели в worker'ы один раз при старте. Это удобно, чтобы держать классификатор горячим и не платить latency на холодный запуск. Сам классификатор - ваш.

В их же документации есть пример, где human/machine/IVR детектируется через LLM-классификацию транскрипта приветствия.

А что под всем этим? Twilio AMD

Если вы используете Vapi через Twilio - под капотом часто работает классический Twilio Answering Machine Detection. Вопреки распространённому мифу, это уже не чистый DSP - Twilio в маркетинге пишут, что под AMD сидит ML-классификатор с заявленной точностью ~94% на США/Канаде.

Что важно знать:

  • Только США/Канада (Великобритания в разработке)
  • В sync-режиме добавляет ~4 секунды "тишины" перед тем, как вернуть результат
  • Возвращает классы: HUMAN, MACHINE_END_BEEP, MACHINE_END_SILENCE, MACHINE_END_OTHER, FAX, UNKNOWN
  • В асинхронном режиме (AsyncAmd=true) тишины нет, но решение приходит уже после старта медиа

Что объединяет всех этих игроков

Если посмотреть на список целиком - все они отвечают по сути на один бинарный вопрос: это голосовая почта или нет.

IVR, колл-скриннеры, Hiya, человек в шумной обстановке, человек с длинной паузой перед "Hello" - всё это сваливается в один класс "не-voicemail". А реакция на эти случаи нужна разная.

Это не упрёк - просто наблюдение о форме рынка. Большинство сценариев исходящего AI-звонка действительно сводятся к "автоответчик или человек". Но если ваш сценарий шире (например, нужно отдельно различать колл-скриннер и человека, чтобы выбрать тактику разговора) - готового решения сейчас нет.

Что мы сделали в TwinsAI

Мы оценили все эти варианты - часть погоняли в проде, часть пристально изучили. Ни один не вытянул нашу планку. Поэтому собрали свой decision-слой. Три ключевые вещи.

1. Решение по каждому partial-транскрипту, а не по всему приветствию

Стандартный подход: дождаться полного приветствия ("Hi, you've reached John, leave a message after the beep"), отправить в классификатор, получить ответ. Это секунды.

Мы пошли иначе. Каждый частичный фрагмент транскрипта пролетает через полный цикл принятия решения. Накопили достаточно сигнала - подключаемся. Именно отсюда берётся "подключение с первой фразы".

Это потребовало серьёзной оптимизации latency на каждом шаге - но окупилось.

2. Fusion-логика написана руками, а не сгенерирована AI

Мы пробовали попросить AI спроектировать правила. Получили ~200 строк ветвлений, которые в итоге заменили двумя.

Объясню, почему это важно. AI хорошо генерирует "разумно выглядящий" код, но fusion-логика для real-time decision-making требует понимания того, какие сигналы в каком порядке и с каким весом приходят. Без этого получаются деревья if/else, которые работают на тестовых данных и разваливаются на любом нестандартном кейсе.

Это, кстати, и есть та часть продукта, которую "AI не может написать сам" - просто потому, что не имеет ни доменного контекста, ни тестовой базы реальных звонков.

3. Тестовый стенд на реальных (анонимизированных) звонках

Вся телеметрия со звонков пишется в большое аналитическое хранилище. Каждый странный случай в проде, который наш алгоритм отработал плохо, превращается в тест.

Новая версия алгоритма выкатывается только если она:

  • Не деградирует точность на старых тестах
  • Не деградирует latency детектирования
  • Не деградирует производительность алгоритмов в целом

Все три критерия одновременно. Это позволяет уверенно итерировать - каждое изменение можно сравнить с предыдущим по понятным метрикам.

Что в итоге получилось

Когда на линии живой человек, наш агент входит в разговор после первой же его фразы, а не после "Hello, this is John, who's calling?". Это убирает 1-3 секунды задержки, которые в outbound-сценариях критичны для конверсии.

Готовые сервисы - не плохие. Они построены под медианный кейс. Outbound в проде - это не медианный кейс.

Вывод

Если вы только начинаете и у вас 1-1 dial без особых требований к скорости - возьмите Vapi или Retell, не тратьте время на свой стек. Они нормально решают 80% проблем.

Если вы делаете высоконагруженный outbound, где конверсия зависит от того, услышит ли человек первую секунду речи - готовые решения упрутся в потолок. Нужен либо собственный fusion-слой поверх их сигналов, либо полностью свой стек.

Какое у вас детектирование сейчас и где оно ломается? Особенно интересно, как вы решаете проблему колл-скриннеров в США - кажется, в публичном пространстве она почти не обсуждается.

Начать дискуссию