Распознавание текста

98

Распознавание текста — это средство трансляции в текст произносимой пользователем речи. Как и синтез речи, распознавание речи — средство операционной системы Windows. Распознавание текста встроено в Windows Vista и Windows 7, но не в Windows ХР. Пользователям Windows ХР оно доступно в составе Office ХР и более поздних версий, в пакете Windows ХР Plus! Pack либо в бесплатном комплекте Microsoft Speech Software Development Kit.

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

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

Наиболее простой способ использовать распознавание речи — это создать экземпляр класса SpeechRecognizer из пространства имен System.Speech.Recognition. Затем можно присоединить обработчик к событию SpeechRecognized, которое инициируется всякий раз, когда произнесенное слово успешно преобразуется в текст:

SpeechRecognizer recognizer = new SpeechRecognizer();
recognizer.SpeechRecognized += recognizer_SpeechReconized;

В обработчике событий можно извлечь текст из свойства SpeechRecognizedЕventArgs.Result. Объект SpeechRecognizer служит оболочкой для СОМ-объекта. Чтобы избежать неприятных сюрпризов, он должен быть объявлен как переменная-член в классе окна (чтобы объект существовал до тех пор, пока существует окно), а при закрытии окна должен вызываться его метод Dispose() (чтобы освободить ресурсы, занятые распознавателем речи).

Класс SpeechRecognizer в действительности генерирует последовательность событий при обнаружении аудиосигнала. В начале инициируется SpeechDetected, если звук идентифицируется как речь. Затем один или более раз инициируется SpeechHypothesized, когда слова распознаются на основе опыта. И, наконец, SpeechRecognizer инициирует событие SpeechRecognized, если ему удается успешно обработать текст, либо SpeechRecognitionRejected — если нет. Событие SpeechRecognitionRejected включает информацию о предположении SpeechRecognizer относительно того, что может означать произнесенное слово, когда степень уверенности недостаточно высока, чтобы принять ввод.

Обычно использовать распознавание речи в такой манере не рекомендуется. Это связано с тем, что WPF имеет собственное средство автоматизации пользовательского интерфейса (UI Automation), которое работает совместно с механизмом распознавания речи. При правильной конфигурации оно позволяет пользователям вводить текст в текстовых элементах управления и инициировать щелчки на кнопках при произнесении их автоматизированных имен. С применением SpeechRecognition можно добавить поддержку более специализированных команд в специфических сценариях. Это делается путем определения грамматики, основанной на спецификации Speech Recognition Grammar Specification (SRGS).

Грамматика SRGS идентифицирует допустимые команды для приложения. Например, можно указать, что для команд используется только одно слово из небольшого набора (on или off), а эти слова разрешены только в определенных комбинациях (blue on, red on, blue off и т.д.).

Грамматика SRGS может быть сконструирована двумя способами. Можно загрузить ее из документа SRGS, который описывает правила грамматики с применением синтаксиса на основе XML. Чтобы сделать это, нужно воспользоваться классом SrgsDocument из пространства имен System.Speech.Recognition.SrgsGrammar:

SrgsDocument doc = new SrgsDocument("app_grammar.xml");
Grammar grammar = new Grammar(doc);
recognizer.LoadGrammar(grammar);

В качестве альтернативы грамматику можно сконструировать декларативно с применением GrammarBuilder. Класс GrammarBuilder играет роль, аналогичную рассмотренному в предыдущей статье PromptBuilder — позволяет добавлять правила грамматики одно за другим, создавая постепенно полное описание. Например, ниже приведена декларативно сконструированная грамматика, принимающая ввод из двух слов, где первое слово имеет пять возможных вариантов, а второе — два:

GrammarBuilder grammar = new GrammarBuilder();
grammar.Append(new Choices("red", "blue", "green", "black", "white"));
grammar.Append(new Choices("on", "off"));
recognizer.LoadGrammar(new Grammar(grammar));

Этот код разметки принимает команды вроде red on и green off. Альтернативный ввод, подобные yellow on или on red, не распознается.

Объект Choices представляет SRGS-правило одно из, позволяющее пользователю говорить одно слово из диапазона допустимых. Это наиболее универсальный ингредиент, используемый при построении грамматики. Еще несколько дополнительных перегрузок метода GrammarBuilder.Append() принимают различный ввод. Можно передать обычную строку — в этом случае грамматика требует от пользователя произнесения именно этого слова.

Можно передать строку, за которой следует значение из перечисления SubsetMatchingMode, требующее от пользователя произнесения определенной части слова или фразы. И, наконец, можно передать строку, за которой следует минимальное и максимальное количество повторений. Это позволяет грамматике игнорировать одно и то же слово, когда оно повторяется несколько раз, а также позволяет сделать слово необязательным (задав минимальное число повторов 0).

Пройди тесты
Лучший чат для C# программистов