Как мы научились определять продвинутые автоответчики

Год назад мы начали использовать ASR для обработки записей телефонных звонков.

TL;DR: вместо бинарных правил и end-to-end ML мы выбрали скоринговую систему поверх ASR (T-One): анализируем диалог и поведение, получаем ~98% точности при среднем времени обработки ~4.9 сек вместо 20+ сек на Whisper.
Задача казалась простой: понять, ответил ли абонент сам или сработал автоответчик, и на основании этого корректно завершить звонок и вернуть деньги пользователю при неудаче.

На практике всё оказалось сильно сложнее.

Мы работаем с телефонными розыгрышами. Записи стерео: слева абонент, справа оператор. Оператор - это заранее подготовленная аудиозапись. Первые версии системы выглядели очевидно: если абонент говорит что-то вроде «абонент сейчас недоступен», «оставьте сообщение», «говорит голосовой помощник» - это автоответчик.

Так мы и начали.

Этап 1. Когда автоответчики перестали быть тупыми

На старте мы использовали Whisper. Он решал сразу две задачи:

  • расшифровка речи

  • примитивная детекция автоответчиков по ключевым фразам

Пока автоответчики были классическими — всё работало.

Проблемы начались позже.

Современные автоответчики и голосовые ассистенты перестали говорить шаблонно. Они:

  • отвечают короткими фразами («да», «слушаю», «говорите»)

  • переспрашивают

  • не палятся в начале разговора

  • могут поддерживать иллюзию диалога

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

  • реальным человеком

  • умным автосекретарём

Ошибка стоила денег.

Whisper обрабатывал минутную запись около 20 секунд. Но даже при этом качество детекции упиралось не в ASR, а в логику.

Этап 2. Переход на T-One и тупик

С выходом модели T-One, обученной именно на телефонных разговорах, появилась надежда.

Мы:

  • заменили Whisper на T-One

  • получили более стабильную транскрипцию

  • ускорили обработку

Для удобства я написал отдельный REST API вокруг модели.

Отдельно важно про производительность. Среднее время полной обработки записи и детекции автоответчика с моделью T-One составляет около 4.9 секунды, против 20+ секунд при использовании Whisper. Это критично для нашей системы: результат нужен быстро, пока пользователь ещё ждёт исход звонка.

Важный нюанс - архитектура исполнения.

Whisper в нашем продакшене работал на GPU. Это означало отдельные GPU-ноды, очереди, более сложное масштабирование и чувствительность к пикам нагрузки. При росте количества звонков latency начинал «плыть», а стоимость обработки росла непропорционально.

T-One, в свою очередь, стабильно работает на CPU. Это позволило упростить инфраструктуру, отказаться от GPU для ASR и предсказуемо масштабироваться горизонтально. Для нашей задачи это оказалось критично: детекция должна работать быстро и стабильно, а не «иногда быстрее, иногда медленнее».

В итоге переход на T-One дал не только выигрыш по времени обработки, но и существенно упростил продакшен-эксплуатацию системы.

Но довольно быстро стало понятно: ASR - не решение задачи детекции.

Даже идеальный текст не отвечает на вопрос: это человек или бот.

Нужно было идти глубже.

Общая схема системы - ASR → FeatureExtractor → Scorer → Классификация
Общая схема системы - ASR → FeatureExtractor → Scorer → Классификация

ASR отвечает только за текст. Вся логика детекции вынесена в отдельные уровни.

Этап 3. Переход от правил к скорингу

Ключевые фразы vs Скоринг и диалог
Ключевые фразы vs Скоринг и диалог

Почему детекция по ключевым фразам ломается на современных автоответчиках.

Мы собрали датасет из ~7000 реальных звонков:

  • классические автоответчики

  • продвинутые ассистенты

  • IVR операторов и банков

  • реальные люди

Часть записей была размечена ещё во времена Whisper. Остальные — вручную, после анализа ошибок.

Изначально система принимала решения на основе жёстких пороговых правил: отдельные признаки напрямую давали ответ «да» или «нет».

Вместо этого мы перешли к скоринговой модели.

Идея простая:

  • система извлекает признаки

  • каждому признаку назначен вес

  • итоговый скор определяет класс

Но реализация оказалась нетривиальной.

Этап 4. FeatureExtractor: 300+ паттернов против ботов

В центре системы появился FeatureExtractor.

Он анализирует только транскрипцию и тайминги, без аудио.

Мы выделили несколько групп признаков.

Базовые признаки

Они не говорят «это бот», но создают фон:

  • отсутствие реакции на абсурд

  • репромпт-петли ("расскажите подробнее", "что-то ещё?")

  • отсутствие контекстных ссылок

  • ровный, неэскалирующий стиль

Сильные признаки

Это почти прямые маркеры автоответчика:

  • самоидентификация бота

  • IVR операторов

  • стандартные автоответы

  • умные секретари

  • праздничные автоответы

  • шаблонные бот-фразы

Человеческие признаки

Они уменьшают скор:

  • активные вопросы

  • эмоции

  • агрессия

  • смех

Матрица
Матрица

Примеры фичей и их влияние на итоговый скор.

Всего в системе:

  • 17 основных фичей

  • 5 метаданных

  • 310+ регулярных выражений

