Создания программы, распознающей голос с использованием ActiveX компонента MS Speech Recognition Engine.

Пишем первую программу, распознающую голос
Автор: Адрей Диканский

Данная статья является переводом статьи
http://www.vbip.com/miscellaneous/Speech-Recognition.asp

От переводчика

Признаюсь честно, что я позволил себе сделать весьма вольный перевод статьи, дополнив её некоторыми наблюдениями из собственного опыта. Когда я почитывал очередной выпуск vbwire, на глаза мне попалась заметка примерно следующего содержания: "Сайт www.vbip.com опубликовал статью "Пишем первую программу, распознающую голос". Автор статьи - John T. Yung, объясняет процесс создания простой программы, распознающей голос с использованием ActiveX компонента MS Speech Recognition Engine".
Заметка заинтересовала меня, вот я и кликнул по ссылке [http://vbwire.com/nl?4450]. Должен сказать еще в детстве мне рассказывали о роботах, которые выполняют любой приказ человека, стоит лишь только сказать и твоя команда будет выполнена. Именно благодаря этому детскому интересу я кликнул по следующей ссылке [http://www.vbip.com/miscellaneous/Speech-Recognition.asp] и перешёл к самой статье. Далее я буду говорить от лица ее автора.

На днях мне попалась программа, которая могла выполнять голосовые команды и выполнять задания, такие как открыть определенную программу или файл, без использования мышки или клавиатуры. Сначала это мне показалось действительно удивительно и невероятно, но при более подробном рассмотрении всё оказалось гораздо проще. На самом деле создание ПО, распознающего голос очень простое дело и я сейчас Вам расскажу как можно сделать собственную программу, выполняющую голосовые команды .
Microsoft работала над разработкой программ "понимающих" голос человека несколько лет. У них даже есть свой сайт посвященный этому (http://www.microsoft.com/speech). Чтобы начать разработку программ, распознающих голос у Вас на компьютере должен быть установлен Microsoft Speech Recognition Engine. Скачать его можно на сайте Microsoft.

В диалоговом окне Components выберете компонент Microsoft Direct Speech Recognition чтобы данный компонент был доступен для Вашего проекта. Эта опция доступна только в том случае, если Microsoft Speech Engine установлен на вашем компьютере

Итак, начнём создание программы на Visual Basic. Выбираем Стандартный ЕХЕ проект, затем кликаем по меню Project, выбираем пункт Components. В появившемся окне отмечаем компонент Microsoft Direct Speech Recognition (рис. 1). Помните, что данная опция доступна только в том случае, если на Вашем компьютере установлен Microsoft Speech Recognition Engine! После этого иконка с изображением уха появится на панели инструментов (рис 2) это и есть компонент Speech Recognition. Поместите его на форму Вашего проекта. Теперь проект использует DirectSR компонент, иконку которого видно на форме, а название в окне кода (рис 3).

Иконка с изображением уха появится на панели инструментов, демонстрируя компонент DirectSR

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

В окне кода в левом верхнем выпадающем меню выберете DirectSR1 и в правом верхнем выпадающем меню выберете PhraseFinish

После того как Вы выбрали процедуру PhraseFinish появится вот такой код:

Private Sub DirectSR1_PhraseFinish(ByVal flags As Long, _
ByVal beginhi As Long, ByVal beginlo As Long, ByVal endhi As Long, _
ByVal endlo As Long, ByVal Phrase As String, ByVal parsed As String, ByVal results As Long)

"Там слишком много параметров!"- скажете Вы. Но не волнуйтесь, единственное что Вам нужно - это знать назначение параметра Phrase. Данный параметр является строкой, содержащей распознанное слово, обработанное DirectSR.

Теперь от нас требуется ввести последовательность слов, чтобы DirectSR мог их распознать. Задание очень простое, мы просто набиваем последовательность слов (будущих команд компьютеру) в процедуре Load формы. Но как же мы это сделаем? А все гениальное - просто. Дело в том, что для ввода последовательности слов у DirectSR есть два замечательных метода это - DirectSR1.GrammarFromString, которое принимает значение строковой переменой, содержащей слова и DirectSR1.GrammarFromFile, которое принимает значение пути к текстовому файлу, содержащему слова.

Мы будем использовать метод DirectSR1.GrammarFromString потому что он обладает большей гибкостью: у Вас есть возможность динамически добавлять слова, а так же добавлять слова из файла, используя метод DirectSR1.GrammarFromFile, путём присвоения значению переменной текст из файла.

В процедуре Load формы добавьте следующий код.

Dim totaldata As String
totaldata = totaldata & "=Notepad" & vbCrLf _
& "=Volume" & vbCrLf & "=Media Player" & vbCrLf
DirectSR1.GrammarFromString (totaldata)
DirectSR1.Activate

Вот что из себя представляет строковая переменная. В каждой строке, содержащей слово, используется тег "", чтобы указать следующее за тегом слово, которое должен распознать DirectSR. Вы уже догадались, что такое Notepad, Volume и Media Player? Молодцы! Правильно! Мы используем эти слова для голосовых команд, чтобы запустить соответствующие программы. Кроме того, мы используем команду DirectSR1.Activate чтобы данный компонент начал распознавать голосовые команды.

Почти закончили. Всё что осталось сделать - вернуться к процедуре PhraseFinish чтобы произвести грамматический разбор команды. Это довольно просто, самое главное это помнить, что нам нужно всего лишь знать использование параметра Phrase. Итак, получаем следующий код.

Dim sFile As String
Dim noth As Long
Select Case Phrase
Case "Notepad"
sFile = "system32 otepad.exe"
noth = ShellExecute(0, "OPEN", _
Environ("SystemRoot") & sFile, "", "", 1)
Case "Volume"
sFile = "system32sndvol32.exe"
noth = ShellExecute(0, "OPEN", _
Environ("SystemRoot") & sFile, "", "", 1)
Case "Media Player"
sFile = "C:Program FilesWindows Media Playermplayer2.exe"
noth = ShellExecute(0, "OPEN", _ sFile, "", "", 1)
End Select

Когда DirectSR узнает звук, он его обработает и подберёт наиболее подходящее под этот звук слово. Если процесс подборки соответствующего слова завершился успешно, то значением переменной Phrase будет подобранное слово. Код, использованный в конструкции Select Case, определяет значение переменной Phrase в соответствии со словами, которые мы объявили в процедуре Load формы проекта. При успешной подборке слова мы используем API функцию ShellExecute() для открытия соответствующей программы.
Чтобы объявить данную API функцию добавьте следующий код в модуль проекта.

Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal _
lpOperation As String, ByVal lpFile As String, ByVal _
lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

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

Таким образом, установите на форме кнопку и лейбл. Кликните два раза по кнопке и вставьте следующий код в открывшееся окно кода.

Private Sub Command1_Click()
Select Case Command3.Caption
Case Is = "Disable"
DirectSR1.Deactivate
Command3.Caption = "Enable"
Labe11 = "Disabled"
Case Is = "Enable"
DirectSR1.Activate
Command3.Caption = "Disable"
Labe11 = "Ready"
End Select
End Sub

В данном отрывке кода мы используем Select Case для определения надписи на кнопке. Если Disable значит, останавливаем распознавание, устанавливаем надпись кнопки в значение "Enable" и устанавливаем надпись лейбла в значение "Disabled". Если Enable, то активизируем распознавание, устанавливаем значение надписи на кнопке в "Disable" и устанавливаем значение надписи на лейбле в "Ready". Помните, что надпись на кнопке и на лейбле - не одно и то же.

Терпение, мы очень близки к завершению. Последний штрих - это отображение значения переменной Phrase для того чтобы пользователь понял какое слово выдал DirectSR. Мы можем осуществить это путём добавления вот такого кода в процедуру PhraseFinish.

If Phrase <> "" Then
Label1.caption = "Matched word is " & Phrase
Else : Label1.caption = "No word matched"
End If

Сохраните Ваш проект, нажмите F5 и запустите его. Скажите команду Notepad и посмотрите как откроется программа. Круто, правда? Как видите это только простенькая программа, но всё зависит только от Вас и от вашего воображения. В нашей следующей статье мы добавим несколько фич к программе, например, попросим компьютер поговорить с Вами.

Удачи и удачного программирования!

От переводчика

Ну вот я и закончил перевод этой чудной статьи. Как я уже говорил, мой выбор статьи для перевода не случаен. Мой интерес продолжал расти и я заскочил на http://www.microsoft.com/speech. Я считаю своим долгом донести до читателя всё мною увиденное, т.к. оно меня также поразило. Итак, вот файлы для скачивания и их размеры, предлагаемые Microsoft:

Speech SDK 5.1 (68 MB)
http://download.microsoft.com/download/speechSDK/SDK/5.1/WXP/EN-US/speec...

5.1 Language Pack (81.5 MB)
http://download.microsoft.com/download/speechSDK/SDK/5.1/WXP/EN-US/speec...

Redistributables (128 MB)
http://download.microsoft.com/download/speechSDK/SDK/5.1/WXP/EN-US/speec...

Documentation (2.28 MB)
http://download.microsoft.com/download/speechSDK/SDK/5.1/WXP/EN-US/sapi.chm

Что такое Speech SDK 5.1 (68 MB) я думаю Вы уже догадались. Да это как раз те файлы, без которых Вы не сможете написать прогу, распознающую голос. Microsoft позаботилась о японцах и корейцах для их языка они сделали специальный 5.1 Language Pack (81.5 MB). Ну а если Вы хотите официально распространять свою голосовую прогу, то Вам не обойтись от Redistributables (128 MB). Ну зачем файл Documentation (2.28 MB) и так всем ясно.

Требования к ОС
· MicrosoftR WindowsR XP Professional or Home Edition; все версии.
· Microsoft Windows 2000 все версии; все языковые версии.
· Microsoft Windows Millennium Edition; все языковые версии.
· Microsoft Windows 98 все версии; все языковые версии.
· Microsoft Windows NT 4.0 Workstation or Server, Service Pack 6a, Английская, Японская или Корейская версия.
· Windows 95 или ранее не поддерживается.
Я не думаю, что людей пользующихся 95-ой еще много, хотя сам состою в их числе, поэтому последний пункт меня сильно расстроил.

Требования к программному обеспечению опишу покороче:
· Microsoft Internet ExplorerR 5.0 или поздняя версия. Пользователям Windows NT 4.0 потребуется Microsoft Internet Explorer 5.5 или поздняя версия.
· Microsoft Visual C++R 6.0, Service Pack 3 или поздняя версия нужны чтобы запускать примеры SAPI 5 SDK. А вообще для написания SAPI приложений подойдёт любой 32-битный Си компилятор. Microsoft Visual BasicR 6.0

Требования к аппаратному обеспечению
· A Pentium II or Pentium II-equivalent; 128 MB RAM
· Микрофон и причём желательно качественный, т.к. качество функционирования голосовой программы будет зависеть и от качества микрофона или другого устройства для ввода голосовой информации
· Не все звуковые карты поддерживают SAPI 5, даже если ОС поддерживает SAPI 5

Вот такие пироги. Конечно, такие требования, несколько смерили мой пыл в написании голосовых программ, но несмотря ни на что я всё таки попытаюсь скачать Speech SDK 5.1 и написать свою первую программу, распознающую голос.

Автор статьи John T. Yung [johntyung@yahoo.com]
Перевод выполнил Диканский Андрей [andikk@mail.ru]

Голосовать: 
0
Голосов пока нет