Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

Настройка MSR

На данный момент приложение работает с медиасервером (MSR), у которого тактовая частота настроена на 48000 Гц (указывается в файле конфигурации — секция "media", параметр "mixer-clock-rate"):

$ sudo nano /etc/ecss/ecss-media-server/config.xml
<?xml version="1.0" encoding="utf-8"?>
<config date="09:14:04 26.09.2023">
  <general log-level="3" log-rotate="yes" max-calls="8192" max-in-group="512" load-sensor="media" load-delta="10" calls-delta="100" spool-dir-size="100M" log-name="msr.log" log-path="/var/log/ecss/media-server"$
  <transport bind-addr="127.0.0.1" port="5040" transport="udp+tcp"/>
  <!-- By default configured public TURN-server -->
  <turn-server use-turn="no" host="numb.viagenie.ca" user="webrtc@live.com" password="muazkh"/>
  # Изменить тактовую частоту в параметре "mixer-clock-rate на 48000"
  <media mixer-clock-rate="48000" use-vad="no" cng-level="0" jb-size="60" rtcp-timeout="0" rtp-timeout="350" udp-src-check="yes" cn-multiplier="3" port-start="12000" port-range="2048" tias-in-sdp="no" 
...
</config>

Настройка IVR-скрипта

Для работы синтеза речи в IVR-скрипте необходимо настроить сервис tts для работы с Yandex-Speechkit (Text-to-Speech) по инструкции. Также для корректной работы и настройки скрипта, в частности блока "ivr", необходимо наличие лицензии ASR. Проверить наличие можно по инструкции.

Интеграция приложения с ECSS-10 выполнена через IVR-скрипт.

Пример скрипта представлен ниже. 

После звонка на номер IVR, произносится приветственное сообщение, далее речь от абонента поступает на сервер приложения. Если до таймаута от приложения приходит ответ с номером, то происходит звонок на этого абонента. В противном случае мы оказываемся в одной из двух других веток. В первом случае приложение не услышало фразу или не смогло найти никакого соответствия с распознанной речью, тогда произносится фраза с пустой или распознанной строкой, далее попадает на RPC-блок, где тегирует запрос приложению как неудачный и делается повторный запрос (блок goto, который выполняется 2 раза). Во втором случае приложение нашло соответствие с распознанной речью, но требуется уточнение (например, были найдены 2 абонента с одним и тем же именем и фамилией, но они находятся в разных отделах, тогда приложение пришлет ответ, что нужно уточнить отдел и перечислит их), делается повторный запрос (блок goto, который выполняется 2 раза), где в блоке ivr будет произнесен ответ от приложения (уточнение). 


 IVR-script
{"actions":{"begin_1":{"name":"begin","params":{"description":""},"pos":{"x":4,"y":0},"cases":{"next":"set_40"},"links":{"next":{"points":[{"cx":810,"cy":70},{"cx":810,"cy":125},{"cx":810,"cy":180}],"text_pos":0.2}}},"ivr_2":{"name":"ivr","params":{"description":"","play":[{"type":"speech","name":"%PLAY_IVR%","tts":{"folder":"b1giqb9no4enfheittff","is_use_folder":false,"key":"AQAAAAAJ1M1DAATuwQ2IiWRXoUxBrUZKtFE860o","is_use_key":false,"lang":"ru-RU","is_use_lang":false,"voice":"zahar","is_use_voice":false,"speed":"1.2","is_use_speed":false,"emotion":"good","is_use_emotion":false},"location":"","group":"","variable_type":""}],"ivr":[],"playback_interruption":true,"volume_interruption":30,"wait_time":9,"extension_dialing":true,"direct_call_to_extension":true,"term_char":"","max_digits":"3","interdigit_timeout":2,"use_calling_iface":false,"asr_service":"asr.ecss:8000"},"pos":{"x":4,"y":2},"cases":{"Extension":"condition_4","No Match":"condition_22"},"links":{"Extension":{"points":[{"cx":810,"cy":370},{"cx":810,"cy":425},{"cx":810,"cy":480}],"text_pos":0.2},"No Match":{"points":[{"cx":810,"cy":370},{"cx":900,"cy":500},{"cx":990,"cy":630}],"text_pos":0.2}}},"condition_4":{"name":"condition","params":{"description":"","conditions":[{"code":"1","condition":"(%ASR_ANSWER%<>\"\")"},{"code":"0","condition":"(%ASR_RECOGNIZED%<>\"\")and(%ASR_NUMBER%<>\"\")"}]},"pos":{"x":4,"y":3},"cases":{"0":"condition_23","1":"set_39","False":"condition_22"},"links":{"0":{"points":[{"cx":810,"cy":520},{"cx":720,"cy":575},{"cx":630,"cy":630}],"text_pos":0.2},"1":{"points":[{"cx":810,"cy":520},{"cx":1080,"cy":950},{"cx":1350,"cy":1380}],"text_pos":0.2},"False":{"points":[{"cx":810,"cy":520},{"cx":900,"cy":575},{"cx":990,"cy":630}],"text_pos":0.2}}},"set_10":{"name":"set","params":{"description":"","variables":[{"key":"EXTENSION","value":"%ASR_NUMBER%"}]},"pos":{"x":3,"y":8},"cases":{"next":"dial_11"},"links":{"next":{"points":[{"cx":630,"cy":1270},{"cx":630,"cy":1325},{"cx":630,"cy":1380}],"text_pos":0.2}}},"dial_11":{"name":"dial","params":{"description":"","numbers":"%EXTENSION%","noanswer_timeout":55,"use_calling_iface":true},"pos":{"x":3,"y":9},"cases":{"Busy/No answer":"undefined","Error":"undefined"},"links":{"Busy/No answer":{"points":[{"cx":630,"cy":1420},{"cx":630,"cy":1475},{"cx":630,"cy":1530}],"text_pos":0.2,"pos":{"x":3,"y":10}},"Error":{"points":[{"cx":630,"cy":1420},{"cx":540,"cy":1475},{"cx":450,"cy":1530}],"text_pos":0.2,"pos":{"x":2,"y":10}}}},"goto_17":{"name":"goto","params":{"description":"","max_hops":"2","goto":"ivr_2"},"pos":{"x":6,"y":10},"cases":{"Exit":"play_18","Goto":"ivr_2"},"links":{"Exit":{"points":[{"cx":1170,"cy":1570},{"cx":1170,"cy":1625},{"cx":1170,"cy":1680}],"text_pos":0.2},"Goto":{"points":[{"cx":1170,"cy":1570},{"cx":1170,"cy":950},{"cx":810,"cy":330}],"text_pos":0.2}}},"play_18":{"name":"play","params":{"description":"","play":[{"type":"speech","name":"Исчерпан лимит попыток. До свид+ания-.","tts":{"folder":"b1giqb9no4enfheittff","is_use_folder":false,"key":"AQAAAAAJ1M1DAATuweeNnIvR0kbtudFglzCR4Ac","is_use_key":false,"lang":"ru-RU","is_use_lang":false,"voice":"zahar","is_use_voice":false,"speed":"1.2","is_use_speed":false,"emotion":"neutral","is_use_emotion":true},"location":"","group":"","variable_type":""}],"replay":"1"},"pos":{"x":6,"y":11},"cases":{"next":"undefined"},"links":{"next":{"points":[{"cx":1170,"cy":1720},{"cx":1170,"cy":1775},{"cx":1170,"cy":1830}],"text_pos":0.2,"pos":{"x":6,"y":12}}}},"play_19":{"name":"play","params":{"description":"","play":[{"type":"speech","name":"Соединяю.","tts":{"folder":"b1giqb9no4enfheittff","is_use_folder":false,"key":"AQAAAAAJ1M1DAATuweeNnIvR0kbtudFglzCR4Ac","is_use_key":false,"lang":"ru-RU","is_use_lang":false,"voice":"zahar","is_use_voice":false,"speed":"1.2","is_use_speed":false,"emotion":"good","is_use_emotion":false},"location":"","group":"","variable_type":""}],"replay":"1"},"pos":{"x":3,"y":7},"cases":{"next":"set_10"},"links":{"next":{"points":[{"cx":630,"cy":1120},{"cx":630,"cy":1175},{"cx":630,"cy":1230}],"text_pos":0.2}}},"rpc_20":{"name":"rpc","params":{"description":"","type":"HTTP","url":"http://%ASR_SERVICE%/%ASR_NEGATIVE_URL%","method":"HEAD","request_timeout":0,"headers":[],"max_bytes":"10000","expected_encoding":"utf","rpc_comm":[]},"pos":{"x":4,"y":5},"cases":{"Error":"set_24"},"links":{"Error":{"points":[{"cx":810,"cy":820},{"cx":810,"cy":875},{"cx":810,"cy":930}],"text_pos":0.2}}},"rpc_21":{"name":"rpc","params":{"description":"","type":"HTTP","url":"http://%ASR_SERVICE%/%ASR_POSITIVE_URL%","method":"HEAD","request_timeout":0,"headers":[],"max_bytes":"10000","expected_encoding":"utf","rpc_comm":[]},"pos":{"x":2,"y":5},"cases":{"Error":"set_25"},"links":{"Error":{"points":[{"cx":450,"cy":820},{"cx":450,"cy":875},{"cx":450,"cy":930}],"text_pos":0.2}}},"condition_22":{"name":"condition","params":{"description":"","conditions":[{"code":"0","condition":"(%ASR_NEGATIVE_URL%<>\"\")"}]},"pos":{"x":5,"y":4},"cases":{"0":"rpc_20","False":"condition_27"},"links":{"0":{"points":[{"cx":990,"cy":670},{"cx":900,"cy":725},{"cx":810,"cy":780}],"text_pos":0.2},"False":{"points":[{"cx":990,"cy":670},{"cx":990,"cy":875},{"cx":990,"cy":1080}],"text_pos":0.2}}},"condition_23":{"name":"condition","params":{"description":"","conditions":[{"code":"0","condition":"(%ASR_POSITIVE_URL%<>\"\")"}]},"pos":{"x":3,"y":4},"cases":{"0":"rpc_21","False":"play_19"},"links":{"0":{"points":[{"cx":630,"cy":670},{"cx":540,"cy":725},{"cx":450,"cy":780}],"text_pos":0.2},"False":{"points":[{"cx":630,"cy":670},{"cx":630,"cy":875},{"cx":630,"cy":1080}],"text_pos":0.2}}},"set_24":{"name":"set","params":{"description":"","variables":[{"key":"ASR_NEGATIVE_URL","value":""}]},"pos":{"x":4,"y":6},"cases":{"next":"condition_27"},"links":{"next":{"points":[{"cx":810,"cy":970},{"cx":900,"cy":1025},{"cx":990,"cy":1080}],"text_pos":0.2}}},"set_25":{"name":"set","params":{"description":"","variables":[{"key":"ASR_POSITIVE_URL","value":""}]},"pos":{"x":2,"y":6},"cases":{"next":"play_19"},"links":{"next":{"points":[{"cx":450,"cy":970},{"cx":540,"cy":1025},{"cx":630,"cy":1080}],"text_pos":0.2}}},"condition_27":{"name":"condition","params":{"description":"","conditions":[{"code":"0","condition":"(%ASR_RECOGNIZED%<>\"\")and(%ASR_NUMBER%=\"\")"}]},"pos":{"x":5,"y":7},"cases":{"0":"play_28","False":"play_32"},"links":{"0":{"points":[{"cx":990,"cy":1120},{"cx":990,"cy":1175},{"cx":990,"cy":1230}],"text_pos":0.2},"False":{"points":[{"cx":990,"cy":1120},{"cx":1080,"cy":1175},{"cx":1170,"cy":1230}],"text_pos":0.2}}},"play_28":{"name":"play","params":{"description":"","play":[{"type":"speech","name":"Не удалось найти абонента %ASR_RECOGNIZED%","tts":{"folder":"b1giqb9no4enfheittff","is_use_folder":false,"key":"AQAAAAAJ1M1DAATuweeNnIvR0kbtudFglzCR4Ac","is_use_key":false,"lang":"ru-RU","is_use_lang":false,"voice":"zahar","is_use_voice":false,"speed":"1.1","is_use_speed":true,"emotion":"good","is_use_emotion":false},"location":"","group":"","variable_type":""}],"replay":"1"},"pos":{"x":5,"y":8},"cases":{"next":"set_29"},"links":{"next":{"points":[{"cx":990,"cy":1270},{"cx":1080,"cy":1325},{"cx":1170,"cy":1380}],"text_pos":0.2}}},"set_29":{"name":"set","params":{"description":"","variables":[{"key":"ASR_RECOGNIZED","value":""},{"key":"ASR_NUMBER","value":""},{"key":"PLAY_IVR","value":"%ASR_ANSWER%"}]},"pos":{"x":6,"y":9},"cases":{"next":"goto_17"},"links":{"next":{"points":[{"cx":1170,"cy":1420},{"cx":1170,"cy":1475},{"cx":1170,"cy":1530}],"text_pos":0.2}}},"play_32":{"name":"play","params":{"description":"","play":[{"type":"speech","name":"Не удалось распознать абонента.","tts":{"folder":"b1giqb9no4enfheittff","is_use_folder":false,"key":"AQAAAAAJ1M1DAATuweeNnIvR0kbtudFglzCR4Ac","is_use_key":false,"lang":"ru-RU","is_use_lang":false,"voice":"zahar","is_use_voice":false,"speed":"1.2","is_use_speed":false,"emotion":"good","is_use_emotion":false},"location":"","group":"","variable_type":""}],"replay":"1"},"pos":{"x":6,"y":8},"cases":{"next":"set_29"},"links":{"next":{"points":[{"cx":1170,"cy":1270},{"cx":1170,"cy":1325},{"cx":1170,"cy":1380}],"text_pos":0.2}}},"goto_38":{"name":"goto","params":{"description":"","max_hops":"2","goto":"ivr_2"},"pos":{"x":7,"y":10},"cases":{"Exit":"play_18","Goto":"ivr_2"},"links":{"Exit":{"points":[{"cx":1350,"cy":1570},{"cx":1260,"cy":1625},{"cx":1170,"cy":1680}],"text_pos":0.2},"Goto":{"points":[{"cx":1350,"cy":1570},{"cx":1260,"cy":950},{"cx":810,"cy":330}],"text_pos":0.2}}},"set_39":{"name":"set","params":{"description":"","variables":[{"key":"PLAY_IVR","value":"%ASR_ANSWER%"},{"key":"ASR_RECOGNIZED","value":""},{"key":"ASR_ANSWER","value":""}]},"pos":{"x":7,"y":9},"cases":{"next":"goto_38"},"links":{"next":{"points":[{"cx":1350,"cy":1420},{"cx":1350,"cy":1475},{"cx":1350,"cy":1530}],"text_pos":0.2}}},"set_40":{"name":"set","params":{"description":"","variables":[{"key":"PLAY_IVR","value":"Произнесите имя и фамилию абонента."}]},"pos":{"x":4,"y":1},"cases":{"next":"ivr_2"},"links":{"next":{"points":[{"cx":810,"cy":220},{"cx":810,"cy":275},{"cx":810,"cy":330}],"text_pos":0.2}}}},"name":"ivr_script_asr","description":"Скрипт для автосекретаря","version":"3.14.14.27","settings":{"speech":{"folder":"b1giqb9no4enfheittff","key":"","lang":"ru-RU","voice":"oksana","speed":"1.2","emotion":"evil","terminate_if_tts_failed":false}},"id":"1039dda7rcf820v7"}

Импортировать скрипт можно через интерфейс командной строки:

domain/<DOMAIN>/ivr/script/.import --id <ScriptID> --json <IVR-скрипт>

После импорта нужно зайти в IVR-редактор, выбрать скрипт "ivr_script_asr" и в поле "Адрес сервиса распознавания речи" блока "ivr" указать IP-адрес хоста с установленным приложением и порт сервиса clerk (по умолчанию: 8000) (рисунок 1):

Рисунок 1

После сохранения скрипта необходимо создать правило маршрутизации на данный IVR-скрипт. 

  • Нет меток