Интегрируй и говори: как я исследовал совместимость «Форсайт. Аналитической платформы» со сторонними сервисами

Блог Форсайт
Павел Подгорных

Про интеграцию «Форсайт. Аналитической платформы» со сторонними сервисами, например, каталогами визуализаторов, библиотеками методов «продвинутой» аналитики, я читал достаточно. Эта тема меня интересует, ведь речь идет о расширении возможностей платформы, в ряде случаев позволяет быстро создать инструмент для решения задачи, а в моем – исполнило детскую мечту.

Когда-то давно я посмотрел фильм «Бегущий по лезвию» (1984 года). Самым ярким моментом для меня в нем был диалог главного героя с телевизором. В то время разговор с устройством - был фантастикой. Эта история меня «не оставляла» много лет, я подумал, а почему бы не попробовать поговорить с компьютером, реализовав систему выбора команд в «Форсайт. Аналитической платформе» виде модуля на встроенном в нее языке Fore.NET. В роли движка распознавания голоса решил выбрать Microsoft Speech, но вообще к платформе можно подключить любой из существующих распознавателей речи. Microsoft Speech оказался под рукой, про него и расскажу.

Я попробовал создать простую систему голосового управления. В целом ее архитектура будет представлять собой нечто вроде:

В качестве объекта управления будем использовать наш программный продукт «Форсайт. Аналитическая платформа». Систему выбора команд реализуем в виде модуля на встроенном в платформу языке Fore.NET.

В роли движка распознавания голоса выступит Microsoft Speech. При большом желании к платформе можно подключить любой из существующих распознавателей речи, однако MS Speech проще всего.

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

Установка необходимых программ и компонентов

Первым делом необходимо установить «Форсайт. Аналитическую платформу».

Для наших целей подойдет бесплатная индивидуальная версия, которую можно скачать с сайта компании «Форсайт» по ссылке https://www.fsight.ru/download/. Инструкции по установке доступны в документации.

Далее нужно скачать с сайта Microsoft Speech SDK и Runtime. Существует несколько версий. То, что нам нужно: Microsoft Speech SDK 11. Находится по ссылке https://www.microsoft.com/en-us/download/details.aspx?id=27226.

Однако расположение может со временем измениться, так что набираем в поисковике Microsoft Speech SDK 11 и попадаем на нужную страницу. Обращаю внимание, что есть еще Microsoft Speech SDK 5.1, он нам не подойдет в данном случае.

Кроме того, понадобится Runtime, который находится здесь: https://www.microsoft.com/en-us/download/details.aspx?id=27225.

Но и это еще не все. Для распознавания необходимы словари для языков. Лежат здесь: https://www.microsoft.com/en-us/download/details.aspx?id=27224 (я буду использовать русский).

Скачивать необходимо версию x86, т. к. индивидуальная версия платформы имеет только 32-битную версию.

Почему мы пользуемся именно библиотекой Microsoft.Speech, а не встроенной в систему библиотекой System.Speech? Действительно, библиотеки имеют схожее назначение, большинство классов имеют одинаковые названия. Однако в System.Speech отсутствует распознаватель русской речи.

Учим платформу понимать речь

Для начала нам необходимо создать новую Fore.NET сборку. Затем загрузить в нее сборку Microsoft.Speech.dll, которая находится в папке C:\Program Files (x86)\Microsoft SDKs\Speech\v11.0\Assembly (для x64 версии библиотеки – соответствующая папка из Program Files).

В данной статье ограничимся небольшим набором фраз, которые будем выводить в компонент ListBox формы Fore.NET.

Создадим новую Fore.NET сборку, назовем, например, «Голосовой помощник». Подключим к сборке «Голосовой помощник» сборку, загруженную в репозиторий Microsoft.Speech (11.0.0.0).

Далее создадим в сборке «Голосовой помощник» форму Fore.NET, с идентификатором Main (можете использовать любой другой, но тогда код скопипастить не получится).

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

Выглядеть будет примерно так:

На этом этапе подготовка закончена. Дальше будем немножко кодить и немножко говорить 🙂

Допишем в модуль Program вызов формы. Код будет выглядеть следующим образом:

Imports System; Imports Prognoz.Platform.Interop.Metabase; Public Class StartParams Private m_Metabase: Prognoz.Platform.Interop.Metabase.IMetabase; Public Property Metabase: Prognoz.Platform.Interop.Metabase.IMetabase Get Begin Return m_Metabase End Get Set Begin m_Metabase := Value; End Set End Property Metabase; End Class; Public Class Program [STAThread] Public Shared Sub Main(Params: StartParams); MainForm1 : MainForm; Begin MainForm1 := new MainForm.MAINForm(); MainForm1.Visible := true; End Sub; End Class;

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

К форме должны быть подключены сборки:

- Microsoft.Speech (загруженная в репозиторий dll),

- System.Globalization (из стандартных дотнетовских библиотек).

Для удобства импортируем их в форму:

Imports System.Globalization; Imports Microsoft.Speech.Recognition;

Распознаватель реализуется классом SpeechRecognitionEngine. Он содержит все, что нам необходимо. Создадим в классе формы переменную:

sre : SpeechRecognitionEngine;

Далее в событии создания формы инициализируем и запустим движок:

