Введение
В этой статье мы рассмотрим создание голосового приложения, которое считывает последовательность цифр, введенных пользователем через номеронабиратель, а затем подтверждает корректность ввода, проигрывая абоненту введенные цифры. Согласитесь, это довольно частая задача в порталах телефонного самообслуживания.
Наше приложение будет выполнять эту задачу, используя 3CX Call Flow Designer. Приложение работает следующим образом:
- 3CX CFD сообщает: Введите ваш номер пользователя
- Пользователь набирает 1234
- 3CX CFD сообщает: Введенный номер пользователя 1234. Для подтверждения нажмите 1, для повторного ввода нажмите 2.
Поскольку воспроизведение цифр может потребоваться в различных частях нашего приложения, вынесем его в отдельный пользовательский компонент. CFD позволяет создавать такие пользовательские компоненты.
Напомним, что в предыдущих статьях мы рассмотрели создание CFD приложения для исходящего обзвона (по завершении обзвона можно отсылать отчет, используя компонент Email Sender), работу CFD с базами данных (которые также можно использовать для получения номера абонента), маршрутизацию входящих вызовов в зависимости от времени суток (которую можно комбинировать с исходящим обзвоном) и отправку e-mail сообщения (например, для уведомления о заказе по телефону).
Обратите внимание — среда разработки 3CX CFD поставляется бесплатно. Но голосовые приложения будут выполняться только на 3CX редакции Pro и Enterprise. Скачать CFD можно отсюда.
Демо-проект этого голосового приложения поставляется вместе с дистрибутивом 3CX CFD и находится в папке Documents\3CX Call Flow Designer Demos. Приступим.
Создание проекта
Для создания проекта CFD перейдите в File > New > Project, укажите папку размещения проекта и его имя, например, «PlayDigitsDemo».
Создание пользовательского компонента
Создаваемый компонент будет получать последовательность цифр от пользователя и последовательно проигрывать их.
Для создания компонента в окне Project Explorer кликните правой кнопкой мыши на имени проекта, выберите New Component и назовите его PlayDigits.
Затем кликните на компоненте PlayDigits.comp и в разделе Properties Window нажмите кнопку рядом с коллекцией Variables. Добавьте две переменные — Digits и Index. Переменная Digits — принимает цифры, которые компонент затем проигрывает. Переменная Index — внутренняя, она позволяет компоненту переходить от цифры к цифре.
Для добавления переменных нажмите кнопку Add, чтобы добавить переменную и измените ее имя (свойство Name) на Digits. Переменная Digits должна иметь следующие свойства: Accessibility: ReadWrite, Initial Value: , Scope: Public. Еще раз нажмите кнопку Add, добавьте новую переменную и измените ее имя на Index. Переменная Index должна иметь следующие свойства: Accessibility: ReadWrite, Initial Value: 0, Scope: Private
Теперь займемся архитектурой компонента. Мы будем использовать компонент Loop для перебора последовательности цифр (цикла). В компонент Loop добавим компонент Prompt Playback для воспроизведения очередной цифры в последовательности. В этот же компонент Loop добавим компонент Increment Variable, который будет увеличивать значение переменной Index. Такая конструкция позволит последовательно воспроизвести все цифры, введенные пользователем.
Создание цикла
- Перетащите компонент Loop в основное окно среды разработки.
- В окне Properties измените имя компонента на digitsLoop
Выберите компонент digitsLoop и в его свойстве Condition укажите строку
LESS_THAN(callflow$.Index,LEN(callflow$.Digits)).
Это выражение повторяет цикл до тех пор, пока переменная Index (callflow$.Index) меньше количества введенных пользователем цифр LEN(callflow$.Digits).
Воспроизведение сообщений
- Прежде всего нам необходимы звуковые файлы, соответствующие каждой цифре. Подготовьте и скопируйте файлы 0.wav, 1.wav и т.д. до 9 в папку Audio вашего проекта.
- Перетащите компонент Prompt Playback в основное поле приложения на компонент Loop.
- Измените имя компонента на playDigit.
- Выберите этот компонент и в окне свойств нажмите на кнопку возле коллекции Prompts, чтобы открыть редактор набора звуковых сообщений Prompt Collection Editor.
- Нажмите кнопку Add и измените тип на Dynamic Audio File Prompt
В поле Audio File Expression введите строку
CONCATENATE(MID(callflow$.Digits,callflow$.Index,1),".wav").
Выражение использует цифру текущей итерации и объединяет ее с расширением файла (строкой) .wav. Таким образом, абоненту воспроизводится соответствующая цифра.
Компонент увеличения номера переменной
- Перетащите компонент Increment Variable на компонент Loop, ниже компонента playDigit
Измените имя компонента на incrementIndex
Для свойства VariableName укажите выражение
callflow$.Index
Цикл выполнения будет иметь следующий вид:
Наш компонент готов. Теперь мы будем вызывать его из основного приложения.
Вызов компонента для воспроизведения цифр
После того, как пользовательский компонент готов, задействуем его в нашем приложении:
- В окне Project Explorer кликните Main.flow, чтобы открыть основное приложение
- Добавьте компонент User Input, который будет запрашивать ввод от пользователя. Переименуйте его в requestInput и добавьте заранее подготовленное сообщение пользователю о необходимости ввода.
- В ветвлении Valid Input из окна User Defined Components добавьте созданный пользовательский компонент PlayDigits
Переименуйте его в playEnteredDigits
Выберите его и в свойстве Digits укажите следующее выражение
requestInput.Buffer
Запрашиваемые цифры будут сперва помещаться в буфер, а затем проигрываться пользователю. Готовое приложение будет иметь примерно такой вид:
Компиляция и установка приложения на сервер 3CX
Голосовое приложение готово! Теперь его следует скомпилировать и загрузить на сервер 3CX. Для этого:
- Перейдите в меню Build > Build All, и CFD создаст файл PlayDigitsDemo.tcxvoiceapp.
- Перейдите в интерфейс управления 3CX, в раздел Очереди вызовов. Создайте новую Очередь вызовов, укажите название и добавочный номер Очереди, а затем установите опцию Голосовые приложения и загрузите скомпилированный файл.
- Сохраните изменения в Очереди вызовов. Голосовое приложение готово к использованию.
Заключение
Наше приложение решает конкретную задачу, однако важно отметить возможность инкапсулировать определенную логику работы в отдельный пользовательский компонент. Это весьма мощный механизм, предлагающий ряд преимуществ:
- Ускорение разработки приложения благодаря повторному использованию уже созданных компонентов.
- Упрощение структуры основного приложения и предотвращение разрастания архитектуры приложения до размера, которым уже будет сложно управлять.
- Голосовое приложения получается понятным и легко изменяемым.
По этому же принципу мы можем создавать пользовательские компоненты, проигрывающие время и даты, делающие валидацию ввода пользователя и т.п.