Skip to the content.

Глава 14. Автосекретарь

Я не отвечаю на звонки. У меня всегда такое чувство, что на другом конце провода кто-то есть.

– Фред Коуплз

Во многих УАТС, как правило, есть система меню для автоматического ответа на входящие вызовы, которая позволяет абонентам направлять себя на различные расширения и ресурсы в системе с помощью выбора меню. Эта система известна в телекоммуникационной отрасли как автосекретарь (АС). АС, как правило, предоставляет следующие возможности:

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

АС это не IVR

В open source телеком-сообществе вы часто услышите термин IVR, используемый для описания автосекретаря.1 Однако в телекоммуникационной отрасли в течение многих десятилетий до появления VoIP или УАТС с открытым исходным кодом IVR отличался от AС. По этой причине, когда вы говорите с кем-то, имеющим многолетний опыт работы в области телекоммуникаций, о любом виде телекоммуникационного меню, вы должны убедиться, что говорите об одном и том же. Для специалиста по телекоммуникациям термин IVR подразумевает относительно комплексную и сложную в разработке (и последующе затратную), в то время как AС - это простая и недорогая вещь, которая является общей для большинства АТС.

В этой главе мы поговорим о создании автосекретаря. IVR мы обсудим в Главе 16.2

Проектирование вашего АС

Самая распространенная ошибка новичков при проектировании АС - излишняя сложность. В то время как может быть много радости и чувства выполненного долга в создании многоуровневого AС с десятками отличных вариантов и кучами действительно интересных подсказок, ваши абоненты имеют другую повестку дня. Люди звонят по телефону в первую очередь потому, что хотят с кем-то поговорить. В то время как люди привыкли к реальности автосекретарей (и в некоторых случаях они могут ускорить процесс), по большей части люди предпочитают говорить с кем-то живым. Это означает, что есть два основных правила, которых должен придерживаться каждый АС:

Прежде чем вы начнете кодировать свой AС, разумно его спроектировать. Вам нужно будет определить поток вызовов и необходимо будет указать подсказки, которые будут воспроизводиться на каждом шаге. Программные инструменты для построения диаграмм могут быть полезны для этого, но нет необходимости фантазировать. Таблица 14-1 предоставляет хороший шаблон для базового AС, который будет делать то, что вам нужно.

Таблица 14-1. Базовый автосекретарь

Шаг или выбор Образец приглашения Примечание Имя файлаa
Приветствие - рабочее время Спасибо,что позвонили в компанию ABC. Дневное приветствие. Воспроизводится сразу после того, как система отвечает на вызов. daygreeting.wav
Приветствие - нерабочеее время Спасибо,что позвонили в компанию ABC. Наш офис сейчас закрыт. Ночное приветствие. Как и выше, но играет в нерабочее время. nightgreeting.wav
Главное меню Если вы знаете внутренний номер оператора, с которым хотите связаться, пожалуйста, введите его сейчас. Для свзи с отделом продаж, пожалуйста, нажмите 1; для отдела обслуживания, нажмите 2; для нашего каталога компании, нажмите #. Для получения информации о нашем адресе и факсе нажмите кнопку 3. Чтобы повторить это сообщение - нажмите 9, или оставайтесь на линии, или нажмите 0, чтобы связаться с оператором. Подсказка главного меню. Играет сразу после приветствия. Для вызывающего абонента приветствие и главное меню звучат как единое приглашение; однако в системе полезно держать эти подсказки раздельно. mainmenu.wav
1 Пожалуйста, подождите пока мы переключим ваш звонок. Перевод на очередь sales. holdwhileweconnect.wav
2 Пожалуйста, подождите пока мы переключим ваш звонок. Перевод на очередь support. holdwhileweconnect.wav
# n/a Запуск приложения Directory() n/a
3 Наш адрес [address]. Наш номер факса [fax number], и тд. Воспроизведение записи, содержащей информацию об адресе и факсе. Возврат вызывающего абонента к подсказке меню после завершения. faxandaddress.wav
0 Соединяем со специалистом. Пожалуйста, подождите. Перевод на приемную/оператора. transfertoreception.wav
9 n/a Повтор. Воспроизведение подсказки меню (но не приветствия). n/a
t n/a Тайм-аут. Если абонент не сделал выбора - считайте, что он набрал 0 (или в некоторых случаях повторите подсказку). n/a
i Вы сделали неверный выбор. Пожалуйста, попробуйте еще раз. Абонент нажал неверную цифру: воспроизведение подсказки меню (но не приветствия). invalid.wav
_XXXb n/a Перевод вызова на набранный номер. holdwhileweconnect.wav

