Глава 14

Интерактивное голосовое меню

«Однажды Алиса подошла к развилке дорог и увидела Чеширского Кота.

Скажите, пожалуйста, какую дорогу мне выбрать? – спросила она.

А куда ты хочешь попасть? – ответил Кот вопросом на вопрос.

Не знаю, – призналась Алиса.

Тогда все равно, куда идти, – изрек Кот»

– Льюис Кэрролл

В этой главе мы поговорим об IVR. Если вам нужен автосекретарь мы также написали главу для этого (Глава 12). Термин IVR часто неправильно используется для обозначения автосекретаря, но это две совершенно разные вещи.1

Что такое IVR?

Цель системы интерактивного голосового меню (IVR) – принимать входные данные от вызывающего абонента, выполнять действие на основе этого ввода (обычно, искать данные во внешней системе, такой как база данных) и возвращать результат вызывающему.2 Традиционно системы IVR были сложными, дорогими и раздражающими в реализации. Asterisk меняет все это.

Asterisk размывает линии между традиционными УАТС и системами IVR. Сила и гибкость диалплана Asterisk приводят к системе, в которой почти каждый внутренний номер можно рассматривать как IVR в традиционном смысле этого термина.

Компоненты IVR

Самые основные элементы IVR очень похожи на те, что у автосекретаря, хотя цель другая. Нам нужно, по крайней мере, передать одно уведомление вызывающему, в котором сообщить что ожидает от него IVR; метод получения ввода от вызывающего, логика проверки, что ответ вызывающего абонента является допустимым вводом, логика определения того, каким должен быть следующий шаг IVR, и, наконец, механизм хранения ответов, если они действительны. Мы можем думать об IVR как о дереве решений, хотя у него не должно быть ветвей. Например, опрос может предоставлять точно такой же набор подсказок каждому вызывающему абоненту, независимо от того, какие варианты выбирают вызывающие, и единственная логика маршрутизации связана с тем, являются ли набранные ответы действительными для вопросов.

С точки зрения абонента, каждый IVR должен начинаться с подсказки. Это начальное приглашение сообщит вызывающему абоненту для чего нужен IVR и попросит вызывающего абонента сделать первый ввод. Мы обсудили подсказки в службе автосекретаря в Главе 15. Позже мы создадим диалплан, который позволит вам лучше управлять несколькими голосовыми подсказками.

Второй компонент IVR представляет собой способ приема ввода от абонента. Напомним, что в Главе 15мы обсудили приложения Background() и WaitExten() для получения нового номера. Хотя вы можете создать IVR, используя Background() и WaitExten() гораздо проще и практичнее использовать приложение Read(), которое обрабатывает как приглашение, так и захват ввода. Приложение Read() было разработано специально для использования с системами IVR. Его синтаксис выглядит следующим образом:

Read(variable[,filename[&filename2…]][,maxdigits][,option][,attempts][,timeout])

Аргументы описаны в Таблице 17-1.

Таблица 17-1. Приложение Read()

Аргумент Назначение
variable Переменная, в которой хранится ответ абонента. Рекомендуется присвоить каждой переменной в IVR имя, аналогичное приглашению, связанному с этой переменной. Это поможет позже, если по каким-то причинам или из-за простоты использования потребуется изменить порядок шагов IVR. Именование переменных var1, var2 и т.д., может показаться легким в краткосрочной перспективе, но позже в вашем жизненном цикле это сделает исправление ошибок более сложным.
prompt Файл (или список файлов, разделенных символом &) воспроизводимый абоненту с запросом ввода. Не забудьте опустить расширение формата в конце каждого имени файла.
maxdigits Максимальное количество символов для ввода. В случае вопросов “да/нет” и “множественный выбор” рекомендуется ограничить это значение 1. В случае более длинных значений, абонент всегда может прекращать ввод, нажимая клавишу #.
options s (skip – пропустить) Немедленно выйти из канала, если на него не ответили. i (indication – индикация) Вместо приглашения воспроизводить сигнал индикации (например, гудок). n (no answer – нет ответа) Читать ввод цифр абонента, даже если еще не ответили. attempts Количество раз для воспроизведения подсказки. Если абонент не может ничего ввести, приложение Read() может автоматически запросить пользователя. По умолчанию используется одна попытка. timeout Количество секунд, в течение которых абонент должен ввести свои данные. Значение по умолчанию в Asterisk равно 10 секундам, хотя его можно изменить для одного приглашения с помощью этой опции или для всего сеанса, присвоив значение с помощью функции диалплана TIMEOUT(response).

