Детали технической реализации IVR

Я много искал информацию о технической реализации IVR в Интернете. Но, не мог не найти подходящие результаты.

Может ли кто-нибудь помочь мне с подробностями о том, что такое IVR (я имею в виду подробные технические компоненты, их взаимодействие, интеграцию, потоки вызовов, сети, серверы, задействованные базы данных, требуемые ответы ввода-вывода). Я подробно искал VoiceXML, но как это

Необходимо знать техническую архитектуру IVR.

Необходимо разработать систему IVR с использованием Java, но сначала хотелось бы узнать приведенную выше информацию, чтобы создать основу.


ivr
person user2894233    schedule 18.10.2013    source источник
comment
Если вы пишете его самостоятельно и планируете использовать карты Dialogic и ищете способ избежать самостоятельного написания JNI, вам может быть интересно d4j.sourceforge.net (я нашел его погуглив - сам не пробовал)   -  person Jerry Jeremiah    schedule 16.11.2013


Ответы (2)


Рики из Twilio здесь.

Мы создали пример IVR на Java, который вы можете проверить. С нашей архитектурой, когда кто-то звонит в наш IVR, на наш сервер отправляется HTTP-запрос, где мы предоставляем некоторые основные инструкции о том, что мы хотели бы ответить пользователю, используя TwiML. Вот код из нашего примера: мы проигрываем MP3 и слушаем, как пользователь нажимает цифру на своей клавиатуре, используя глагол:

   protected void doPost(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
            throws IOException {

        Gather gather = new Gather();
        gather.setAction("/menu/show");
        gather.setNumDigits(1);

        Play play = new Play("http://howtodocs.s3.amazonaws.com/et-phone.mp3");
        play.setLoop(3);

        try {
            gather.append(play);
        } catch (TwiMLException e) {
            e.printStackTrace();
        }

        TwiMLResponse twiMLResponse = new TwiMLResponse();
        try {
            twiMLResponse.append(gather);
        } catch (TwiMLException e) {
            e.printStackTrace();
        }

        servletResponse.setContentType("text/xml");
        servletResponse.getWriter().write(twiMLResponse.toXML());
    }

Как только пользователь нажмет цифру, будет сделан другой HTTP-запрос к указанному нами маршруту действия (в данном случае /menu/show), где мы посмотрим, какую цифру нажал пользователь, и предпримем действие:

protected void doPost(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
            throws IOException {

        String selectedOption = servletRequest.getParameter("Digits");
        Map<String, String> optionPhones = new HashMap<>();
        optionPhones.put("2", "+12024173378");
        optionPhones.put("3", "+12027336386");
        optionPhones.put("4", "+12027336637");

        TwiMLResponse twiMLResponse = null;

        try {
            twiMLResponse = optionPhones.containsKey(selectedOption)
                    ? dial(optionPhones.get(selectedOption))
                    : Redirect.toMainMenu();
        } catch (TwiMLException e) {
            e.printStackTrace();
        }

        servletResponse.setContentType("text/xml");
        servletResponse.getWriter().write(twiMLResponse.toXML());
    }

Надеюсь, вам поможет то, как мы создали этот IVR!

person rickyrobinett    schedule 06.04.2016

Вы хотите написать все сами или у вас будет фреймворк вроде VXML для работы? Если вы просто хотите писать файлы VXML и JSP, вам нужен браузер VXML. Если вы хотите полностью написать все самостоятельно, то создание браузера VXML, вероятно, будет излишним, и независимо от того, делаете ли вы браузер VXML или что-то еще, вам нужно будет побеспокоиться об абстрагировании оборудования - IVR с одним голосом/факсом/модемом будет нужен другой низкоуровневый код, чем IVR с картами Dialogic, подключенными к линиям T1, и он будет отличаться от кода, который обрабатывает только вызовы SIP.

Если предположить, что у вас уже есть браузер VXML и вам просто нужно предоставить файлы VXML и JSP, то вам нужно беспокоиться о том, хотите ли вы просто поток вызовов или собираетесь выполнять внутреннюю интеграцию. Если ваш IVR просто собирается ответить на вызов, запросить некоторую информацию от вызывающего абонента, а затем воспроизвести дополнительную информацию и повесить трубку или перевести вызов, тогда все становится очень просто — вам вообще не нужна Java. Java необходима для внутренней интеграции.

Предполагая, что у вас будет внутренняя интеграция - будь то просто база данных или веб-сервисы для другого сервера, вам нужно беспокоиться об асинхронном выполнении внутренних вызовов - если вызывающие абоненты услышат более секунды мертвого эфира без предупреждения, они подумают IVR не работает и зависает. Итак, когда поступает звонок, вам нужно отправить первоначальный запрос данных, затем сказать «Добро пожаловать в мой IVR» и затем попытаться получить результат. Если результат еще не возвращен, вам нужно сказать что-то еще, например: «Пожалуйста, подождите, пока я получу ваши данные», а затем проверьте еще раз. В конце концов, если запрос не возвращается, вам нужен запасной план — вы можете либо сказать «Эта услуга в настоящее время недоступна», а затем перевести или повесить трубку, либо вы можете предложить IVR с ограниченным обслуживанием. Что бы вы ни делали, вы не хотите, чтобы клиент когда-либо слышал больше секунды тишины, если вы специально не сказали им, что ждете чего-то — либо ждете их ввода, либо ждете данные их учетной записи (или что-то подобное) .

Чтобы иметь такой асинхронный опыт работы с VXML и JSP, вам потребуется очередь запросов в памяти и служба выполнения, которая может предоставить рабочие потоки для обслуживания этих запросов. Таким образом, вы можете поставить запрос в очередь и продолжать периодически проверять поток вызовов IVR для получения результата. Служба выполнения в конечном итоге обработает запрос и обновит его с результатом. Затем, когда IVR проверит и запрос будет доступен, он сможет использовать эту информацию. Но если результат не вернется вовремя, IVR сдастся и прекратит проверку, поэтому вам нужен статический поток, который сканирует очередь и через определенный промежуток времени отменит запрос, если служба выполнения обрабатывает его, а затем удалить запрос из очереди.

Браузер VXML ставит голос в очередь и не ждет, пока он будет фактически воспроизведен, пока не будет получен ввод вызывающего абонента, поэтому, если вы используете голос для остановки во время извлечения данных, тогда голосовая подсказка должна быть прикреплена к грамматике, которая не принять любой допустимый ввод только для того, чтобы IVR знал, когда голос закончен. Если вам абсолютно необходим результат внутреннего запроса, прежде чем продолжить поток вызовов, вам нужно будет циклически проверять результат до тех пор, пока он либо не прибудет, либо не истечет небольшой тайм-аут (сколько времени зависит от того, предупредили ли вы их, что это может занять некоторое время). пока или нет). То же самое применимо и в этом случае - вам нужно будет воспроизвести небольшое молчание, прикрепленное к грамматике, чтобы поток вызовов ждал, прежде чем снова проверить результат - обычно нет особого смысла проверять чаще, чем 100-200 мс.

Если вы не собираетесь использовать браузер VXML, а вместо этого будете писать что-то самостоятельно, то в основном применим тот же совет. Но если вы собираетесь иметь внутреннюю интеграцию, я бы порекомендовал сделать так, чтобы система всегда ждала окончания воспроизведения голосовой подсказки, а не просто ставила ее в очередь - это делает все НАМНОГО проще. Вам по-прежнему потребуются очередь в памяти и пул выполнения, чтобы внутреннюю интеграцию можно было выполнять в фоновом режиме.

person Jerry Jeremiah    schedule 16.11.2013