aЭти файлы пока нигде не существуют. Мы используем их в качестве примеров.

bЭто совпадение шаблонов должно соответствовать вашему диапазону расширений.


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

Приветствие

Первое, что слышит абонент - это на самом деле две подсказки.

Первая подсказка - это приветствие. Единственное, что приветствие должно сделать - это поприветствовать абонента. Примером приветствия может быть “Спасибо, что позвонили Брайанту, Ван Меггелену и партнерам”, “Добро пожаловать в школу мудрости и дизайна футболок Лейфа” или “Вы позвонили в офисы адвокатов Дьюи, Читама и Хоуи.” Вот именно - выбор для звонящего придет позже. Это позволяет записывать различные приветствия без необходимости записывать все новое меню. Например, в течение нескольких недель каждый год вы можете делать, чтобы ваше приветствие говорило “приветствие сезона” или что-то еще, но ваше меню не нужно будет менять. Кроме того, если вы хотите воспроизвести другую запись в нерабочее время (“Спасибо за звонок. Наш офис сейчас закрыт.”), то можете использовать разные приветствия, но сердце меню останется прежним. Наконец, если вы хотите иметь возможность вернуть абонентов в меню из другой части системы, то не захотите, чтобы они снова услышали приветствие.

Главное меню

Приглашение главного меню - это место, где вы сообщаете своим абонентам о доступных им вариантах выбора. Вы должны проговаривать его как можно быстрее (без спешки или глупостей).3 Когда вы записываете выбор, всегда сообщайте пользователям о действии, которое будет предпринято, прежде чем дать им возможность выполнить это действие с помощью набора цифр. Поэтому не говорите “нажмите 1 для продаж“, а скорее скажите: “для продаж нажмите 1”. Причина этого заключается в том, что большинство людей не обратят должного внимания на подсказку, пока не услышат интересующий их выбор. Как только они услышат свой выбор, то будут в полном внимании и им можно будет сообщить какую кнопку нажать, чтобы направить их туда, куда требуется.

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

Выбор 1

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

Выбор 2

Вариант 2 будет технически идентичен варианту 1. Только место назначения будет другим. Этот выбор переместит абонентов в очередь support.

Выбор #

Хорошо иметь возможность выбора справочника как можно ближе к началу записи. Многие люди будут использовать каталог, если знают что тот существует, но им не требуется прослушивать все меню, чтобы узнать о нем. Нетерпеливые люди будут нажимать 0, поэтому чем раньше вы расскажете им о справочнике, тем больше шансов, что они им воспользуются, и тем самым уменьшится нагрузка на вашего секретаря.

Выбор 3

Если у вас есть опция, которая ничего не делает, кроме воспроизведения записи абоненту (например, адрес и факс), вы можете оставить весь код для неё в том же контексте, что и меню, и просто вернуть абонента в главное меню в конце записи. В общем, такие варианты не очень полезны, как нам хотелось бы думать, поэтому в большинстве случаев вы, вероятно, захотите оставить её.

Выбор 9

Очень важно дать звонящему возможность услышать подсказку еще раз. Многие люди не будут обращать внимания на все меню, и если вы не дадите им возможность услышать меню снова, они, скорее всего, нажмут 0.

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

Выбор 0

Как было сказано ранее, и нравится вам это или нет, это выбор, который предпочтут многие (возможно, большинство) ваши абоненты. Если вы действительно не хотите, чтобы кто-то отвечал на эти звонки, то можете отправлять вызовы в почтовый ящик, но мы не рекомендуем это делать. Если вы занимаетесь бизнесом, многие из ваших абонентов будут вашими клиентами. Вы же хотите, чтобы им было легко связаться с вами. Доверьтесь нам.