Как только ввод получен – он должен быть проверен. Если вы не подтвердите ввод, вы, скорее всего, обнаружите абонентов, жалующихся на нестабильное приложение. Недостаточно обрабатывать вводимые вами значения; вам также необходимо обрабатывать значения, которые вы не ожидаете. Например, вызывающие могут расстраиваться и набирать 0, находясь в вашем IVR; если вы хорошо поработали, вы будете обрабатывать его грамотно и связывать их с кем-то, кто сможет им помочь или предоставить полезную альтернативу. Хорошо спроектированное IVR (как и любая программа) будет пытаться предугадать все возможные входные данные и предоставить механизмы для грамотного управления этим вводом.

Как только ввод подтвержден, вы можете отправить его на внешний ресурс для обработки. Это можно сделать с помощью запроса к базе данных, представления в URI, программы AGI или многих других. Это внешнее приложение должно привести к результату, который вы передадите обратно абоненту. Это может быть подробный результат, например «Баланс вашего счета …» или простое подтверждение, например «Ваша учетная запись была обновлена». Мы не можем думать о каком-либо реальном случае, когда какой-то результат возвращать абоненту не требуется.

Иногда IVR может иметь несколько этапов, поэтому результат может включать запрос дополнительной информации от абонента, чтобы перейти к следующему шагу IVR.

Можно разработать очень сложные системы IVR с десятками или даже сотнями возможных путей. Мы уже говорили об этом раньше, и мы скажем это снова: людям не нравится разговаривать с вашей телефонной системой, независимо от того, насколько она умна. Держите свою IVR простой для ваших абонентов, и они, скорее всего, получат от этого какую-то выгоду.

Совершенно вкусная IVR

Отличный пример IVR, который люди любят использовать – это тот, который используют многие службы для доставки пиццы: когда вы звоните, чтобы разместить свой заказ, IVR ищет ваш номер телефона и говорит: “Если вы хотите точно такой же заказ, как в прошлый раз, нажмите 1.”

Это все, что оно делает, и это прекрасно.

Очевидно, что эти компании могли бы разработать более сложные IVR, которые позволили бы вам выбрать каждую деталь вашего пирога (”для семеричной корочки нажмите 7″), но сколько нетрезвых, голодных клиентов могли бы успешно перемещаться по чему-то подобному в 3 часа ночи?

Лучшие IVR – это те, которые требуют наименьшего ввода от вызывающего абонента. Жми кнопку 1 и твоя …ца уже в пути! О, е!

Соображения по проектированию IVR

При разработке собственного IVR есть некоторые важные вещи, которые необходимо иметь в виду. Мы собрали список вещей, которые нужно делать, и вещей, которые не нужно делать в вашем IVR.

Делать

  • Держать его простым.
  • Иметь возможность набрать 0, чтобы связаться с живым человеком.
  • Корректно обрабатывать ошибки

Не делать

  • Думать что IVR может полностью заменить людей.
  • Использовать IVR чтобы показать людям насколько вы умны.
  • Попробовать воспроизвести свой веб-сайт с помощью IVR.
  • Беспокоиться о создании IVR если вы не можете принять числовой ввод. Никто не хочет писать свое имя на клавиатуре телефона.3
  • Заставлять абонентов слушать рекламу. Помните, что они могут повесить трубку в любой момент, когда пожелают.

Модули Asterisk для построения IVR

«Фронтенд» IVR (части, которые взаимодействуют с абонентами) могут обрабатываться в диалплане. Можно построить систему IVR используя только диалплан (возможно, с помощью astdb для хранения и извлечения данных); однако вам, как правило, нужно будет общаться с чем-то внешним по отношению к Asterisk («бекенд» IVR).

CURL

Функция диалплана CURL() в Asterisk позволяет охватывать целые веб-приложения одной строкой кода диалплана. Мы будем использовать его в нашем примере IVR в этой главе позже.

Хотя вы обнаружите, что CURL() сама по себе проста в использовании, для создания веб-приложения потребуется опыт работы с веб-разработкой.

func_odbc

Используя func_odbc в Asterisk можно разрабатывать чрезвычайно сложные приложения, используя не что иное, как код диалплана и поиск в базе данных. Если вы не сильный программист, но хорошо разбираетесь в диалплане и базах данных Asterisk, вам понравится func_odbc так же как и нам. Проверьте это в Главе 16.

AGI

