Распознавание речи. Перевод статьи John T Yung "Speech Recognition". Оригинал - DeveloperFusion
Совсем недавно я начал работу над програмой, которая выполняет различные действия в среде Windows без ввода с клавиатуры или мыши. Принцип ее действия основывается на восприятии компьютером речи (Voice&Speech Recognition). Сначала я предполагал, что задание это будет не из легких, но после скоротечного знакомства с этой технологией я понял, что это совсем не так.
Микрософт уже достаточно долго занимается разработками в области речевых технологий. На официальном сайте корпорации был даже открыт целый раздел (http://www.microsoft.com/speech), посвященный проблемам распознавания голоса и речи. Для работы с Voice Recognition вам потребуется установить Microsoft Speech Recognition Engine. Скачать его можно с http://www.microsoft.com/products/msagent/downloads.htm. Да, не забудьте взять Microsoft Agent and language support там же.
Создаем новый VB-проект. Переходим на вкладку Project/Components. Поключим к нашему проекту Microsoft Direct Speech Recognition. Помните, этот компонент отображается(а, следовательно и существует) только если вы установили Microsoft Speech Engine. После выбора компонент Speech Recognition должен появиться на панели компонентов. Визуально он очень напоминает ухо, правда немного усохшее. Поместим этот компонент на форму. При этом он получает внутрисистемное имя DirectSR, что обозначает Direct Speech Recognition.
Приступим непосредственно к программированию. Выбираем все тот же компонент DirectSR1 и пишем процедуру 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. Он будет содержать слово, фразу или голосовую команду.
Теперь нам необходимо задать слова, которые Speech Engine будет узнавать. Для этого подправим процедуру Form Onload. Как же это сделать? А очень просто!
Private Sub Form_Load()
Dim totaldata As String
'[Grammar], отвечает за установку кодировки. (1033) - английский
'[], команды для распознавания
totaldata = "[Grammar]" & vbCrLf & _
"langid = 1033" & vbCrLf & _
"type=cfg" & vbCrLf & _
"[]" & vbCrLf & _
"=Notepad" & vbCrLf & _
"=Volume" & vbCrLf & _
"=Media Player" & vbCrLf
DirectSR1.GrammarFromString (totaldata)
dim engine
engine = DirectSR1.Find("MfgName=Microsoft")
DirectSR1.Select engine
DirectSR1.Activate
В исходном коде трех строчек посередине не было. Их добавил комментарием к этой статье kevin8084, ссылаясь на то, что без кода определения отдельного движка ничего работать не будет.
Каждая строка, начинающаяся со "=, содержит слово, которое DirectSR будет распознавать. Для примера мы взяли слова Notepad, Volume и Media Player. Знаете почему? Конечно, проговаривая эти слова мы будем запускать соответствующие программы. DirectSR1.Activate включает движок VR. DirectSR1.Deactivate - выключает.
Практически все готово. Теперь оперируем процедуру PhraseFinish.
Dim sFile As String
Dim noth As Long
Select Case Phrase
Case "Notepad"
sFile = "\system32\notepad.exe"
noth = ShellExecute(0, "OPEN", Environ("SystemRoot") & sFile, "", "", 1)
Case "Volume"
sFile = "\system32\sndvol32.exe"
noth = ShellExecute(0, "OPEN", Environ("SystemRoot") & sFile, "", "", 1)
Case "Media Player:
sFile = "C:\Program Files\Windows Media Player\mplayer2.exe"
noth = ShellExecute(0, "OPEN", sFile, "", "", 1)
End Select
Для запуска программ мы используем Апи функцию ShellExecute(). Объявим ее:
Option Explicit
Private 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
Разберемся с интерфейсом. Вешаем на форму две кнопки для включения и выключения VR-движка. Ну и Label для того, чтобы прога могла туда писать все, что она о нас думает.
Private Sub Command1_Click()
Select Case Command1.Caption
Case "Disable"
DirectSR1.Deactivate
Command1.Caption = "Enable"
Label1 = "Disabled"
Case "Enable"
dim engine
engine = DirectSR1.Find("MfgName=Microsoft")
DirectSR1.Select engine
DirectSR1.Activate
Command1.Caption = "Disable"
Label1 = "Ready"
End Select
End Sub
Для пущей красоты добавим это в PhraseFinish:
If Phrase <> "" Then
Label1.caption = "Matched word is " & Phrase
' Мы что-то сказали.
Else
label1.caption = "No word matched"
' Ничего не слышу
End If
Програма complete. Спешу всех огорчить - у меня она не работала. Ссылалась на бажный engine. На бурю вопросов "нафига писал", "зачем надо" и т.д. отвечу, разобраться в принципах работы и отдеббагить прогу будет вашим доашним заданием. Ведь кодер должен разбираться в алгоритмах програмы сам.
Happy radiation.