Тайм-аут

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

Invalid (Неверно)

Люди совершают ошибки. Это нормально. Неверный обработчик сообщит им о том, что они выбрали, не является допустимым вариантом, и вернет их в приглашение меню, чтобы они могли повторить попытку выбора. Обратите внимание, что вы не должны воспроизводить приветствие снова, только приглашение главного меню.

Вызов добавочного номера

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

Примечание

Хотя Asterisk может обрабатывать перекрытие между вариантами меню и добавочными номерами (например, у вас может быть выбор меню `1` и расширения от 100 до 199), лучше избегать этого перекрытия. В противном случае диалплану всегда придется ожидать межразрядный тайм-аут всякий раз, когда кто-то нажимает `1`, потому что не будет знать, планируют ли набрать добавочный номер 123. Межразрядный тайм-аут - это задержка, которую система допускает между цифрами, прежде чем предполагает, что было введено все число. Этот таймер гарантирует, что абоненты имеют достаточно времени для набора многоразрядного расширения, но он также вызывает задержку в обработку одноразрядных вводов.

Создание вашего АС

После того, как вы разработали свой АС, есть три вещи, которые вам нужно сделать, чтобы заставить его работать должным образом:

Начнем с того, что поговорим о записях.

Запись подсказок

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

Asterisk очень гибок в этом отношении и может работать со многими различными аудиоформатами. Мы обнаружили, что в целом наиболее лучшим форматом для использования является WAV. Файлы, сохраненные в этом формате, могут быть самыми разными, но только один тип WAV-файла будет работать с Asterisk: файлы должны быть закодированы в 16-битном, 8000 Гц, моно-формате.

Рекомендуемый формат файла подсказки

Формат WAV, который мы рекомендуем, удобен для системных подсказок, потому что он может быть легко преобразован в любой другой формат, который могут использовать ваши телефоны, без потери или искажения, и почти любой компьютер может воспроизводить его без специального программного обеспечения. Таким образом, Asterisk может не только легко обрабатывать файл, но и легко будет работать с ним на ПК (что может быть полезно). Asterisk может обрабатывать и другие форматы файлов, и в некоторых случаях они могут быть более подходящими для ваших нужд, но в целом мы считаем, что 16-битные 8 кГц WAV файлы являются самыми простыми в работе и, в большинстве случаев, наилучшего качества.

Есть два основных способа ввести подсказки в систему. Один из них заключается в записи звуковых файлов в студии или на ПК, а затем переместить эти файлы в систему. Второй способ заключается в записи подсказок непосредственно в системе с помощью телефонного аппарата. Мы предпочитаем второй способ.

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

Примечание

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

Использование диалплана для создания записей

Самый простой способ записи подсказок-это использование приложения Record().

Добавьте эту новую подпрограмму в нижнюю часть вашего файла extensions.conf:

[subRecordPrompt]
exten => 500,1,Playback(vm-intro)
   same => n,Record(daygreeting.wav)
   same => n,Wait(2)
   same => n,Playback(daygreeting)
   same => n,Hangup

exten => 501,1,Playback(vm-intro)
   same => n,Record(mainmenu.wav)
   same => ... etc ... (создайте код диалплана для каждой подсказки, которую необходимо записать)

Примечание

Чтобы использовать этот контекст, вам нужно будет включить его в контекст, в котором ваши устройства входят в диалплан. Поэтому в контекст [LocalSets] вы должны добавить строку include=>UserServices. В рабочей среде вам, вероятно, понадобится пароль, чтобы кто попало не записывали подсказки.

Эта подпрограмма воспроизводит запрос, издает звуковой сигнал, делает запись и воспроизводит эту запись.6 Примечательно, что приложение Record() принимает в качестве аргумента все имя файла, в то время как приложение Playback() исключает расширение типа файла (.wav, .gsm и др.). Это происходит потому, что приложение Record() должно знать, в каком формате должна быть сделана запись, а Playback() - нет. Вместо этого Playback() автоматически выбирает наилучший доступный аудиоформат, основываясь на кодеке, используемом вашим телефоном, и форматах, доступных в папке sounds (например, если у вас есть daygreeting.wav и daygreeting.gsm в папке sounds, Playback(daygreeting) выберет тот, который требует наименьших усилий процессора для воспроизведения вызывающему абоненту).

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