Интерфейс шлюза Asterisk (Asterisk Gateway Interface) является такой важной частью интеграции внешних приложений с Asterisk, что мы предоставили ему свою собственную главу. Более подробную информацию вы можете найти в Главе 21.

AMI

Интерфейс Asterisk Manager (Asterisk Manager Interface) – это интерфейс сокета, который вы можете использовать для получения информации о конфигурации и статусе, запросить действия, которые необходимо выполнить и получать уведомления о событиях, происходящих с вызовами. Мы также написали целую главу о AMI. Дополнительную информацию вы можете найти в Главе 20.

Простой IVR используя CURL

Программа GNU/Linux cURL полезна для извлечения данных из URI. В Asterisk CURL() является функцией диалплана.

Мы будем использовать CURL() в качестве примера того, как может выглядеть очень простой IVR.Мы собираемся запросить наш внешний IP-адрес с http://www.whatismyip.org.

В действительности большинство приложений IVR будут намного сложнее. Даже большинство применений CURL() будут иметь тенденцию быть сложными, поскольку URI может возвращать массивный и очень переменный объем данных, подавляющее большинство которых будет непонятно Asterisk. Дело в том, что IVR – это не только диалплан; это также внешние приложения, которые запускаются диалпланом, которые выполняют настоящую работу IVR.

Прежде чем сможете использовать CURL(), вы должны убедиться что он установлен.

Установка модуля cURL

Установка cURL проста. Если он не был в вашей системе, когда вы в последний раз компилировали Asterisk, после его установки вам необходимо перекомпилировать Asterisk чтобы он мог найти зависимости cURL и скомпилировать модуль func_curl.so.

На RHEL:

$ sudo yum -y install libcurl-devel

В Ubuntu:

$ sudo apt-get install libcurl4-openssl-dev

Диалплан

Диалплан для нашего примера IVR очень прост. Функция CURL() будет извлекать наш IP-адрес с http://www.whatismyip.org, а затем SayAlpha() будет сообщать результаты вызывающему:

exten => *764,1,Verbose(2, Run CURL to get IP address from whatismyip.org)

same => n,Answer()

