Что нового

Распознование речи и вызов функций из скрипта

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Версия AutoIt: 3.

Описание: Приветствую всех,нашёл исходник для распознавания речи и вызова функций из скрипта по определённым условиям,проверил - работает,но Microsoft Speech SDK 5.1 плохо распознаёт слово и выводит несколько вариантов того что услышал,и ещё один минус,говорить должны на английском языке,так вот,хочется узнать возможно сделать распознавание чётче для нормальной работы и как локализовать SDK под русский язык...

Пример:Главный скрипт
Код:
AutoItSetOption ( "TrayAutoPause", 0)
Local $o_speech = ObjCreate ("SAPI.SpVoice")
$voice = $o_speech.GetVoices().Item(0)
$o_speech.Voice = $voice
$speed = 0
Global $text
While 1
gettext()
TrayTip ( "Voice Commander:", $text, 5, 1 )
Select
Case $text = "Microsoft"
MsgBox(0,'',@OSType&' '&@CRLF&@OSServicePack&' '&@CRLF&@OSVersion&' '&@CRLF&@OSArch)
$o_speech.Speak ('<rate speed="'& $speed &'">' & 'You windows system informations' & '</rate>', 8)
Exit
Case $text = "slow down"
$speed = $speed - 3
$o_speech.Speak ('<rate speed="'& $speed &'">' & 'I will talk slower for you' & '</rate>', 8)
Case $text = "speed up"
$speed = $speed + 3
$o_speech.Speak ('<rate speed="'& $speed &'">' & 'I will talk faster for you' & '</rate>', 8)
Case $text = "And"
MsgBox(0,'',"Функция работает...")
Sleep(300)
Case $text = "Since"
MsgBox(0,'',"Вторая функция работает...")
Sleep(300)
Case $text = "or Sam"
$o_speech.Speak ('<rate speed="'& $speed &'">' & 'Anna, Mary, Mike, or Sam' & '</rate>', 8)
gettext()
changevoice()
Case $text = "what time is it" or $text = "what's the time" or $text = "Give me the time"
$o_speech.Speak ('<rate speed="'& $speed &'">' & "The time is now " & @HOUR & @MIN & '</rate>', 8)
Case $text = "How are you" or $text = "How're you"
$o_speech.Speak ('<rate speed="'& $speed &'">' & "Well I have to listen to this stupid human" & '</rate>', 8)
gettext()
if $text = "what" Then
$o_speech.Speak ('<rate speed="'& $speed &'">' & "Yeah I said it, what are you going to do bitch" & '</rate>', 8)
gettext()
if $text = "kill you" Then	$o_speech.Speak ('<rate speed="'& $speed &'">' & "haha, fuck off" & '</rate>', 8)
EndIf
case $text = "memory load"
$mem = MemGetStats()
$memory = $mem[0] & " percent load"
TrayTip ( "memory load", $memory, 5, 1 )
$o_speech.Speak ('<rate speed="'& $speed &'">' & $memory & '</rate>', 8)
case $text = "available memory"
$mem = MemGetStats()
$memory = $mem[2] & " kilobytes available"
TrayTip ( "available memory", $memory, 5, 1 )
$o_speech.Speak ('<rate speed="'& $speed &'">' & $memory & '</rate>', 8)
case else
TrayTip ( $voice.GetAttribute("Name"), $text, 5, 1 )
$o_speech.Speak ('<rate speed="'& $speed &'">' & $text & '</rate>', 8)
EndSelect


WEnd

Func OnAutoItExit ( )
FileDelete ( @ScriptDir & "\voice.tmp" )
EndFunc

Func gettext()
RunWait(@ScriptDir & "\TTSList.exe")
$file = FileOpen ( "voice.tmp", 0 )
$text = FileRead ($file )
FileClose ( $file )
$file = FileOpen ( "voice.tmp", 2 )
FileWrite ($file, "")
FileClose ( $file )


