На платформе .Net для распознавания речи можно использовать библиотеку Microsoft Speech Platform SDK 11, которая в настоящее время поддерживает 26 языков.
Нас интересует пространство имен Microsoft.Speech.Recognition, которое обеспечивает функциональные возможности для создание речевых грамматик.
Движки распознавания используют семантическую информацию в грамматиках для интерпретации результатов распознавания.
Грамматики — это правила на языке разметки XML, которые определяют слова и фразы, которые движок распознавания речи может распознать. Фразы и подвыражения, как правило представлены отдельными правилами и могут объединены в более крупные фразы и предложений по правилам более высокого уровня. Грамматики описаны на сайте W3C: www.w3.org/TR/speech-grammar.
Рассмотрим пример голосовой команды прокладки маршрута от точки А к точке Б.
Грамматика будет выглядеть таким образом:
Грамматика состоит из элементов и атрибутов. Фразы помещаются в атрибут item списка one-of.
В элемент tag можно записать семантическую информацию, которую при распознавании фразы можно извлечь. Для ссылки на другие правила используется элемент ruleref, результат от
ссылочного правила можно получить, используя $$.
Таким образом, если результат распознавания успешный, то мы получим в переменных: cmd – имя команды route, from – точку А, to – точку Б.
Теперь как получить в коде значения элемента tag.
Таким образом, можно управлять приложениями или объектами операционной системы с помощью голоса, создавать интерактивные диалоговые системы.
Нас интересует пространство имен Microsoft.Speech.Recognition, которое обеспечивает функциональные возможности для создание речевых грамматик.
Движки распознавания используют семантическую информацию в грамматиках для интерпретации результатов распознавания.
Грамматики — это правила на языке разметки XML, которые определяют слова и фразы, которые движок распознавания речи может распознать. Фразы и подвыражения, как правило представлены отдельными правилами и могут объединены в более крупные фразы и предложений по правилам более высокого уровня. Грамматики описаны на сайте W3C: www.w3.org/TR/speech-grammar.
Рассмотрим пример голосовой команды прокладки маршрута от точки А к точке Б.
Грамматика будет выглядеть таким образом:
<?xml version="1.0" encoding="UTF-8" ?>
<grammar version="1.0" xml:lang="ru-RU" root="Маршруты"
xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics-ms/1.0">
<rule id = "Маршруты" scope = "public">
<one-of>
<item>проложи маршрут<tag> $.cmd = "route"</tag>
<item>от<ruleref uri="#Города"/><tag> $.from = $$</tag></item>
<item>до <ruleref uri="#Города"/><tag> $.to = $$</tag></item>
</item>
</one-of>
</rule>
<rule id=”Города” scope=”private”>
<one-of>
<item>Москвы<tag> $ = "Москва"</tag></item>
<item>Питера<tag> $ = "Санкт-Петербург" </tag></item>
<item>Новгорода<tag> $ = "Новгород" </tag></item>
<item>Твери<tag> $ = "Тверь" </tag></item>
</one-of>
</rule>
</grammar>
Грамматика состоит из элементов и атрибутов. Фразы помещаются в атрибут item списка one-of.
В элемент tag можно записать семантическую информацию, которую при распознавании фразы можно извлечь. Для ссылки на другие правила используется элемент ruleref, результат от
ссылочного правила можно получить, используя $$.
Таким образом, если результат распознавания успешный, то мы получим в переменных: cmd – имя команды route, from – точку А, to – точку Б.
Теперь как получить в коде значения элемента tag.
//Создаем распознаватель с русской локализацией
SpeechRecognitionEngine sre = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("ru-RU"));
string grammarPath = @"C:\test\";
//Компилируем наше грамматическое правило в файл Маршруты.cfg
FileStream fs = new FileStream(grammarPath + "Маршруты.cfg", FileMode.Create);
SrgsGrammarCompiler.Compile(grammarPath + "Маршруты.grxml", (Stream)fs);
fs.Close();
Grammar gr = new Grammar(grammarPath + " Маршруты.cfg", "Маршруты");
//Загружаем скомпилированный файл грамматики
sre.LoadGrammar(gr);
//Подписываемся на событие распознавания
sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_SpeechRecognized);
//Пусть голос поступает с устройства по умолчанию
sre.SetInputToDefaultAudioDevice();
//Запускаем асинхронно распознаватель
sre.RecognizeAsync(RecognizeMode.Multiple);
//Процедура распознавания
void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
//Распознанная фраза
string recoString = e.Result.Text;
//Имя команды
string cmdName = e.Result.Semantics["cmd"].Value.ToString();
//Точка А маршрута
string pointA = e.Result.Semantics["from"].Value.ToString();
//Точка Б маршрута
string pointB = e.Result.Semantics["to"].Value.ToString();
//Показываем сообщение
MessageBox.Show($"Маршрут от точки А: {pointA} до точки Б: {pointB}");
}
Таким образом, можно управлять приложениями или объектами операционной системы с помощью голоса, создавать интерактивные диалоговые системы.