Public Constructor MAINForm(); Begin InitializeComponent(); //Создаем объект распознавателя. sre := New SpeechRecognitionEngine(New CultureInfo("ru-RU")); //Прицепляем его к устройству захвата звука по умолчанию sre.SetInputToDefaultAudioDevice(); //Задаем в качестве обработчика события «речь распознана» нашу процедуру (будет описана ниже) sre.SpeechRecognized += sre_SpeechRecognized; //Загружаем словарь sre.LoadGrammar(ConstructGrammar()); //Запускаем процесс распознавания sre.RecognizeAsync(RecognizeMode.Multiple); End Constructor;

Объект CultureInfo определен в сборке System.Globalization. Для того чтобы распознавался тот или иной язык, должен быть установлен соответствующий языковой пакет. Далее направим распознаватель на поток из аудио устройства по умолчанию.

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

В качестве обработчика должна быть подключена процедура с определенной сигнатурой:

Private Sub sre_SpeechRecognized(sender: object; e:SpeechRecognizedEventArgs); Begin ListBox1.Items.Add(e.Result.Text); system.Console.WriteLine(e.Result.Text); End Sub sre_SpeechRecognized;

Обработчик просто будет выводить в ListBox и консоль распознанную фразу.

Подключаем грамматику

Осталось совсем чуть-чуть, а именно загрузить грамматику (к сожалению, Microsoft.Speech не умеет распознавать произвольную речь). Существует несколько путей подключения грамматики.

Первый — файл с описанием грамматики в XML подобном формате, который называется Speech Recognition Grammar Specification (SRGS) Version 1.0. Спецификация находится по ссылке https://www.w3.org/TR/speech-grammar/.

Второй путь (которым мы и воспользуемся) — создать грамматику непосредственно в коде программы, используя GrammarBuilder. Впоследствии этот подход позволит нам динамически генерировать грамматики, например, для того чтобы выбирать определенные объекты в репозитории или элементы справочников.

Создадим для этих целей функцию ConstructGrammar(), которая будет возвращать объект типа Grammar. Его и будем передавать распознавателю. Нужно отметить, что в распознаватель мы можем загрузить несколько грамматик.

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

Imports System; Imports System.Collections.Generic; Imports System.ComponentModel; Imports System.Data; Imports System.Drawing; Imports System.Text; Imports System.Windows.Forms; Imports Prognoz.Platform.Forms.Net; Imports System.Globalization; Imports Microsoft.Speech.Recognition; Public Partial Class MAINForm: Prognoz.Platform.Forms.Net.ForeNetForm sre : SpeechRecognitionEngine; Public Constructor MAINForm(); Begin InitializeComponent(); //Создаем объект распознавателя. sre := New SpeechRecognitionEngine(New CultureInfo("ru-RU")); //Прицепляем его к устройству захвата звука по умолчанию sre.SetInputToDefaultAudioDevice(); //Прицепляем в качестве обработчика события речь распознана нашу процедуру (будет описана ниже) sre.SpeechRecognized += sre_SpeechRecognized; //Загружаем словарь sre.LoadGrammar(ConstructGrammar()); //Запускаем процесс распознавания sre.RecognizeAsync(RecognizeMode.Multiple); End Constructor; Private Sub sre_SpeechRecognized(sender: object; e:SpeechRecognizedEventArgs); Begin ListBox1.Items.Add(e.Result.Text); system.Console.WriteLine(e.Result.Text); End Sub sre_SpeechRecognized; Private Function ConstructGrammar():Grammar; Var GB : GrammarBuilder; ChoicesWhat : Choices; ChoicesWith : Choices; Begin //Создаем выбор с набором действий ChoicesWhat := new Choices(); ChoicesWhat.Add("Создай"); ChoicesWhat.Add("Открой"); ChoicesWhat.Add("Открой на редактирование"); ChoicesWhat.Add("Редактируй"); ChoicesWhat.Add("Закрой"); ChoicesWhat.Add("Скопируй"); ChoicesWhat.Add("Перемести"); ChoicesWhat.Add("Удали"); ChoicesWhat.Add("Найди"); //Создаем выбор с набором объектов ChoicesWith := new Choices(); ChoicesWith.Add("справочник"); ChoicesWith.Add("куб"); ChoicesWith.Add("отчет"); ChoicesWith.Add("экспресс отчет"); ChoicesWith.Add("регламентный отчет"); ChoicesWith.Add("аналитическую панель"); ChoicesWith.Add("папку"); ChoicesWith.Add("ярлык"); //Создаем конструктор грамматик GB := New GrammarBuilder(); //Наполним конструктор грамматик грамматиками //Добавим ключевую фразу, типа «Ок, гугл» GB.Append("По щучьему велению"); GB.Append(ChoicesWhat); GB.Append(ChoicesWith); Return New Grammar(GB); End Function ConstructGrammar; Private Sub button1_Click(sender: System.Object; e: System.EventArgs); Begin ListBox1.Items.Clear(); End Sub; End Class;

Также в код добавлен обработчик кнопки, который производит очистку ListBox.

Собственно, на этом все. Компилируем, запускаем и начинаем разговаривать с компьютером 🙂

Результат должен выглядеть следующим образом:

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

Комментарии

Email не будет опубликован.
Подробнее о политике использования персональных данных