는 Autohotkey_L 용입니다.
기존의 코드에서 일부분을 가져와 수정해서 만든 것이며, 마우스로는 작동하지 않고 원래의 키보드 단축키인 aswe로 동작합니다... 잘못된 거 누르면 다시 읽어줍니다...
마우스로 되지 않는 이유는, 단순히 클릭으로 영역을 찾기 때문에 드래그 등의 일반 동작조차 불가능해진다는 점 때문입니다. 게다가 전 키보드로 하거든요.
기존의 코드 : sssFP - jMemorize로 영단어 암기할 때 발음 듣고 사전 보며 암기하기
(기존의 코드는 제가 만들었던 게 아닙니다!)
이 분의 스크립트로부터의 수정입니다.
SetTitleMatchMode, 2
Voice := ComObjCreate("SAPI.SpVoice")
send_count_a = 0
#ifWinActive, 1.3.0
CoordMode, Pixel, Relative ;상대적 픽셀 위치 검색
CoordMode, Mouse, Relative ;상대적 마우스 위치 / 클릭 등
q::
sendInput $q ;일단 페이지를 넘깁니다. (정상입력처리)
sleep 80
PixelSearch, FoundX, FoundY, 200, 125, 220, 990, 0xC8F0FF, 1, Fast ;노란 바탕색
if ErrorLevel = 0 ;암기중이라면 (노란색이면) 함수를 실행합니다. (공통부분)
c2sOut := dic()
if c2sOut != 1
TTS(Voice, "Speak", c2sOut)
return
return
w::
sendInput $w ;일단 페이지를 넘깁니다. (정상입력처리)
sleep 80
PixelSearch, FoundX, FoundY, 200, 125, 220, 990, 0xC8F0FF, 1, Fast ;노란 바탕색
if ErrorLevel = 0 ;암기중이라면 (노란색이면) 함수를 실행합니다. (공통부분)
c2sOut := dic()
if c2sOut != 1
TTS(Voice, "Speak", c2sOut)
return
return
a::
sendInput $a ;일단 페이지를 넘깁니다. (정상입력처리)
sleep 80
PixelSearch, FoundX, FoundY, 200, 125, 220, 990, 0xC8F0FF, 1, Fast ;노란 바탕색
if ErrorLevel = 0 ;암기중이라면 (노란색이면) 함수를 실행합니다. (공통부분)
c2sOut := dic()
if c2sOut != 1
TTS(Voice, "Speak", c2sOut)
return
return
s::
sendInput $s ;일단 페이지를 넘깁니다. (정상입력처리)
sleep 80
PixelSearch, FoundX, FoundY, 200, 125, 220, 990, 0xC8F0FF, 1, Fast ;노란 바탕색
if ErrorLevel = 0 ;암기중이라면 (노란색이면) 함수를 실행합니다. (공통부분)
c2sOut := dic()
if c2sOut != 1
TTS(Voice, "Speak", c2sOut)
return
dic()
{
c2sOut := 1
PixelSearch, FoundX, FoundY, 200, 125, 220, 990, 0xC8F0FF, 1, Fast ;노란 바탕색
;traytip, dic()이 작동합니다., haha, 30
;tooltip, Activated
sleep 80 ;혹시 모를 에러에 대비합니다. 장면이 바뀌는 걸 기다립니다.
x1 :=FoundX
y1 :=FoundY+5
x2 :=x1+20
y2 :=y1+10
clkX :=FoundX+5
clkY :=FoundY+35
PixelSearch, FoundX, FoundY, x1, y1, x2, y2, 0x000000, 1, Fast ;비활성 글자색 검정색 아님 > 플래시카드 앞면
if ErrorLevel != 0 ;글자색이 활성(검정색)이 아니면 > 플래시카드 앞면으로 판단하고 아래를 실행
{
;traytip, 글자색이 검정색이 아님을 확인하였습니다., haha
MouseGetPos, OriginalX, OriginalY
MouseClick, Left, clkX, clkY, 1, 0
MouseMove, OriginalX, OriginalY, 0
saveclip := Clipboard
Clipboard = ;클립보드를 비웁니다.ClipWait 예제로부터.
Sendinput ^a^c ;전체선택해서 복사합니다.
Sendinput, {tab}
ClipWait, 2
if ErrorLevel
{
Traytip, 헉... 복사 실패했어요! ㅠㅠ, 혹시 다른 창이 가리고 있거나 하지는 않나요?, 30
Clipboard := saveclip
lucako:=1
return
}
else
{
c2s := clipboard
Clipboard := saveclip
lucako:=0
return c2s
}
}
return
}
clipRet()
{
RetBoy := clipboard ;변수에 클립보드 내용을 저장합니다.
;TrayTip, 읽은 값은, %RetBoy%
return RetBoy ;저장한 값을 반환합니다.
}
;검색을 통해 얻은 TTS 함수입니다.
;www.autohotkey.com/community/viewtopic.php?t=57773
TTS(oVoice, command, param1="", param2="") { ; by Learning one. For AHK_L. Thanks: jballi, Sean, Frankie.
; AHK forum location: www.autohotkey.com/forum/topic57773.html
; Read more: msdn.microsoft.com/en-us/library/ms723602(v=VS.85).aspx, www.autohotkey.com/forum/topic45471.html, www.autohotkey.com/forum/topic83162.html
static CommandList := "ToggleSpeak,Speak,SpeakWait,Pause,Stop,SetRate,SetVolume,SetPitch,SetVoice,GetVoices,GetStatus,GetCount,SpeakToFile"
if command not in %CommandList%
{
MsgBox, 16, TTS() error, "%command%" is not valid command.
return
}
if command = ToggleSpeak ; speak or stop speaking
{
Status := oVoice.Status.RunningState
if Status = 1 ; finished
oVoice.Speak(param1,0x1) ; speak asynchronously
Else if Status = 0 ; paused
{
oVoice.Resume
oVoice.Speak("",0x1|0x2) ; stop
oVoice.Speak(param1,0x1) ; speak asynchronously
}
Else if Status = 2 ; reading
oVoice.Speak("",0x1|0x2) ; stop
}
Else if command = Speak ; speak asynchronously
{
Status := oVoice.Status.RunningState
if Status = 0 ; paused
oVoice.Resume
oVoice.Speak("",0x1|0x2) ; stop
oVoice.Speak(param1,0x1) ; speak asynchronously
}
Else if command = SpeakWait ; speak synchronously
{
Status := oVoice.Status.RunningState
if Status = 0 ; paused
oVoice.Resume
oVoice.Speak("",0x1|0x2) ; stop
oVoice.Speak(param1,0x0) ; speak synchronously
}
Else if command = Pause ; Pause toggle
{
Status := oVoice.Status.RunningState
if Status = 0 ; paused
oVoice.Resume
else if Status = 2 ; reading
oVoice.Pause
}
Else if command = Stop
{
Status := oVoice.Status.RunningState
if Status = 0 ; paused
oVoice.Resume
oVoice.Speak("",0x1|0x2) ; stop
}
Else if command = SetRate
oVoice.Rate := param1 ; rate (reading speed): param1 from -10 to 10. 0 is default.
Else if command = SetVolume
oVoice.Volume := param1 ; volume (reading loudness): param1 from 0 to 100. 100 is default
Else if command = SetPitch ; http://msdn.microsoft.com/en-us/library/ms717077(v=vs.85).aspx
oVoice.Speak("<pitch absmiddle = '" param1 "'/>",0x20) ; pitch : param1 from -10 to 10. 0 is default.
Else if command = SetVoice
{
Loop, % oVoice.GetVoices.Count
{
Name := oVoice.GetVoices.Item(A_Index-1).GetAttribute("Name") ; 0 based
If (Name = param1)
{
DoesVoiceExist := 1
break
}
}
if !DoesVoiceExist
{
MsgBox,64,, Voice "%param1%" does not exist.
return
}
While !(oVoice.Status.RunningState = 1)
Sleep, 20
oVoice.Voice := oVoice.GetVoices("Name=" param1).Item(0) ; set voice to param1
}
Else if command = GetVoices
{
param1 := (param1 = "") ? "`n" : param1 ; param1 as delimiter
Loop, % oVoice.GetVoices.Count
{
Name := oVoice.GetVoices.Item(A_Index-1).GetAttribute("Name") ; 0 based
VoiceList .= Name param1
}
Return RTrim(VoiceList,param1)
}
Else if command = GetStatus
{
Status := oVoice.Status.RunningState
if Status = 0 ; paused
Return "paused"
Else if Status = 1 ; finished
Return "finished"
Else if Status = 2 ; reading
Return "reading"
}
Else if command = GetCount
return oVoice.GetVoices.Count
Else if command = SpeakToFile ; param1 = TextToSpeak, param2 = OutputFilePath
{
oldAOS := oVoice.AudioOutputStream
oldAAOFCONS := oVoice.AllowAudioOutputFormatChangesOnNextSet
oVoice.AllowAudioOutputFormatChangesOnNextSet := 1
SpStream := ComObjCreate("SAPI.SpFileStream")
FileDelete, % param2 ; OutputFilePath
SpStream.Open(param2, 3)
oVoice.AudioOutputStream := SpStream
TTS(oVoice, "SpeakWait", param1)
SpStream.Close()
oVoice.AudioOutputStream := oldAOS
oVoice.AllowAudioOutputFormatChangesOnNextSet := oldAAOFCONS
}
}
TTS_CreateVoice(VoiceName="", VoiceRate="", VoiceVolume="", VoicePitch="") { ; by Learning one. For AHK_L.
oVoice := ComObjCreate("SAPI.SpVoice")
if !(VoiceName = "")
TTS(oVoice, "SetVoice", VoiceName)
if VoiceRate between -10 and 10
oVoice.Rate := VoiceRate ; rate (reading speed): from -10 to 10. 0 is default.
if VoiceVolume between 0 and 100
oVoice.Volume := VoiceVolume ; volume (reading loudness): from 0 to 100. 100 is default
if VoicePitch between -10 and 10
TTS(oVoice, "SetPitch", VoicePitch) ; pitch: from -10 to 10. 0 is default.
return oVoice
}
스크립트를 보면 뻘짓한 흔적들이 남아있군요.
하는 법 :
- Autohotkey_L[각주:1]를 다운받는다. (http://l.autohotkey.net/AutoHotkey_L_Install.exe)
- 설치한다.
아래에 첨부된 파일을 받아서 실행한다. 위에 줄여져있는 거랑 같은 내용입니다.
jmemo_say.ahk- Jmemorize로 단어를 외운다
스크립트의 원작자 분께서 카드의 앞/뒷면 파악하시는 방법을 그대로 가져와서, 색으로 인식합니다. 색 설정이 16bit 라던가 하시는 분들은 알아서 색상 바꿔주세요. WEB 색상을 2바이트식 역으로 뒤집은 꼴입니다. (HEX) (ex : #123456 → 0x563412 654321 아닙니다 주의) 바꾸는 방법은, 메모장으로 열어서 0x로 시작하는 숫자가 있는 부분을 바꾸면 됩니다.
전 게으르니까 안되도 책임은 안 집니다. 거기다가 AHK는 야매로 배운거거든요. 못 도와드릴 가능성이 커요 'ㅂ'
ps1. 근데... 나 수정 후 재배포 허가는 받았던가... 안받았네... 내리라고 하시면 내려야겠구낭...
ps2. 왜 사전이 아니고 TTS 냐고 물으시면, 1. 제 단어장에는 장문도 있어요. (...) 2. 제 능력으로는 발음의 파일명 규칙이 일정한 웹사이트를 찾지 못했습니다. 그렇다고해서 데이터를 다룰 줄 아는 것도 아니고...
- TTS 함수가 Autohotkey_L 용입니다. Autohotkey 말고요. [본문으로]