Страница 1 из 1

Передача вызова call-центру

Добавлено: 30 мар 2017, 16:49
verhperm
Здравствуйте! Подключили услуги внешнего call-центра и приобрел себе головную боль :(
Раньше, при входящих вызовах - одновременно звонили телефоны у всех сотрудников (через очередь, с задержкой - сначала у одного, потом у других), но речь не об этом :)
Сейчас - к этим телефонам добавили внутренний номер call-центра (т.е. звоним одновременно на него, и на телефоны наших менеджеров).

Проблема, что оборудование call-центра сразу "снимает трубку" (отправляет код 200) и само генерирует длинные гудки (пока не ответит оператор) - телефоны у наших менеджеров не звонят.

Подскажите пожалуйста, в какую сторону рыть, чтобы заставить Астериск игнорировать ложное "снятие трубки" call-центром, распознавать гудки в линии и соединить каналы только тогда, когда там появится "живая речь" оператора?

Re: Передача вызова call-центру

Добавлено: 31 мар 2017, 08:41
virus_net
Интересная проблема. Сходу не могу придумать предложений.
А с call-центром общались по этому поводу ?

Re: Передача вызова call-центру

Добавлено: 31 мар 2017, 09:42
ded
Предложу чуть изменить сценарий:
1. Сначала ringall телефоны менеджеров втечение 5-7 сек., а потом переход на внешний call center
2. Dial(SIP/externalCC/12345)
или наоборот. Кто берёт на себя ударную нагрузку.

Re: Передача вызова call-центру

Добавлено: 31 мар 2017, 09:44
virus_net
Вообщем то либо просить калцентр не делать Ansewer ДО соединения с оператором, но боюсь этот deadend, т.к. вангую, что там сидит пряморукий Одмин, который просто не знает как сделать по другому.
Либо убрать калцентр из очереди и вызывать их номер только по выходу из очереди, когда есть тригеры, например "нет ответа" или "нет операторов очереди".
${QUEUESTATUS}: The status of the call as a text string.
TIMEOUT
FULL
JOINEMPTY
LEAVEEMPTY
JOINUNAVAIL
LEAVEUNAVAIL
CONTINUE

Re: Передача вызова call-центру

Добавлено: 01 апр 2017, 19:32
verhperm
Спасибо за ответы!
1. Ударную нагрузку должен брать как раз call-центр. По диалплану - если в течение 10 секунд операторы call-центра не отвечают, то начинают звонить телефоны у наших менеджеров.
2. В call-центре именно однорукий админ, так что поставить Answer после ответа именно оператора у него вряд ли получится.
3. Пока допендрил до пары вариантов, напишу их в следующих сообщениях.

Re: Передача вызова call-центру

Добавлено: 01 апр 2017, 19:50
verhperm
До ответа оператора - call-центр выдает в линию стандартные ring tones:
20-100 миллисекунд - фоновый шум при соединении
от 2-х до 6-х секунд - тишина
Дальше по циклу:
1 секунда - тон, 425 Hz
4 секунды - тишина

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

Первый вариант (чтобы не лезть в исходники Asteriska):
1. Номер call-центра набираем с опцией "M":

Код: Выделить всё

Dial(SIP/123, 60, TtM(callcenter))
2. После ответа call-центра, но до соединения каналов - вызовется макрос callcenter.
3. В макросе используем приложения wait, waitForSilence, waitForNoise с таймаутом.
Засекаем время выполнения каждой waitForSilence, waitForNoise, если оно соответствует нашему шаблону (гудки), то остаемся в цикле.
Если не соответствует - завершаем макрос и соединяем каналы.

Код макроса (диалплан на LUA):

Код: Выделить всё

         local ringing = 1
         local intervalLen = 30   -- интервал (мс), в течение которых должен быть шум/тишина
         app.wait(1)        -- отсекаем шум в начале соединения
         
         local t1 = tonumber(channel["STRFTIME(${EPOCH},0,%S%3q)"]:get())    -- 30123 (30 - количество секунд в текущей минуте; 123 - миллисекунды)
         local t2 = 0
         app.waitfornoise(intervalLen,1,6)			-- ждем первого гудка, или ответа оператора
         t2 = tonumber(channel["STRFTIME(${EPOCH},0,%S%3q)"]:get())
         if (t2 < t1) then t2 = t2 + 60000 end                  -- на случай, если началась новая минута (t1 = 58123, а t2 = 01123)
         t1 = tonumber(channel["STRFTIME(${EPOCH},0,%S%3q)"]:get())

         while ringing == 1 do
            app.waitforsilence(intervalLen,1,1.1)            -- ждем окончания гудка (или перерыва в словах оператора)
            t2 = tonumber(channel["STRFTIME(${EPOCH},0,%S%3q)"]:get())
            if (t2 < t1) then t2 = t2 + 60000 end
            if (t2 - t1 <= 950 or t2 - t1 >= 1050) then       -- если звук длился <= 0.95 или >= 1.05 секунды
                ringing = 0                                               -- значит оператор ответил, завершаем макрос
            else
                app.waitfornoise(intervalLen,1,4.1)          -- если нет, то ждем следующего гудка (4 секунды)
                t1 = tonumber(channel["STRFTIME(${EPOCH},0,%S%3q)"]:get())
                if (t1 < t2) then t1 = t1 + 60000 end
                if (t1 - t2 < 3950  or t1 - t2 >= 4050) then ringing = 0 end       -- если следующий звук не через 4 секунды, то завершаем макрос
                while t1 >= 60000 do t1 = t1 - 60000 end
            end
         end
         return 1;         
Проблема - в реальных условиях часто не распознается первый гудок, хотя все описанные условия соблюдаются (4 сек тишина, 1 сек - гудок, проверял в аудиоредакторе):
waitforsilence срабатывает через 100 - 700 мс, хотя должен срабатывать примерно через 1 секунду.
Увеличение интервала intervalLen не помогает.

Re: Передача вызова call-центру

Добавлено: 01 апр 2017, 19:53
verhperm
Второй вариант - лезть в исходники, в файле dsp.c есть функция tone_detect, позволяющая распознать тон определенной частоты.
С её помощью можно модифицировать waitForNoise или написать свое приложение, которое будет ждать шума, а тон с частотой 425 Hz считать за тишину.

Re: Передача вызова call-центру

Добавлено: 05 апр 2017, 13:16
Obi Van
Похоже что на FL.ru ваше задание? ;) Однако в этой ситуации, до того как понаставить костылей и подпорок, не проще что-то поменять в колл-центре. Ведь это не должно быть "только вашей проблемой" верно?

Re: Передача вызова call-центру

Добавлено: 05 апр 2017, 14:54
ded
verhperm писал(а):2. В call-центре именно однорукий админ, так что поставить Answer после ответа именно оператора у него вряд ли получится.

Re: Передача вызова call-центру

Добавлено: 14 апр 2017, 12:09
whoim
Правильно - решить проблему на стороне коллцентра.
Заодно и сип-транк с ними прямой замутить, чтобы не платить за исходящие.