Всем добрый, есть скрипт из темы
Работает, воспроизводит текст.
Есть ли возможность определить текущее воспроизводимое слово во время воспроизведения?
Встретилось несколько статей: 1, 2, 3, 4
Но я так и не смог ничего толкового придумать как прикрутить к Autoit, видимо нужно вызвать некое Event событие для получения в реальном времени данных. Необходимо получать: слово, начальную позицию и конечную...
Если кто в теме, буду благодарен.
Сам скрипт:
Нашёл ещё несколько тем, к примеру на офф форуме , на нём есть UDF, связанная с SAPI - одни пишут, что работает, а в каких-то условиях не работает
У меня ни найденные в инете vbs скрипты, ни примеры на Autoit не дают результата - выдаётся ошибка примерно в одном и том же месте
У меня WIN10 64 - может это из-за системы? или что-то поменялось в SAPI методах?
Вот скрипт, который когда-то где-то у кого-то работал...
Работает, воспроизводит текст.
Есть ли возможность определить текущее воспроизводимое слово во время воспроизведения?
Встретилось несколько статей: 1, 2, 3, 4
Но я так и не смог ничего толкового придумать как прикрутить к Autoit, видимо нужно вызвать некое Event событие для получения в реальном времени данных. Необходимо получать: слово, начальную позицию и конечную...
Если кто в теме, буду благодарен.
Сам скрипт:
Код:
#Include <Array.au3>
#include <GUIConstants.au3>
#include <GuiComboBox.au3>
Global $voicequeue, $In = 3, $bVolume, $bRate, $Text, $Prav, $voice, $Playing = False, $voice = ObjCreate("SAPI.SpVoice")
Global $mfile, $mOpen, $mSave, $mExit, $mView, $mlng, $mlang, $mlrus, $mVosp, $mSpeak, $mPause, $mStop, $mhelp, $mAbout, $V, $S
$Window = GUICreate("Text to Speech", 640, 480, -1, -1)
AdlibRegister("Set", 50)
$mfile = GUICtrlCreateMenu ("Файл")
$mOpen = GUICtrlCreateMenuitem ("Открыть", $mfile)
$mSave = GUICtrlCreateMenuitem ("Сохранить", $mfile)
GUICtrlCreateMenuitem ( "", $mfile)
$mExit = GUICtrlCreateMenuitem ( "Выход", $mfile)
$mVosp = GUICtrlCreateMenu("Воспроизведение")
$mSpeak = GUICtrlCreateMenuitem("Воспроизведение", $mVosp)
$mPause = GUICtrlCreateMenuitem("Пауза", $mVosp)
$mStop = GUICtrlCreateMenuitem("Стоп", $mVosp)
$mhelp = GUICtrlCreateMenu ("Справка")
$mAbout = GUICtrlCreateMenuitem ( "О Программе", $mhelp)
$V = GUICtrlCreateLabel("Громкость", 490, 31, 150, 13)
GUICtrlSetFont(-1, 7.5)
$Vol = GUICtrlCreateLabel("50%", 600, 31, 27, 13)
GUICtrlSetFont(-1, 7.5)
$bVolume = GUICtrlCreateSlider(480, 42, 150, 20, 0x8818)
GUICtrlSetData(-1, 50)
$S = GUICtrlCreateLabel("Скорость", 290, 31, 100, 13)
GUICtrlSetFont(-1, 7.5)
$Ste = GUICtrlCreateLabel("50%", 400, 31, 27, 15)
GUICtrlSetFont(-1, 7.5)
$bRate = GUICtrlCreateSlider(280, 42, 150, 20, 0x8818)
GUICtrlSetData(-1, 50)
GUICtrlCreateLabel("", 0, 29, 645, 1, 0x010)
If @OSVersion = "Win_7" or @OSVersion = "Win_8" Then
$Speak = GUICtrlCreateButton("", 5, 1, 26, 26, 0x0040)
GUICtrlSetImage(-1, "psr.exe", -4, 0)
$Pause = GUICtrlCreateButton("", 30, 1, 26, 26, 0x0040)
GUICtrlSetImage(-1, "psr.exe", -3, 0)
$Stop = GUICtrlCreateButton("", 55, 1, 26, 26, 0x0040)
GUICtrlSetImage(-1, "psr.exe", -6, 0)
Else
$Speak = GUICtrlCreateButton("►", 5, 1, 26, 26)
GUICtrlSetFont(-1, 14)
$Pause = GUICtrlCreateButton("||", 30, 1, 26, 26)
GUICtrlSetFont(-1, 10, 800)
$Stop = GUICtrlCreateButton("▪", 55, 1, 26, 26)
GUICtrlSetFont(-1, 30)
EndIf
$Combo1 = GUICtrlCreateCombo("", 5, 34, 220, 25, 3)
Dim $voic = ObjCreate("SAPI.SpVoice")
Dim $SOTokens = $Voic.GetVoices('', '')
For $Token In $SOTokens
GUICtrlSetData($Combo1, $Token.GetDescription, RegRead(RegRead("HKEY_CURRENT_USER\Software\Microsoft\Speech\Voices", "DefaultTokenId"), ""))
Next
$Text = GUICtrlCreateEdit("", 0, 60, 640, 400, 0x00200000 + 0x1000)
GUICtrlSetState(-1, 256)
GUISetState()
While 1
Switch GUIGetMsg()
Case -3, $mExit
Exit
Case $mAbout
Wabout()
Case -8
GUICtrlSetState($Text, 256)
Case $mSpeak, $Speak
If Not $Playing Then
$Playing = True
If Not IsObj($voice) Then Exit MsgBox(0, "TTS Ошибка", "Не удалось запустить SAPI.SpVoice, пожалуйста, убедитесь, что голосовые движки установлены!")
$string = GUICtrlRead($Text)
$voice.Voice = $voice.GetVoices().Item(_GUICtrlComboBox_GetCurSel($Combo1))
$voice.Speak($string, 11)
$Playing = False
Else
$voice.Resume()
$Playing = False
EndIf
Case $mPause, $Pause
$voice.Pause()
$Playing = True
Case $mStop, $Stop
$voice.Speak("", 11)
$Playing = False
Case $mOpen
$File = FileOpenDialog ("Открыть файл", @MyDocumentsDir, "Текст (*.txt)|")
If Not $File Then
Else
GUICtrlSetData($Text, GUICtrlRead($Text) & FileRead($File))
EndIf
Case $mSave
$File = FileSaveDialog ("Сохранение", @MyDocumentsDir, "Текст (*.txt)|")
If Not $File Then
Else
FileOpen($File & ".txt", 2)
FileWrite ($File & ".txt", GUICtrlRead($Text))
EndIf
Case $bVolume
GUICtrlSetData($Vol, GUICtrlRead($bVolume) & "%")
Case $bRate
GUICtrlSetData($Ste, GUICtrlRead($bRate) & "%")
EndSwitch
WEnd
Func Wabout()
$IWin = GUICreate("About", 300, 170, 175, 120, -2138832897, 448, $Window)
GUISetBkColor (0x2F56BE)
$IEx = GUICtrlCreateButton ("OK", 130, 145, 50, 20)
GUICtrlCreateLabel ("Autoit", 10, -5, 200, 70)
GUICtrlSetColor (-1, 0xcfffff)
GUICtrlSetFont (-1, 60, 400, 1, "Giddyup Std")
GUICtrlCreateLabel ("Text to Speech", 12, 67, 200, 50)
GUICtrlSetColor (-1, 0xffffff)
GUICtrlSetFont (-1, 12, 1000)
GUICtrlCreateLabel ("Version: 1.5", 12, 93, 200, 50)
GUICtrlSetColor (-1, 0xffffff)
GUICtrlSetFont (-1, 7.5)
GUICtrlCreateLabel ("© 2013 GUIMish. All Rights Reserved.", 12, 120, 200, 15)
GUICtrlSetColor (-1, 0xffffff)
GUICtrlSetFont (-1, 7)
GUISetState()
Do
Until GUIGetMsg() = $IEx
GUIDelete()
EndFunc
Func Set()
$voice.Volume = GUICtrlRead($bVolume)
$voice.Rate = GUICtrlRead($bRate) - 50
EndFunc
Сообщение автоматически объединено:
Нашёл ещё несколько тем, к примеру на офф форуме , на нём есть UDF, связанная с SAPI - одни пишут, что работает, а в каких-то условиях не работает
У меня ни найденные в инете vbs скрипты, ни примеры на Autoit не дают результата - выдаётся ошибка примерно в одном и том же месте
Код:
Global $h_Context = ObjCreate("SAPI.SpInProcRecoContext")
Global $h_Recognizer = $h_Context.Recognizer
У меня WIN10 64 - может это из-за системы? или что-то поменялось в SAPI методах?
Вот скрипт, который когда-то где-то у кого-то работал...
Код:
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
Последнее редактирование: