Pull to refresh

Распознавания речи и 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}");
}

Таким образом, можно управлять приложениями или объектами операционной системы с помощью голоса, создавать интерактивные диалоговые системы.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.