Настройка распознавания голосовых команд в Outlook Voice Access

2010-11-30, 02:00 / Argon

С выходом Service Pack 1 для Exchange Server 2010 стал доступен долгожданный русский языковой пакет для роли Unified Messaging, который позволяет реализовать впечатляющую функциональность Outlook Voice Access на русском языке.

Однако, радость после установки русифицированного Unified Messaging длиться до тех пор, пока не начинаешь использовать его возможности всерьёз. Выяснятся, что поиск 30% контактов в глобальной адресной не возможен, а некоторые голосовые команды либо не воспринимаются, либо выполняют совсем не то, что было приказано.

В данной статье я опишу найденные мной недостатки в русифицированном Outlook Voice Access и способы их устранения.

Поиск в адресной книге по имени

Было замечено, что при голосовом поиске контактов в глобальной адресной книге организации («справочник») 30% контактов никак найти не удается. Тётенька на той стороне провода упорно не понимает нас. Причем искомые контакты труднопроизносимыми назвать никак нельзя. Например, мои коллеги Дмитрий Кекин и Мария Волкомурова.

К удивлению, если занести те же имена в личную адресную книгу («личные контакты»), они находятся без проблем. Распознаются и более сложные имена типа «Отдел инфраструктурных решений».

Такое поведение наводит на мысль, что речевой анализатор Unified Messaging способен в принципе воспринимать указанные проблемные имена, но по какой-то причине не делает этого.

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

Результаты работы генератора грамматик хранятся по адресу:

C:\Program Files\Microsoft\Exchange Server\V14\UnifiedMessaging\grammars\ru-RU\

Если заглянуть в файл gal.grxml, то можно обнаружить, что в нём не хватает именно тех имен, которые не может найти в «справочнике» Outlook Voice Access.

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

c:\Program Files\Microsoft\Exchange Server\V14\Bin\GALGRAMMARGENERATOR.exe -g -o c:\Argon\log1.txt

В получившемся файле журнала видим множество записей подобного вида:

The user "Дмитрий Кекин" with the e-mail address "dkekin@company.ru" was not added to the speech grammar because the speech recognition service has determined that it can be said in at least 2 ways. The maximum allowed is 1.

Лог говорит о том, что для текста «Дмитрий Кекин» генератор грамматик находит несколько способов произношения, а допустим только один вариант. Для этого же имени, записанного в личных контактах, анализатор сохраняет все варианты произношения. Объяснение того, почему сделано именно так, дано в этой старой записи блога разработчиков Exchange.

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

А возможность увеличить лимит «похожих» имен все-таки существует. Для этого нужно отредактировать в файле Program Files\Microsoft\Exchange Server\V14\Bin\MSExchangeUM.config параметр GrammarNormalizedFormLimit.

Для того, чтобы анализатор грамматики стал однозначно понимать имя, для учётной записи соответствующего пользователя нужно подобрать значение атрибута PhoneticDisplayName. Экспериментально установлено, что обычно работает простое повторение гласных в ударном слоге. Попробуем сделать Дмитрия Кекина узнаваемым с помощью следующей команды в Exchange Management Shell:

Set-User -Identity dkekin -PhoneticDisplayName "Дмиитрий Кеекин"

Затем обновим глобальную адресную книгу:

Get-GlobalAddressList | Update-GlobalAddressList

И генерируем новый файл грамматики для неё:

c:\Program Files\Microsoft\Exchange Server\V14\Bin\GALGRAMMARGENERATOR.exe -g -o c:\Argon\log2.txt

Открыв log2.txt, по-прежнему видим:

The user "Дмитрий Кекин" with the e-mail address "dkekin@company.ru" was not added to the speech grammar because the speech recognition service has determined that it can be said in at least 2 ways. The maximum allowed is 1.

Но заглянем в C:\Program Files\Microsoft\Exchange Server\V14\UnifiedMessaging\grammars\ru-RU\gal-*.grxml:

<item>Дмиитрий Кеекин
<tag>
$.ObjectGuid._value="d5d956bd-a4d5-4506-bd36-349f2ddf5790";
$.SMTP._value="dkekin@company.ru";
$.ContactName._value="Дмиитрий Кеекин";
</tag>
</item>

А это значит, что Дмитрий Кекин теперь доступен для поиска в «справочнике».

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

Голосовые команды

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

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

Пример 1. Мы нашли в справочнике контакт Дмитрий Кекин. Дали голосовую команду «воспроизвести подробную информацию». Послушали. Теперь нам предлагают «оставить голосовое сообщение», либо «найти другой контакт». Говорим «найти другой контакт». Система начинает вместо этого записывать голосовое сообщение.

Чтобы исправить эту ошибку, находим файл C:\Program Files\Microsoft\Exchange Server\V14\UnifiedMessaging\grammars\ru-RU\ contacts.grxml. Открываем и видим:

<item>
<one-of>
<item>найти другой</item>
<item>найти другой контакт</item>
<item>найти новый</item>
<item>найти новый контакт</item>
<item>отправить сообщение</item>
</one-of>
<tag>$.RecoEvent._value="recoSendMessage";</tag>
</item>

Конфиг указывает на то, что система действительно при произнесении слов «найти другой контакт» выполняет действие recoSendMessage. Чтобы исправить это недоразумение, удаляем ошибочные теги <item> и сохраняем файл грамматики. Для применения изменений нужно выполнить:

c:\Program Files\Microsoft\Exchange Server\V14\Bin\GALGRAMMARGENERATOR.exe –p

Пример 2. Мы нашли в справочнике контакт Дмитрий Кекин. Среди прочих действий нам предлагают «позвонить на рабочий номер» и «позвонить на мобильный». Сколько бы раз мы не повторяли «позвонить на рабочий номер», барышня нас не понимает. Причина банальна:

<item>
<one-of>
<item>позвонить в офис</item>
<item>звонить в офис</item>
</one-of>
<tag>$.RecoEvent._value="recoCallOffice";</tag>
</item>

При таком конфиге речевой анализатор не ждет от нас команды «позвонить на рабочий номер». Ну чтож, добавим тэг с этой командой, сохраним файл и сгенерируем грамматики.

На заметку

Как можно догадаться, речевой анализатор для выполнения одного и того же действия может ждать от пользователя разных голосовых команд. До недавнего времени официальной карты допустимых команд не было, но буквально сегодня я обнаружил обновление, она появилась здесь. Думаю, заголовок «Краткое руководство по Голоса Пользовательский интерфейс…» прекрасно иллюстрирует качество её перевода. Поэтому, для более эффективного взаимодействия с Outlook Voice Access мы можем сами проанализировать, исправить и дополнить существующие голосовые команды, а затем составить свою карту.

Пример 3. Мы нашли в справочнике контакт Дмитрий Кекин. Среди прочих действий нам предлагают «позвонить на рабочий номер» и «позвонить на мобильный». Говорим «позвонить на мобильный». Если в вашей среде настроена интеграция Exchange UM и Lync Server (OCS) по известным статьям (TechNet и других уважаемых авторов), то звонить на мобильный барышня не станет. Причина этого: по умолчанию Exchange UM не допускает исходящих вызовов. Для их включения нужно в Exchange Menagement Console:

  • в разделе Organization ConfigurationUnified Messaging открыть свойства текущего диалплана
  • на вкладке Dialing Rule Groups создать группу In-Country/Region с произвольным именем, а Number mask и Dilaed number указать равным *
  • в разделе Organization ConfigurationUnified Messaging открыть свойства UM Mailbox Policy для текущего диалплана
  • На вкладке Dialing Restrictions добавить созданное ранее правило in-country/region

Полезные ссылки



7 комментариев

Илья
# Комментарий от 2011-04-10, 21:11

Добрый день!

1. По поводу поиска в адресной книге — А как сделать для всех пользователей атрибут PhoneticDisplayName?
2. Про третий пример — Если мы сделаем * то мы сможем на любые номера звонить из голосового меню?

Argon
# Комментарий от 2011-04-10, 21:29

1. Для каждого прописать. Хоть скриптом, хоть руками. Прописывать имеет смысл, только если произношение должно отличаться от написания основного имени.
2. На любые номера, понимаемые Линком, в соответствии с его правилами нормализации.

Илья
# Комментарий от 2011-04-10, 22:30

Спасибо!

Когда мы ищём в адресной книге от мы должны произносить полность ФИО или можно только фамилию?

Argon
# Комментарий от 2011-04-10, 22:31

Как записан DisplayName, так и произносим.

Илья
# Комментарий от 2011-04-10, 22:50

Можно просто в gal.grxml DisplayName править?

Argon
# Комментарий от 2011-04-10, 23:01

Бесполезно, он регулярно формируется на основе данных из AD.

Илья
# Комментарий от 2011-04-10, 23:30

Вот это не удобно. Создали бы отдельный атрибут для поиска в книге! :))) вот это было бы супер!

Добавить комментарий