Пример:TTSList его скомпилировать
Код:
;COMPILE THIS TO write.exe
#NoTrayIcon
$RecoContext=ObjCreate("SAPI.SpSharedRecoContext")
$SinkObject=ObjEvent($RecoContext,"MYEvent_")
$Grammar = $RecoContext.CreateGrammar(1)
$Grammar.DictationLoad
$Grammar.DictationSetState(1)
sleep(5000) 
$Grammar.DictationSetState(0)

Func MYEvent_Recognition($StreamNumber,$StreamPosition,$RecognitionType,$Result)
$file = FileOpen ( "voice.tmp", 2)
FileWrite ( $file, $Result.PhraseInfo.GetText )
FileClose ( $file )
exit
EndFunc


Источник: Оф.форум



Или вот ещё один пример:
Код:
Global $h_Context = ObjCreate("SAPI.SpInProcRecoContext")
Global $h_Recognizer = $h_Context.Recognizer
Global $h_Grammar = $h_Context.CreateGrammar(1)
$h_Grammar.Dictationload
$h_Grammar.DictationSetState(1)

;Create a token for the default audio input device and set it
Global $h_Category = ObjCreate("SAPI.SpObjectTokenCategory")
$h_Category.SetId("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\AudioInput\TokenEnums\MMAudioIn\")
Global $h_Token = ObjCreate("SAPI.SpObjectToken")
$h_Token.SetId("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\AudioInput\TokenEnums\MMAudioIn\")
$h_Recognizer.AudioInput = $h_Token

Global $i_ObjInitialized = 0

Global $h_ObjectEvents = ObjEvent($h_Context, "SpRecEvent_")
If @error Then
    ConsoleWrite("ObjEvent error: " & @error & @CRLF)
    $i_ObjInitialized = 0
Else
    ConsoleWrite("ObjEvent created Successfully!" & @CRLF)
    $i_ObjInitialized = 1
EndIf

While $i_ObjInitialized
    Sleep(5000)
    ;Allow the Audio In to finalize processing on the last 5 second capture
    $h_Context.Pause
    ;Resume audio in processing
    $h_Context.Resume
    ;Reset event function allocation (what is this? I think its garbage collection or something, needs clarification)
    $h_ObjectEvents = ObjEvent($h_Context, "SpRecEvent_")
WEnd

Func SpRecEvent_Hypothesis($StreamNumber, $StreamPosition, $Result)
    ConsoleWrite("Hypothesis(): Hypothized text is: " & $Result.PhraseInfo.GetText & @CRLF)
EndFunc ;==>SpRecEvent_Hypothesis

Func SpRecEvent_Recognition($StreamNumber, $StreamPosition, $RecognitionType, $Result)
    $temp = $Result.PhraseInfo.GetText
    ConsoleWrite($RecognitionType & "||" & $Result.PhraseInfo.GetText & @CRLF)
    Switch $temp
		Case 'microsoft' 
            ShellExecute('www.microsoft.com')
        Case 'music'
            Run('C:\Program Files (x86)\foobar2000\foobar2000.exe')
        Case 'and'
            Run('calc.exe')
    EndSwitch
EndFunc ;==>SpRecEvent_Recognition

Func SpRecEvent_SoundStart($StreamNumber, $StreamPosition)
    ConsoleWrite("Sound Started" & @CRLF)
EndFunc ;==>SpRecEvent_SoundStart

Func SpRecEvent_SoundEnd($StreamNumber, $StreamPosition)
    ConsoleWrite("Sound Ended" & @CRLF)
EndFunc ;==>SpRecEvent_SoundEnd


Источник: Оф.форум,там же нашёл ссылку,где есть языки для SDK
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Кто знает,где русский для SDK найти?
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Знает кто нибудь ответ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Sergey2210 [?]
Знает кто нибудь ответ?
Не нужно так часто поднимать тему. Тем более таким нетрадиционным способом (удаление своего сообщения и отправка точно такого же).

Если кто то заинтересуется в твоей теме, то обязательно ответит, наберись терпения.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
надо полагать никто. за столько времени уже ответили бы
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Ясно,буду ждать,вроде бы где то слышал что русскоязычный модуль скоро уже выпустят,да и в тех поддержу отправил сообщение на www.microsoft.ru ....
 
Верх