same => n,Set(MyIPAddressIs=${CURL(http://www.whatismyip.org/)})

same => n,SayAlpha(${MyIPAddressIs})

same => n,Hangup()

Просто до невозможности. В традиционной IVR-системе такие вещи могут занять несколько дней.

Приложение для записи приглашений

В Главе 12 для быстрой записи приглашений мы создали простой кусок диалплана. Он был довольно ограниченным, так как записывал только одно имя файла, и, таким образом, для каждого приглашения файл нужно было скопировать до того, как будет записано новое приглашение. Здесь мы расширим до полного меню для записи приглашений:

[prompts]

exten => s,1,Answer

exten => s,n,Set(step1count=0) ; Инициализация счетчиков

; Если мы не получаем ответа после 3 раз – прекращаем спрашивать

same => n(beginning),GotoIf($[${step1count} > 2]?end)

same => n,Read(which,prompt-instructions,3)

same => n,Set(step1count=$[${step1count} + 1])

; Все подсказки должны быть длиной 3 цифры

same => n,GotoIf($[${LEN(${which})} != 3]?beginning)

same => n,Set(step1count=0) ; Успешный ответ; сброс счетчиков

same => n,Set(step2count=0)

same => n(step2),Set(step2count=$[${step2count} + 1])

same => n,GotoIf($[${step2count} > 2]?beginning) ; Нет ответа после 3

;попыток

; Если файл не существует, то не спрашивать воспроизводить ли его

same => n,GotoIf($[${STAT(f,${which}.wav)} = 0]?recordonly)

same => n,Background(prompt-tolisten)

same => n(recordonly),Background(prompt-torecord)

same => n,WaitExten(10) ; Ожидать 10 секунд для ответа

same => n,Goto(step2)

exten => 1,1,Set(step2count=0)

same => n,Background(${which})

same => n,Goto(s,step2)

exten => 2,1,Set(step2count=0)

same => n,Playback(prompt-waitforbeep)

same => n,Record(${CHANNEL(uniqueid)}.wav)

same => n(listen),Playback(${CHANNEL(uniqueid)})

same => n,Set(step3count=0)

same => n,Read(saveornot,prompt-1tolisten-2tosave-3todiscard,1)

same => n,GotoIf($[“${saveornot}” = “1”]?listen)

same => n,GotoIf($[“${saveornot}” = “2”]?saveit)

same => n,System(rm -f /var/lib/asterisk/sounds/${CHANNEL(uniqueid)}.wav)

same => n,Goto(s,beginning)

same => n(saveit),System(mv -f ${CHANNEL(uniqueid)}.wav ${which}.wav)

same => n,Playback(prompt-saved)

same => n,Goto(s,beginning)

В этой системе имя приглашения больше не является описательным; вместо этого оно является числом. Это означает что вы можете записать гораздо больше разнообразных приглашений используя тот же механизм, но компромисс состоит в том, что ваши приглашения больше не будут иметь описательных имен.

Распознавание речи и преобразование текста в речь

Хотя в большинстве случаев система IVR представляет собой предварительно записанные подсказки вызывающему абоненту и принимает входные данные посредством клавиатуры, также возможно: a) генерировать подсказки искусственно, общеизвестно как преобразование текста в речь; и b) принимать устные вводы через механизм распознавания речи.

Хотя концепция умения вести интеллектуальную беседу с машиной – это то, что писатели-фантасты обещали нам много лет назад, реальная наука об этом остается сложной и подверженной ошибкам. Несмотря на свои удивительные возможности, компьютеры плохо подходят для понимания тонких нюансов человеческой речи.

Сказав это, следует отметить, что за последние 50 лет или около того были достигнуты удивительные успехи как в области преобразования текста в речь, так и в области распознавания речи. Хорошо продуманная система, созданная для очень конкретной цели, может работать очень хорошо.

Несмотря на то, что говорят специалисты по маркетингу, ваш компьютер по-прежнему не может с вами разговаривать, и вам нужно помнить об этом, если вы рассматриваете любую систему, которая сочетает вашу телефонную систему с этими технологиями.

Text-to-Speech

Text-to-speech (также известный как синтез речи) требует, чтобы система могла искусственно строить речь из сохраненных данных. Хотя было бы хорошо, если бы мы могли просто назначить звук букве и заставить компьютер воспроизводить каждый звук, когда он читает буквы, письменный английский язык не является полностью фонетическим.4

Хотя на первый взгляд идея говорящего компьютера очень привлекательна, на самом деле она имеет ограниченную полезность. Более подробную информацию об интеграции текста в речь с Asterisk можно найти в Главе 18.

Распознавание речи

Как только мы убедили компьютеры говорить с нами, мы, естественно, захотим поговорить с ними.5 Любой, кто пытался выучить иностранный язык, может начать осознавать сложность обучения компьютера понимать слова; однако распознавание речи также должно учитывать тот факт, что прежде чем компьютер сможет попытаться понять слова, он должен сначала преобразовать аудио в цифровой формат. Это больший вызов чем можно было бы подумать на первый взгляд. Например, как люди, мы, естественно, способны распознавать речь в отличие от, скажем, звука лающей собаки или автомобильного гудка. Для компьютера это очень сложная вещь. Кроме того, для системы распознавания речи на основе телефона звук, который принимается, всегда будет иметь очень низкую точность, и, таким образом, компьютер будет иметь гораздо меньше информации для работы. 6

Asterisk не имеет встроенного распознавания речи, но есть много сторонних пакетов распознавания речи, которые интегрируются с Asterisk. Многое из этого выходит за рамки данной книги, поскольку эти приложения являются внешними по отношению к Asterisk.

Заключение

Asterisk стал чрезвычайно популярным в качестве платформы IVR. Вся эта книга, во многих отношениях, учит вас навыкам, которые могут быть применены к развитию IVR. В то время как средства массовой информации действительно обращают внимание только на Asterisk как на “свободную УАТС”, реальность такова, что Asterisk спокойно штурмует индустрию IVR. В любой организации солидного размера очень вероятно, что системные администраторы Linux используют Asterisk для решения телекоммуникационных проблем, которые ранее были неразрешимыми или невероятно дорогими. Это тайная революция, но не менее значительная по своей относительной неизвестности.

Если вы находитесь в бизнесе IVR, вам нужно узнать Asterisk.

1Мы подозреваем, что это потому, что ”ИВР“ намного легче сказать, чем “автосекретарь”.

2В отличие от автосекретаря, целью которого является лишь маршрутизация вызовов.

3Особенно если это что-то вроде Ван Меггелен.

4И многие другие письменные языки вовсе не являются фонетическими.

5На самом деле, большинство из нас разговаривает со своими компьютерами, но редко когда вежливо.

6Если распознавание речи должно происходить с мобильного телефона в шумном конференц-зале, то это становится практически невозможным.

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices