Welcome Message

Hello my dear reader,

Welcome to my blog, which is dedicated to Cisco technologies. On its pages we will talk about the limitless world of telephony and networking.

We will focus mostly on Cisco collaboration solutions and technologies. These are IP PBX based on Cisco Unified Communications Manager and Cisco Unified Communications Manager Express, Cisco contact centers, Cisco Voice Gateways, etc. Also, I will introduce you the education news: Cisco authorized courses, my own developed training programs, our upcoming events, online learning.

If you have any questions regarding my posts, job or activities, please feel free to ask your questions. I will try to answer them when I have time.

If you are satisfied with the content of my blog, isn’t that worth a beer or coffee? Donations help me to continue supporting the blog and creating new posts here — things for which I spend hours of my free time! Thank you very much!

Sincerely, Dmytro Benda

Sunday, April 29, 2012

Запись голосового сообщения в UCCX с последующей отправкой его на E-mail

Всем привет!

Сегодня я хотел бы рассказать о том, как в контакт-центре экспресс (UCCX) можно реализовать возможность записи голосового сообщения с последующей отправкой его на любой адрес электронной почты. Это необходимо, например, в тех случаях, когда звонки поступают в контакт-центр в нерабочее время. Вы можете построить логику работы скрипта так, что звонящему будет предложено записать сообщение после звукового сигнала, а затем это сообщение направить на общий адрес E-mail вашей организации. Записанное сообщение будет отправлено как файл-вложение в формате .wav. Таким образом, нужная информация из подобных звонков не будет утеряна.

Фрагмент скрипта, который позволяет осуществить подобную логику, показан на следующем рисунке:


Основными элементами, решающими подобную задачу, являются команды Recording, Create eMail, Attach To eMail и Send eMail. Разберем, какие функции они выполняют.

Recording - позволяет записать голосовое сообщение и сохранить его в переменную с типом Document, которую нужно создать перед использованием данной команды с начальным значением DOC[].  В нашем примере для записи сообщения использована переменная recordedMessage.  В параметрах команды Recording следует указать максимальную длительность  ожидаемой записи, а также сообщение, которое будет проиграно вызывающему абоненту с описанием действий, требуемых для записи данного сообщения ("К сожалению, Вы позвонили в нерабочее время, оставьте, пожалуйста, Ваше сообщение после звукового сигнала. В конце сообщения нажмите #").

Create eMail - используется для создания сообщения электронной почты. Прежде, чем применять данную команду, необходимо создать переменную с типом Contact и значением null. Мы создали в нашем скрипте переменную emailContact. В параметрах команды Create eMail описываются тема (Subject) письма (например, "Calling in non-business hours") и само сообщение (Body), которое будет содержаться в теле письма (""This E-mail contains records from the clients"). Данные параметры помещаются в переменную emailContact.


Attach To eMail - позволяет прикрепить к созданному сообщению (переменной emailContact) файл-вложение. В нашем случае файлом-вложением будет выступать переменная c записанным сообщением (recordedMessage). Нужно также указать имя и расширение файла-вложения, с которым он будет отсылаться и отображаться в сообщении электронной почты.


Send eMail - выполняет отправку сообщения (переменной emailContact) по указанному адресу E-mail . Для указания адреса была создана стринговая переменная mailboxContact со значением "instructor@ciscoclass.com".


Теперь все готово для записи и отправки записанного сообщения на E-mail. Можно сохранять свой скрипт, загружать его в UCCX и приступать к тестированию.

P.S. Всех поздравляю с наступающими первомайскими праздниками и желаю хорошей погодки, чтобы выехать на пикник! :) А я отправляюсь болеть за Машу Шарапову, которая сегодня сыграет с Викторией Азаренко в финале турнира Porsche Tennis Grand Prix, который проходит в Штутгарте.  :)

48 comments:

  1. Я так понимаю это для версии премиум

    ReplyDelete
  2. Здравствуйте,

    Конечно, этот функционал тестировался и устанавливался у клиента, который имел UCCX Premium. Однако, я думаю, что это вполне будет работать и на более низших лицензиях:

    Cisco Unified CCX Product Package
    Options: Cisco Unified IP IVR

     Basic and advanced IVR ports (licensed on per-port basis)
     Prompt and collect
     Call controls such as answer, terminate, transfer, and place call
     High availability (additional license required)
     Enterprise database integration via JDBC
     Inbound HTTP-triggered applications
     Generate and send outbound email
     Voice XML v2.0 support for advanced speech applications
     Record caller audio input and save or upload as prompts
     Remote Method Invocation (RMI)
     CTI integration with Cisco Unified ICM and Cisco Unified CCE
     XML document processing
     MRCP integration to support ASR and TTS services
     AutoAttendant and Spoken Name Upload provided
     Real-time and historical reports

    ReplyDelete
  3. Добрый день.
    Вот как раз использование step "On Exception Goto" позволяет не нажимать в конце решетку, правда в таком случае можно получить пустой документ и отправить его по почте, если не вводить доп.обработчик.
    ("... В конце сообщения нажмите #").

    ReplyDelete
    Replies
    1. Добрый день! Опишите пожалуйста подробнее, как настроить скрипт, чтобы в конце не нужно было нажимать #.

      Delete
  4. Подскажите, а как записать голосовое сообщение и сохранить его на жестком?

    ReplyDelete
  5. Добрый день,

    Посмотрите, пожалуйста, мою последнюю статью:

    http://dbenda.blogspot.sk/2013/05/uccx.html

    Там как раз приведен скрипт для записи сообщения на диск.

    ReplyDelete
  6. Здравствуйте. Подскажите, а может ли UCCX принимать факсовое сообщение? Заранее благодарен.

    ReplyDelete
    Replies
    1. Добрый день,

      Штатными средствами нет, не может. Где-то на cisco support forume читал как-то, что для этого нужна интеграция с Unity, но сам такое не делал, к сожалению.

      Delete
  7. Здравствуйте. Подскажите как можно сделать переадресацию внутри скрипта например: человек позвонил на общий номер, его перенаправили на другой номер, если там не ответили в течении 3-5 секунд его перенаправит на другой номер и так далее...

    ReplyDelete
    Replies
    1. Добрый день,

      Перевод звонка из скрипта можно организовать с помощью шага Call Redirect.

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

      В принципе, Вами описана выше обычная переадресация по неответу (Call Forward No Answer), которую можно организовать средствами самого колменеджера без скрипта.

      Delete
    2. Не подскажите, а средствами UCCX можно ли это сделать. Есть необходимость это сделать именно скриптом. Заранее большое спасибо.

      Delete
    3. Доброе утро,

      Вы, видимо, невнимательно прочитали мой предыдущий ответ. Перевод звонка из скрипта можно сделать с помощью шага Call Redirect.

      Например, пришел звонок на номер 1000, сработал скрипт, в скрипте выполнился шаг Accept (ответ), вызывающий услышал приветствие, выполнились там еще какие-либо действия (все от логики скрипта зависит). Далее дошли до шага Call Redirect, в котором указывается номер, например, 1001, на который нужно перенаправить вызов. Вызов отправляется на 1001.

      Также можно воспользоваться шагом Call Consult Transfer. У этого шага есть ветки Busy, Invalid, Unsuccessfull, Timeout. Ветка Timeout позволит Вам организовать перевод звонка по неответу.

      Delete
  8. Не подскажете, как связать мой почтовый сервер и UCCX 8.5. Два поля, которые я вижу в меню Subsystems мне мало, чем помогли.

    ReplyDelete
    Replies
    1. А какую задачу Вы решаете? В тех двух полях настраивается только айпишник почтовика. Все остальное делается скриптом.

      Delete
  9. Доброго времени суток.
    Так и не решил проблему отправки пустого документа. step "On Exception Goto" позволяет отправлять любой документ, в том числе пустой. При этом если отказаться от нажатия "#" step Recording попадает в ветку Unsuccessful.Каким параметром, свойством объекта DOC() можно узнать его размер?/Максим

    ReplyDelete
    Replies
    1. Добрый день, Максим! А не могли бы Вы снова описать задачу, которую Вы решаете? Я прочел предыдущие сообщения, но они ясности не внесли. Вам нужно, чтобы в конце записи не надо было нажимать #?

      Распишите, пожалуйста, свою задачу более подробно.

      Delete
    2. Дмитрий, добрый день. Я понял вышеописанную проблему, так как сам сейчас копаюсь с этим вопросом. Задача в том чтобы проверить за писаный файл пустой или нет, и исходя из этого атачить его в письмо (записывать на диск и т.д.) или нет. То есть если клиент не захотел надиктовывать сообщение, но письмо с номером звонящего надо отправить агентам, но отправлять пустые файлы как то не православно.

      Delete
    3. Добрый день, Александр! Думаю, что отправить письмо с номером звонящего абонента не составит проблемы (это решаемо с помощью переменных). Согласен, что отправлять пустые файлы нехорошо, но с другой стороны, что, если человек ничего не наговорил в файл? т.е. просто помолчал 15-20 сек записи.

      По поводу пустого файла... вот счас мелькнула мысль о том, что может как-то можно использовать шаг If (проверять, пустая переменная, или нет). Надо будет при случае это проверить.

      Delete
  10. Добрый день, Дмитрий.

    Подскажите, пожалуйста, как можно решить такую задачу:
    Приходит звонок в контакт-центр. Начинает работать скрипт: отвечает IVR и затем звонок уходит на свободного оператора, соответственно на телефоне оператора высвечивается сначала номер порта IVR, а затем, когда происходит соединение оператора с абонентом, номер звонящего.
    Как можно подменить номер порта IVR на номер звонящего, чтобы к оператору он сразу поступал с АОНом звонящего?
    Заранее спасибо.
    Евгений.

    ReplyDelete
    Replies
    1. Добрый день, Евгений!

      Вам нужно почитать про пересылку переменных между контакт-центром и консолью оператора, а именно о шаге Set Enterprise Call Info.

      Суть такова, что, в шаге Select Resource радио-кнопка Connect ставится в положение No, тогда вместо ветки Connect в этом шаге будет ветка Selected (агент выбран). В ветке Selected надо далее поставить Set Enterprise Call Info, где Вы и пошлете на консоль оператора или его телефон (в случае IP Phone Agent) необходимые данные.

      Delete
    2. Спасибо за ответ, Дмитрий.

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

      Евгений.

      Delete
    3. Почему же, вопрос о номере звонящего на телефоне как раз был абсолютно понятен. На телефон также можно посылать так называемые Enterprise Data (номер звонящего, набранный номер, любую личную инфу) так же, как и на CAD.

      Вот выдержка из документации: "Enterprise Data may be displayed on ring and/or answer, or neither." И вот еще:

      Cisco IP Phone Agent (IPPA) is a service added to your Cisco IP phone. It allows you to:
      ■ Log in and log out of the Automatic Call Distributor (ACD)
      ■ View caller (enterprise) data when receiving a call
      ...

      Для отправки Enterprise Data на телефон отличий в конфигурировании iи скриптах никакого нет, все делается так же, как и для CAD.

      Delete
    4. Вот именно, Enterprise Data направляется и отображается в приложениях CAD или IPPA. Я же имею ввиду только телефонный аппарат оператора, без установленного на нем IPPA. Речь о ситуации когда надо отправлять номер звонящего на телефонный аппарат оператора, не на CAD или на IPPA. Фактически подменять номер порта IVR, с которого приходит вызов на телефонный аппарат оператора, чтобы оператор до того как ответить на звонок видел на телефонном аппарате номер звонящего.

      P.S. судя по имеющейся информации в мануалах и интернетах, такое не реализуемо без "выдергивания" звонка абонента из очереди.

      Евгений.

      Delete
    5. Евгений, когда речь идет об операторе, то обычно подразумевается агент (Agent). Вызов на агента отправляется через очередь (Contact Service Queue).

      Если Вы говорите об отправке звонка на другой телефон, не агентский, то тут никак нельзя использовать слово очередь. Это перенаправление вызова. Обычно для этих целей используется шаг Call Redirect. Номер IVR порта показывается потому, что, по сути, это трансфер звонка через дополнительный порт. Каких-то штатных способов по изменению ANI в скрипте для этого шага не предусмотрено. :(

      Можно попробовать поэкспериментировать с сервисным параметром колменеджера Display CTI Route Point Name or DN. Я никогда не пробовал его менять. Если будет время, попробую с лабе при случае.

      Если необходимо отправлять вызов именно по функционалу контакт-центра на оператора, то необходимо конфигурировать агентов, использовать IPPA или САD, и обрабатывать вызов через очередь. В этом случае агент увидит все необходимые параметры звонка.

      Delete
    6. Kак и обещал, вчера проверил, как отрабатывает сервисный параметр ССМ Display CTI Route Point Name or DN.

      В лабе использовался ССМ 8.6 и UCCX 10.0. Простейшая схема: один телефон для совершения звонка в скрипт (5012), второй телефон - для приема перенаправленного вызова (6012). Скрипт элементарный: приветствие и далее Call Redirect на 6012.

      Получается следуещее:

      - Display CTI Route Point Name or DN = False (default). При этом при поступлении вызова на 6012 до ответа виден номер звонящего (5012)
      - Display CTI Route Point Name or DN. = true. При поступлении вызова на 6012 на дисплее пишется Forwarded for 6012.

      Номер дозвона на скрипт - 4000, нумерация IVR портов: 9000 - 9009.

      Стало быть, правильным является установка Display CTI Route Point Name or DN = False.

      Delete
    7. Спасибо, Дмитрий, за развернутые ответы.

      Речь о ситуации, когда рабочее место оператора состоит из телефона и приложения CAD.
      Если модернизировать вашу схему назначив 6012 оператором, а в скрипте вместо перенаправления поставить шаг выбора оператора, тогда на телефоне оператора номера будут отображаться в следующем порядке:
      1) до ответа оператора на телефоне будет виден номер из пула IVR портов (9000-9009)
      2) после поднятия трубки на телефоне оператора отобразится номер звонящего (5012)
      В CAD же номер из пула IVR портов не отображается, а сразу видно номер звонящего.
      Так вот на первом шаге подменить номер из пула IVR на номер звонящего не выйдет.

      Евгений.

      Delete
    8. Евгений,

      теперь стало понятно, где именно некорректно отображается CLID. Это давняя проблема UCCX, связанная с тем, что выполняется Consult Transfer. Она решена в релизе 10.0. CLID звонящего вместо номера IVR порта будет отображаться на дисплее телефона агента, если Вы включите это через командную строку:

      utils uccx icd clid enable

      После этого надо рестартовать Cisco Unified CCX Engine и проверять. На экране телефона по дефолту будет писать Customer CLID is и далее номер звонящего.

      Если не нравится Customer CLID is, это можно изменить. Более подробная инфа - в Release Notes для версии 10.0. В списках вызовов все равно отображается номер IVR-порта.

      Delete
    9. Дмитрий,

      спасибо большое за ответ. Это именно то что требовалось!

      Евгений

      Delete
    10. Пожалуйста. :) Рад помочь. Я не сразу сообразил, о чем идет речь, и в какой именно ситуации неправильно отображается CLID.

      Delete
    11. Добрый вечер Дмитрий
      Как в пункте записи если длительность выставлена 180 секунд, после окончания этих 180 секунд клиент не нажал #, необходимо чтобы запись перешла в unsuccessful и была отправлена на почту

      Delete
  11. Скажите, как доработать скрипт, так чтобы он записал сообщение независимо от того, нажал абонент в конце # или нет. И еще, как добавить номер звонившего и время вызова в тело письма или в имя файла или в тему письма?

    ReplyDelete
    Replies
    1. Добрый день! По поводу # я вот так сходу не подскажу Вам, потому как не тестировал и не экпериментировал с этим. В настоящее время потестить не смогу, так как нужно для этого разворачивать лабораторный UCCX, а времени на это нет. :(

      Касательно добавления номера звонившего в имя файла или тело письма: сначала нужно извлечь Calling Number из данных звонка и поместить это значение в переменную, например, callingNumber (это делает шаг Get Call Contact Info). Далее в теле письма (поле Body) пишете так: callingNumber+"cooбщение Вашего письма". Аналогично будет и для темы (поле Subject): callingNumber+"тема Вашего письма".

      Delete
    2. Спасибо за ответ! Номер и время добавил и в имя файла и в тело письма. А вот убрать # не получается. Если у Вас появится какая-либо информация - дайте знать.

      Delete
    3. Можно обойтись без # через исключение "exception"
      1) перед записью добавляете шаг: "on exception"
      выбираете com.cisco.wfapi.WFExecutionException -
      ловит любое исключение, в том числе и не нажатую #.
      И по исключению, отправляете скрипт на шаг отправки email.
      2) Не забудьте обнулить исключение(шаг "clear exception"), иначе получится петля в скрипте.

      Delete
  12. Добрый вечер Дмитрий
    Как в пункте записи если длительность выставлена 180 секунд, после окончания этих 180 секунд клиент не нажал #, необходимо чтобы запись перешла в unsuccessful и была отправлена на почту.

    ReplyDelete
  13. Дмитрий,добрый вечер.
    Сегодня увидел ваш скрипт по записи и отправке на email.Для меня оказалось очень полезным.Но к сожалению он почему-то не отрабатывает.Т.е. письмо не приходит на поту и не понятно в чем причина : нет записи его или все таки колл-центр его не может доставить. Как вообще можно проверить есть ли у CUCM возможность отправлять письма и где вообще это настраивается? И плюс где хранятся эти записи,которые CCX делает в процессер разговора? Буду очень благодарен!

    ReplyDelete
    Replies
    1. Кирилл, добрый день. CUCM не отправляет письма. Это делает UCCX. Для начала подскажите, настроили ли Вы адрес почтового сервера в настройках UCCX? Это делается в меню Subsystems -> Email. Там нужно указать адрес почтовика и дефолтный email-адрес, от имени которого отправляюся письма. Это важная настройка, потому как:

      The Unified CCX system uses the eMail subsystem of the Unified CCX Engine to communicate with your email server and enable your applications to create and send email.

      Касательно того, где хранятся записи: в данном скрипте записанное сообщение хранится только в оперативной памяти, на диск оно не записывается. Записанное сообщение помещается в переменную с типом DOC, в этом скрипте она называется recordedMessage. Далее данная переменная помещается во вложение письма. Чуть больше информации о шаге Recorded можно прочесть в другом моем посте, там же показано, как сохранить файл на диск:

      https://dbenda.blogspot.com/2013/05/uccx.html#more

      Проверить, отправляется ли письмо, можно лишь в логах самого UCCX, они же, в свою очередь, доступны через Real Time Monitoring Tool (RTMT).

      Delete
    2. Супер!! Нашел.Сейчас стал проверять,но все равно письма не отправляются.Через debug и reactive script увидел,что после пунка record скрипт не переходит на состояние Successful или unsuccessfull.Т.е. перехода к пункту о передачи письма почему-то не происходит.Там необходимо может быть указывать какие-то параметры? Или каким вообще образом UCCX понимает,что запись прошла успешно или нет?

      Delete
    3. Супер!! Нашел все.А еще такой вопрос.Сейчас через debug и reactive script посмотрел как обрабатывается скрипт.И до места где должно отправлять письмо почему-то он не доходит.В каком случае система отрабатывает при record как successfull или unsuccesssful?надо ли какие-то условия добавлять еще?

      Delete
    4. Recording Step позволяет записать голосовое сообщение после звукового сигнала. В конце записи нужно обязательно нажимать #. Т.е проговорили сообщение и нажали решетку. В этом случае Вы должы попасть в ветку Successful.

      Если Вы не проговорили сообщение или не нажали решетку, то это будет считаться как неуспешная запись. Вы можете сделать запись повторно. Количество таких возможных повторов устанавливается параметром Maximum Retries. Предположим, что этот параметр равен 3. В таком случае, после 3 неуспешных попыток Вы попадаете в ветку Unsuccessful.

      Delete
    5. Добрый день.
      Наконец дошли руки до настройки данного скрипта.Есть проблемы с отправкой как я понял именно самого письма.Юзера и сервер я прописал,даже сделал отдельный скрипт на отправку просто письма без вложений.В инете прочитал,что необходимо,чтобы на сервере был настроен SMTP сервер.Это действительно так? Если да,то где найти данную настройку?Кроме как ветки с настройками репортов больше нигде про SMTP ничего не нашел.Еще вот здесь описано,что необходимо создать пользователя,с которого будет отправка производиться https://www.uccollabing.com/2013/10/06/cisco-uccx-email-scripting/

      Delete
    6. Рано написал письмо.Сам разобрался во всем.Не видел видимо колл-центр сервер по имени.ПО айпишнику все заработало.Единственная проблема в том,что запись приходит пустая.В чем могут быть проблемы?

      Delete
    7. Сложно так ответить, в чем могут быть проблемы, не видя Вашего скрипта. Обычно, такие ситуации решаются с помощью дебага скрипта.

      Delete
    8. Скрипт простейший.Не нашел как сюда запилить фото. ВОт ссылка на скрин https://yadi.sk/i/92FVVbFT3SJsdd

      Delete
    9. Ссылка не открылась, к сожалению. Нажимаете ли Вы в конце записи решетку? Пробовали ли Вы включать Reactive Debug? Если да, то уходит ли скрипт в ветку Successful шага Recording? Изменяется ли переменная, в которую помещается записанное сообщение?

      Delete
    10. Очень странно,что не открылась(( Да,после нажатия на решетку все уходит в ветку Successful ну и далее идет выполнение отправки самого сообщения,которое очень быстро все пролетает и соответственно скрипт заканчивается.Что значит изменяется ли переменная и где это должны быть видно?Может быть у вас есть почта, куда можно было бы отправить скрин скрипта.И еще может быть есть материалы по функциям в CCX,которые можно было бы почитать,чтоб не задавать всех этих лишних вопросов :)

      Delete
    11. Когда Вы делаете Reactive Debug, то лучше запускать его в пошаговом режиме кнопкой Step Over. При этом Вам необходимо нажимать на нее каждый раз, чтобы выполнился следующий шаг скрипта. В левом нижнем углу есть область создания переменных, и Вы можете там увидеть значение переменной. Оно изменяется при выполнении шагов.

      Касательно документации - можете почитать, например, здесь

      https://www.cisco.com/c/dam/en/us/td/docs/voice_ip_comm/cust_contact/contact_center/crs/express_8_5/programming/guide/uccx851gs_scripts.pdf

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

      Delete
    12. Kirill.shmatkov@gmail.com
      Спасибо большое!

      Delete