
Мегафон
Начали с Мегафона, у него все оказалось более-менее просто, голосовая почта срабатывает в предответном состоянии (с точки зрения сигнализации) и там перед записью есть характерный звуковой сигнал. Для определения звукового сигнала использовался алгоритм Герцеля. После того как алгоритм был реализован и опробован мегафоновская голосовая почта начала определяться достаточно хорошо, правда через какое-то время Мегафон зачем-то поменял частоту сигнала и пришлось снова настраивать определитель.
МТС
У МТС голосовая почта включается и выключается в панели управления услугами. Если голосовая почта включена, то приветствие проигрывают после снятия трубки (с точки зрения сигнализации), что делает определение этого случая менее полезным, так как деньги все равно начнут тратиться. То есть концептуально
Билайн
С Билайном ситуация аналогична МТС, сначала снимается трубка, а потом уже идет проигрывание приветствия голосовой почты.
Что же можно предпринять в такой ситуации, когда голосовая почта берет трубку? Ну, во-первых, можно ориентироваться на гудки, в случае голосовой почты трубка поднимается моментально, тогда как нормальный человек отвечает все-таки какое-то время и за это время идут гудки, но и здесь есть свои нюансы — сегодня все операторы предлагают платную услугу «мелодия вместо гудков». Если определить гудки и их длительность можно по характеру звукового сигнала, то в случае когда вместо гудков будет музыка это уже совсем нетривиальный вариант. К тому же когда абонент отбивает звонок, то он тоже может отправиться в голосовую почту, в этом случае и гудки будут и голосовая почта. Именно разнообразие вариантов делает очень сложным или почти невозможным определение попадания на голосовую почту в 100% случаев.
Благодаря одному случаю выяснилось, что на самом деле отправка звонка в голосовую почту сопровождается определенной сигнализацией (SIP 181 Call is Being Forwarded), но, к сожалению, если стык с операторами у вас не напрямую, а через какого-то транзитного оператора, то с вероятностью 99% эту сигнализацию вам не прокинут.
С точки зрения сценария VoxEngine определение голосовой почты сейчас выглядит следующим образом:
// В качестве второго аргумента нужно указать номер, подтвержденный через верхнее меню панели управления Voximplant
var call = VoxEngine.callPSTN(phone_number, "+1234567890");
call.detectProgressTone(true);
call.addEventListener(CallEvents.ToneDetected, function(e) {
if (e.VoicemailTone && !e.ProgressTone) {
// попали на голосовую почту
}
});