Этап 5. Детекция диалога, а не текста

Временная диаграмма диалога
Временная диаграмма диалога

Система учитывает не только текст, но и тайминги ответа и структуру вопрос–ответ.

Главное отличие человека от бота - диалог.

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

Turn-taking QA

Система ищет связки:

  • оператор задал вопрос

  • абонент ответил в разумное временное окно

  • ответ не является коротким маркером

Двунаправленный диалог

Проверяем, что вопросы и ответы идут в обе стороны, а не только оператор → абонент.

Voicemail-like детекция

Жёсткий флаг автоответчика:

  • длинная реплика в начале

  • отсутствие диалога

  • типичные фразы голосовой почты

Это позволило резко снизить ложные срабатывания.

Этап 6. Scorer и корректирующие правила

Упрощённое дерево принятия решений
Упрощённое дерево принятия решений

Показана логика принятия решений без деталей реализации.

После извлечения фичей вступает Scorer.

Алгоритм трёхуровневый:

  1. Жёсткие маркеры
    Если найден прямой признак - сразу фиксированный скор.

  2. Накопительный скоринг
    Суммирование весов всех фичей.

  3. Корректирующие правила
    Контекстная компенсация:

  • диалог снижает скор

  • voicemail усиливает

  • комбинации фичей фиксируют минимальный порог

Финальная классификация:

  • = 0.5 — автоответчик

  • 0.3–0.5 — сомнительно

  • < 0.3 — человек

Этап 7. Результаты

На текущий момент:

  • точность ~98%

  • сильно снижены false positive

  • система устойчива к «хитрым» ботам

Важно: это не ML-модель в классическом смысле. Это инженерная система с накопленной экспертизой.

И именно это даёт контроль и предсказуемость.

Вывод

В какой-то момент мы перестали пытаться «угадать», кто перед нами - человек или автоответчик. Вместо этого начали смотреть на поведение.

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

Поэтому задача детекции - это не задача распознавания речи и не задача машинного обучения в вакууме. Это задача анализа структуры разговора, таймингов и реакции на контекст.

В нашем случае лучше всего сработала не магия и не end-to-end модель, а комбинация:

  • ASR для текста

  • набора объяснимых признаков

  • скоринга

  • и аккуратной логики принятия решений

Это дало нам контроль, предсказуемость и понятные ошибки - а для продакшена это важнее любой «умной» модели.

Комментарии (24)


  1. NutsUnderline
    13.02.2026 06:08

    т.е. мы тут можем проверить установил ли себе человек какого либо умного ассистента чтобы его не беспокоили левые звонки от сомнительных личностей со странными вопросами


    1. Anselm_nn
      13.02.2026 06:08

      Специально установил Еву что б она деньги на интерчендже у спамеров тянула, мелочь, а приятно


  1. wl2776
    13.02.2026 06:08

    Мы работаем с телефонными розыгрышами.

    Всё равно не понял. Подробнее расскажите, пожалуйста, кто вы и чем занимаетесь. Зачем вам понадобилось определять автоответчик?


    1. randomsimplenumber
      13.02.2026 06:08

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


      1. wl2776
        13.02.2026 06:08

        Не, в самом деле, это что за фигня?

        На старте мы использовали Whisper. Он решал сразу две задачи:

        • расшифровка речи

        • примитивная детекция автоответчиков по ключевым фразам


          ...

          Один и тот же сценарий мог быть:

          • реальным человеком

          • умным автосекретарём

          • IVR банка

        Кому и зачем может понадобиться звонить в банк в автоматическом режиме и класть трубку, если попал на автомат?


        1. randomsimplenumber
          13.02.2026 06:08

          Ну, освежают базу номеров.


        1. masasibata Автор
          13.02.2026 06:08

          При анализе записей иногда встречались и IVR банков. Как они туда попадали, точно сказать не можем - возможно, это разновидности автоответчиков или переадресации на стороне абонента. На общей выборке таких случаев было немного, но они встречались.


    1. masasibata Автор
      13.02.2026 06:08

      У нас сервис телефонных розыгрышей. Это автоматические звонки с заранее записанными сценариями: человек получает входящий вызов и слышит правдоподобный диалог, который в итоге оказывается шуткой.

      Определение автоответчика нам нужно по практической причине. Если трубку берёт не человек, а голосовая почта или автоответчик, сценарий просто «уходит в пустоту». В таком случае розыгрыш не срабатывает как задумано, портится впечатление у заказчика и тратятся ресурсы на бесполезный звонок. Подобные звонки мы возвращаем, как раз для этого и было сделано автоопределение.


      1. wl2776
        13.02.2026 06:08

        Что-то сомнительно. В чем ваш профит? На чем вы деньги зарабатываете?


        1. masasibata Автор
          13.02.2026 06:08

          Мы зарабатываем на самих розыгрышах. Пользователь выбирает сценарий, оплачивает звонок, мы его совершаем. Чтобы развеять сомнения, в статью была добавлена ссылка на проект.


          1. randomsimplenumber
            13.02.2026 06:08

            Пользователь сам не знает кого разыгрывает? Интересная забава.


            1. masasibata Автор
              13.02.2026 06:08

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


              1. randomsimplenumber
                13.02.2026 06:08

                Всегда мечтал разыграть банк.