Вот диалплан (выделен жирным шрифтом), который создаст все наши подсказки. Поместите его туда, куда вы хотите, в контекст [sets]:


exten => _4XX,1,Noop(User Dialed ${EXTEN})
  same => n,Answer()
  same => n,SayDigits(${EXTEN})
  same => n,Hangup()

exten => 500,1,GoSub(subRecordPrompt,${EXTEN},1(daygreeting) exten => 501,1,GoSub(subRecordPrompt,${EXTEN},1(nightgreeting) exten => 502,1,GoSub(subRecordPrompt,${EXTEN},1(mainmenu) exten => 503,1,GoSub(subRecordPrompt,${EXTEN},1(holdwhileweconnect) exten => 504,1,GoSub(subRecordPrompt,${EXTEN},1(faxandaddress) exten => 505,1,GoSub(subRecordPrompt,${EXTEN},1(transfertoreception) exten => 506,1,GoSub(subRecordPrompt,${EXTEN},1(invalid) exten => 507,1,GoSub(subRecordPrompt,${EXTEN},1(holdwhileweconnect)
exten => _555XXXX,1,Answer() same => n,SayDigits(${EXTEN}) exten => _55512XX,1,Answer() same => n,Playback(tt-monkeys)

Записи (они же подсказки) будут помещены в директорию /var/lib/asterisk/sounds. Вы можете поместить их в другое место, если вы укажете полный путь при записи и воспроизведении (и убедитесь, что каталог, в который вы их поместили, доступен пользователю asterisk). В производственной системе их следует размещать в другом месте, чтобы отделить пользовательские приглашения от общих. На данный момент мы не будем усложнять и поместим их в ту же директорию, что и системные подсказки.

Диалплан

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

Вы можете поместить этот код в конце контекста [TestMenu], прямо перед вашими подпрограммами:

[MainMenu]

exten => s,1,Verbose(1, Caller ${CALLERID(all)} has entered the auto attendant)
    same => n,Answer()

; this sets the inter-digit timer
    same => n,Set(TIMEOUT(digit)=2)

; wait one second to establish audio
    same => n,Wait(1)

; Если с Пн-Пт с 9-17 переход на метку daygreeting
    same => n,GotoIfTime(9:00-17:00,mon-fri,*,*?daygreeting:afterhoursgreeting)

    same => n(afterhoursgreeting),Background(nightgreeting) ; ПРИВЕТСТВИЕ НЕРАБОЧЕГО ВРЕМЕНИ
    same => n,Goto(menuprompt)

    same => n(daygreeting),Background(daygreeting)   ; ДНЕВНОЕ ПРИВЕТСТВИЕ
    same => n,Goto(menuprompt)

    same => n(menuprompt),Background(mainmenu)  ; ПОДСКАЗКА ГЛАВНОГО МЕНЮ
    same => n,WaitExten(4)                      ; более 4 секунд скорее всего
                                                ; слишком много
    same => n,Goto(0,1)                         ; Считайте, что вызывающий нажал '0'

exten => 1,1,Verbose(1, Caller ${CALLERID(all)} has entered the sales queue)
    same => n,Goto(sets,610,1)     ; Очередь sales - смотри Главу 12 для подробностей

exten => 2,1,Verbose(1, Caller ${CALLERID(all)} has entered the service queue)
    same => n,Goto(sets,611,1)     ; Очередь support - смотри Главу 12 для подробностей

exten => 3,1,Verbose(1, Caller ${CALLERID(all)} has requested address and fax info)
    same => n,Background(faxandaddress)            ; Информация об адресе и факсе
    same => n,Goto(s,menuprompt)      ; Вернуть абонента к подсказке главного меню

exten => #,1,Verbose(1, Caller ${CALLERID(all)} is entering the directory)
    same => n,Directory(default)   ; Отправить абонента в каталог.
                                   ; Использовать InternalSets в качестве контекста набора

exten => 0,1,Verbose(1, Caller ${CALLERID(all)} is calling the operator)
    same => n,Goto(sets,611,1)     ; Очередь support - смотри Главу 12 для подробностей

exten => i,1,Verbose(1, Caller ${CALLERID(all)} has entered an invalid selection)
    same => n,Playback(invalid)
    same => n,Goto(s,menuprompt)

exten => t,1,Verbose(1, Caller ${CALLERID(all)} has timed out)
    same => n,Goto(0,1)

; Вы должны иметь шаблон соответствия для внутренних номеров,
; которые вы позволите набирать внешним абонентам
; НО НЕ ПРОСТО ВКЛЮЧИТЬ КОНТЕКСТ LocalSets
; ИНАЧЕ АБОНЕНТЫ СМОГУТ СОВЕРШАТЬ ЗВОНКИ ИЗ ВАШЕЙ СИСТЕМЫ.

; ЧТО БЫ ВЫ НИ ДЕЛАЛИ ЗДЕСЬ, ТЩАТЕЛЬНО ПРОВЕРЬТЕ, ЧТОБЫ УБЕДИТЬСЯ, ЧТО ВНЕШНИЕ АБОНЕНТЫ
; НЕ СМОГУТ СДЕЛАТЬ НИЧЕГО, КРОМЕ НАБОРА ВНУТРЕННИХ НОМЕРОВ

exten => _1XX,1,Verbose(1,Call to an extension starting with '1')
    same => n,Goto(sets,${EXTEN},1)

Доставка входящих звонков в АС

Любой вызов, поступающий в систему, будет входить в диалплан в контексте, определенном для канала, на который поступает вызов. Во многих случаях это будет контекст с именем [incoming] или [from-pstn], или что-то подобное. Вызовы будут поступать либо с добавочным номером (как в случае с DID), либо без него (как в случае с традиционной аналоговой линией).

Как бы ни назывался контекст и как бы ни назывался добавочный номер, вы будете отправлять каждый входящий вызов в меню.

[incoming] ; DID, приходящие в канал с
           ; context=incoming
exten => 4169671111,1,Goto(MainMenu,s,1)

В зависимости от того, как вы настраиваете входящие каналы, обычно будете использовать приложение Goto() для отправки вызова AС. Это гораздо аккуратнее, чем просто кодирование всего АС во входящем контексте.

Поскольку у нас в лаборатории7 нет больше входящих линий, мы создадим простое расширение, которое доставит нас к нашему новому модному АС:

exten => 613,1,Noop()
  same => n,Goto(MainMenu,s,1)
  same => n,Hangup()

И это все! Простой автосекретарь, которым легко управлять, и который справится с ожиданиями большинства абонентов.

IVR

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

Вывод

Автосекретарь может предоставить очень полезную услугу для абонентов. Однако, если он не разработан и хорошо реализован, то также может стать барьером для ваших абонентов, который может отпугнуть их. Потратьте время, чтобы тщательно спланировать свой АС и держать его простым.

  1. Это, скорее всего, потому, что "IVR" гораздо легче сказать, чем "автосекретарь".
  2. Следует отметить, что Asterisk - это отличный инструмент для создания IVR. Но также отлично подходит и для создания автосекретаря.
  3. При необходимости вы можете использовать программу редактирования звука, такую как Audacity, чтобы удалить тишину и даже немного ускорить запись.
  4. На самом деле, мы обычно не рекомендуем это в AС, потому что это добавляется к тому, что абонент должен слушать, и большинство людей все равно пойдет на сайт для получения такого рода информации.
  5. Если вы не являетесь экспертом в этих областях, в таком случае пойдите на это!
  6. Подсказка vm-intro не идеальна (она просит вас оставить сообщение), но она достаточно близка для наших целей. Инструкции по использованию по крайней мере верны: нажмите #, чтобы завершить запись. После того, как вы научились записывать подсказки можете вернуться назад, записать пользовательское приглашение и изменить приоритет 1, чтобы отразить более подходящие инструкции для записи собственных приглашений.
  7. А если Вы это делаете, то и в Вашей; поздравляю и, пожалуйста, будьте осторожны, плавая с акулами.
Глава 13. Состояния устройств Содержание Глава 15. Интеграция реляционной базы данных