Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
FAS (False Answer Supervisor) это техника используемая различными провайдерами VoIP для увеличения длительности и соответственно стоимости звонка.
FAS бывает следующих видов:
Ответ на звонок и трансляция в линию звонящего тишины или гудков
Добавление тишины или записи разговора после того как тот кому звонили повесил трубку.
Округление значения длинны звонка в биллинге оператора
Несмотря на то что вариант 1 является самым простым для детектирования он используется очень часто.
Детектирование гудков после ответа
Поскольку известны частоты для гудка в разных странах возможно понять что в аудио канале есть FAS по наличию следующих частот:
425Hz
440Hz - для Франции
450Hz - для Китая
480Hz - один из тонов оборудования Bell
400Hz - один из тонов используемых в UK
Для детектирования данных тонов необходимо взять запись звонка после ответа и разложить его с помощью FFT на составляющие частоты, если данные частоты являются превалирующими в окне измерения, то можно считать что мы слышим гудок.
Пример dialplan для asterisk
Для записи можно использовать простой пример dialplan для Asterisk который произведет вызов через оператора связи и запишет разговор в файл для дальнейшего анализа.
[fas]
exten => _XX.,1,Set(filename=${EXTEN}-${EPOCH})
exten => _XX.,n,MixMonitor(/tmp/${filename}.wav,b)
exten => _XX.,n,Dial(SIP/trunk/${EXTEN})
exten => h,1,GotoIf($["${DIALSTATUS}" = "ANSWER"]?detect:exit)
exten => h,n(detect),StopMixMonitor()
exten => h,n,Agi(/usr/local/bin/fas-detector,${filename})
exten => h,n,Set(CDR(fas_detected)=${FAS_DETECTED})
exten => h,n(exit),NoOp
Программа распознавания тонов
Для распознования тонов мной был написан простой детектор который проходит по файлу первые 5 секунд и смотрит в окнах размером в 500 миллисекунд есть ли там гудки. Результат детектора пишется в переменную FAS_DETECTED которая может быть использована для записи в CDR.
Исходный код расположен у меня на Github
Выводы
К сожалению данный метод детектирования не защищен от ложноположительной реакции при попадании на VoiceMail и не является решением которое можно использовать в операторской инфраструктуре.
Тем не менее он дает возможность найти вероятные проблемы и разобрать их уже в ручном режиме без необходимости проверять все звонки.
Дальнейшим улучшением может являтся обучение моделей глубинного обучения для улучшения детектирования. С помощью данного фильтра возможно собрать обучающую выборку.