IVR (Интерактивный голосовой ответ) — это интерактивный голосовой ответ, который мы называем голосовым меню телефона. Он может использовать предварительно записанный голос или TTS для автоматического ответа и обеспечения навигации по меню. Он в основном используется в системах колл-центров. В основном мы представляем функции IVR, предоставляемые FreeSWITCH.
Файл конфигурации по умолчанию системы IVR FreeSWITCH — conf/autoload_configs/ivr.conf.xml.
, который содержит все файлы XML в каталоге conf/ivr_menus/. Затем мы создаем файл конфигурации XML conf/ivr_menus/ivr.xml со следующим содержимым.
<include>
<menus>
<menu name="welcome"
greet-long="ivr/welcome.wav"
greet-short="ivr/welcom_short.wav"
invalid-sound="ivr/ivr-that_was_an_invalid_entry.wav"
exit-sound="voicemail/vm-goodbye.wav"
timeout="15000"
max-failures="3"
max-timeouts="3"
inter-digit-timeout="2000"
digit-len="4">
<entry action="menu-exec-app" digits="0" param="transfer 1000 XML default"/>
<entry action="menu-exec-app" digits="/^(10[01][0-9])$/" param="transfer $1 XML default"/>
</menu>
</menus>
</include>
В приведенной выше конфигурации сначала указываем, что название меню приветствуется, а значения остальных пунктов следующие:
Видно, что действия ivr в основном настраиваются в элементе записи. В приведенном выше примере кнопка 0 настраивается в первой записи, а приложение FreeSWITCH (передача) выполняется через меню-exec-app и маршрутизируется через него. Снова назначьте вызов правилу маршрутизации, вызываемый номер которого равен 1000. По умолчанию правилом является добавочный номер 1000.
Ключевое правило другой записи в меню — это регулярное выражение, что означает, что соответствующий ключ — это ввод значений 1001 ~ 1019. После успешного сопоставления ключу будет присвоен $1, а затем маршрутизация будет произведена снова. Например, если пользователь вводит ключ 1019, вызов будет назначен правилу маршрутизации, вызываемый номер которого равен 1019, при выполнении перевода. По умолчанию правилом является добавочный номер 1019.
Если входящий пользователь нажмет другие клавиши, появится сообщение об ошибке (звук, указанный в параметре valid-sound), поскольку соответствующий пункт меню не найден, и пользователю будет предложено войти повторно.
После установки вышеуказанного меню необходимо выполнить reloadxml в консоли, чтобы конфигурация вступила в силу.
После завершения настройки можно выполнить на консоли следующий тест (позвоните по номеру 1001 и после ответа войдите в меню ivr):
freeswitch> originate user/1001 &ivr(welcome)
После успешного прохождения теста вы можете настроить диалплан для перевода входящих звонков в меню и добавить расширение в диалплан (обратите внимание, что вам нужно добавить его в правильный контекст диалплана, если вы не уверены, в какой контекст его следует добавить to) , будет безопаснее добавить его как по умолчанию, так и по умолчанию):
<extension name="incoming_call">
<condition field="destination_number" expression="^777$">
<action application="answer" data=""/>
<action application="sleep" data="1000"/>
<action application="ivr" data="welcome"/>
</condition>
</extension>
Затем позвоните по номеру 777 для тестирования.
Благодаря приведенной выше конфигурации ivr.xml мы уже знаем, как настроить простой IVR. Далее мы настраиваем IVR со дополнительным меню.
<include>
<menus>
<menu name="main"
greet-long="ivr/main_welcome.wav"
greet-short="ivr/main_welcome_short.wav"
invalid-sound="ivr/ivr-that_was_an_invalid_entry.wav"
exit-sound="voicemail/vm-goodbye.wav"
timeout ="10000"
max-failures="3"
digit-len="4">
<entry action="menu-exit" digits="*"/>
<entry action="menu-sub" digits="2" param="sub"/>
<entry action="menu-exec-app" digits="0" param="transfer 1000 XML default"/>
</menu>
</menus>
</include>
<include>
<menus>
<menu name="sub"
greet-long="ivr/sub_welcome.wav"
greet-short="ivr/web_welcome_short.wav"
invalid-sound="ivr/ivr-that_was_an_invalid_entry.wav"
exit-sound="voicemail/vm-goodbye.wav"
timeout="15000"
max-failures="3"
max-timeouts="3"
inter-digit-timeout="2000"
digit-len="4">
<entry action="menu-exit" digits="*"/>
<entry action="menu-back" digits="6"/>
<entry action="menu-top" digits="7"/>
<entry action="menu-exec-app" digits="/^(10[01][0-9])$/" param="transfer $1 XML default"/>
</menu>
</menus>
</include>
Два IVR настроены выше,Именаmain
、sub
,Как следует из названия,main - главное меню,подменю, Давайте сначала представим действия в записи:
После настройки XML вам также необходимо выполнить команду reloadxml в консоли, чтобы конфигурация вступила в силу.
После завершения настройки вы можете выполнить следующий тест на консоли (все равно позвоните по номеру 1001 и войдите в меню ivr после ответа):
freeswitch> originate user/1001 &ivr(main)
После входа в главное меню мы можем нажать 2, чтобы войти в подменю. В подменю, если мы можем нажать 6, чтобы вернуться в предыдущее меню, нажмите 7, чтобы вернуться в главное меню. Однако, поскольку у нас есть только один уровень подменю. , здесь клавиши 6 и 7. Эффект тот же. Если читатели заинтересованы, вы можете настроить несколько подменю, чтобы проверить разницу между верхним и задним меню.
Однако мы также видели, что приведенный выше XML IVR чрезвычайно прост. В реальном бизнесе нам может потребоваться взаимодействовать с некоторыми внешними службами, например, выполнять запросы к базе данных, запрашивать веб-сервис и т. д., поэтому нам нужен более гибкий способ. настраиваем приложение IVR, здесь мы представляем IVR, реализованный с использованием Lua:
Модуль mod_lua FreeSWITCH поддерживает язык Lua. Поскольку Lua является встроенным языком и его можно легко встроить в программу, использование Lua приносит нам много удобства. Последний модуль уже поддерживает Lua 5.2. Далее мы используем Lua для реализации описанного выше WelcomeIVR.
local tts_engine = "tts_commandline"
local tts_voice = "zh-CN-XiaoxiaoNeural"
session:set_tts_params(tts_engine, tts_voice)
session:setVariable("tts_engine", tts_engine)
session:setVariable("tts_voice", tts_voice)
session:answer()
session:sleep(1000)
local digits = session:playAndGetDigits(1, 4, 3, 15000, "#", «Скажите: Добро пожаловать в использование интеллектуального голосового продукта Xiaoying Cherry, наберите добавочный номер напрямую. Чтобы проверить номер, наберите 0», "скажите: ошибка ввода", "^(0|10[0-1][0-9]$)", "digits", 2000)
if digits ~= "" and digits ~= nil then
if digits == "0" then
session:transfer("1000 XML default")
else
session:transfer(digits .. " XML default")
end
else
session:speak("До свидания")
end
Мы можем сохранить приведенный выше lua в каталог сценариев FreeSWITCH и назвать его Welcome.lua. После завершения настройки мы можем выполнить следующий тест на консоли (все еще вызывая 1001 и войдя в меню ivr после ответа).
freeswitch> originate user/1001 &lua(welcome.lua)
После ответа на звонок мы услышим приветственное сообщение, например: «Добро пожаловать в интеллектуальный голосовой продукт Xiaoying Cherry. Пожалуйста, наберите добавочный номер напрямую. Чтобы проверить номер, наберите 0. Как видите, мы не использовали записанный». на этот раз голосовой файл для приветственного сообщения. Вместо этого используется TTS. Вышеупомянутый TTS использует Edge-tts.
Мы можем добиться того же эффекта, что и IVR XML, нажав 0# и, соответственно, нажав 1001~1019, чтобы перейти к соответствующему маршруту расширения. Следует отметить, что мы упомянули выше о нажатии 0#. Конечно, мы также можем просто нажать 0, но нам нужно подождать тайм-аут в 2 секунды. Нажатие # означает, что нажатие клавиши завершено. Нам не нужно ждать таймаута и программа продолжит работу.
Далее мы представляем playAndGetDigits.
digits = session:playAndGetDigits (
min_digits, max_digits, max_attempts, timeout, terminators,
prompt_audio_files, input_error_audio_files,
digit_regex, variable_name, digit_timeout,
transfer_on_failure)
Следует отметить, что использование playAndGetDigits в Lua имеет ту же функцию, что и использование play_and_get_digits в XML Dialplan, за исключением того, что параметры немного отличаются. В первом случае параметр digit_regex предшествует имени переменной, а во втором — наоборот. Читателям следует быть осторожными, чтобы не сделать наоборот.
В приведенном выше примере некоторые читатели могут спросить, можем ли мы просто нажать 0 в приведенном выше Lua, не дожидаясь двухсекундного таймаута. Ответ — да? Давайте просто оптимизируем приведенный выше скрипт Lua.
local tts_engine = "tts_commandline"
local tts_voice = "zh-CN-XiaoxiaoNeural"
session:set_tts_params(tts_engine, tts_voice)
session:setVariable("tts_engine", tts_engine)
session:setVariable("tts_voice", tts_voice)
session:answer()
session:sleep(1000)
local first_digit = session:playAndGetDigits(1, 1, 3, 15000, "#", «Скажите: Добро пожаловать в использование интеллектуального голосового продукта Xiaoying Cherry, наберите добавочный номер напрямую. Чтобы проверить номер, наберите 0», "сказать: Ошибка ввода, пожалуйста, введите еще раз", "[0-1]", "first_digit", 2000)
if first_digit ~= "" and first_digit ~= nil then
if first_digit == "0" then
session:transfer("1000 XML default")
else
local remain_digits = session:playAndGetDigits(3, 3, 3, 2000, "#", "silence_stream://1000", "сказать: Ошибка ввода, пожалуйста, введите еще раз", "^(0[0-1][0-9]$)", "remain_digits", 2000)
session:transfer(first_digit .. remain_digits .. " XML default")
end
else
session:speak("До свидания")
end
Вышеупомянутый оптимизированный скрипт,мы можем видеть,Соберите ключи в два шага,Сначала соберите первую пуговицу,Следовательно, min_digits и min_digits можно установить равными 1.,Это позволяет избежать нажатия знака решетки и ожидания истечения времени ожидания клавиши. После сбора первого ключа,Остальные пуговицы вы можете собрать в соответствии с реальными условиями.
Выше мы реализовали очень простой и распространенный сценарий IVR и изучили простой процесс. Читатели могут объединить реальную ситуацию и написать более мощный сценарий IVR. Давайте сейчас напишем его.
Ссылка на литературу: