Как стать автором
Обновить

Распознавания речи и C#

На платформе .Net для распознавания речи можно использовать библиотеку Microsoft Speech Platform SDK 11, которая в настоящее время поддерживает 26 языков.

Нас интересует пространство имен 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}");
}

Таким образом, можно управлять приложениями или объектами операционной системы с помощью голоса, создавать интерактивные диалоговые системы.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.