语音控制游戏
跟语音识别差不多,只是把所作的命令转化为api对键盘的操作
from win32com.client import constants
import os
import win32api
import win32con
import time
import win32com.client
import pythoncom
class SpeechRecognition:
def __init__(self, wordsToAdd):
self.speaker = win32com.client.Dispatch("SAPI.SpVoice")
self.listener = win32com.client.Dispatch("SAPI.SpSharedRecognizer")
self.context = self.listener.CreateRecoContext()
self.grammar = self.context.CreateGrammar()
self.grammar.DictationSetState(0)
self.wordsRule = self.grammar.Rules.Add("wordsRule", constants.SRATopLevel + constants.SRADynamic, 0)
self.wordsRule.Clear()
[self.wordsRule.InitialState.AddWordTransition(None, word) for word in wordsToAdd]
self.grammar.Rules.Commit()
self.grammar.CmdSetRuleState("wordsRule", 1)
self.grammar.Rules.Commit()
self.eventHandler = ContextEvents(self.context)
self.say("Started successfully")
def say(self, phrase):
self.speaker.Speak(phrase)
class ContextEvents(win32com.client.getevents("SAPI.SpSharedRecoContext")):
def OnRecognition(self, StreamNumber, StreamPosition, RecognitionType, Result):
newResult = win32com.client.Dispatch(Result)
print("你说 ", newResult.PhraseInfo.GetText())
speechstr = newResult.PhraseInfo.GetText()
if speechstr == "趴下":
win32api.keybd_event(89, 0, 0, 0) #89对应键盘的y键,按下,经过0.1秒后,y键抬起
time.sleep(0.1)
win32api.keybd_event(89, 0, win32con.KEYEVENTF_KEYUP, 0)
elif speechstr == "起来":
win32api.keybd_event(32, 0, 0, 0)
time.sleep(0.1)
win32api.keybd_event(32, 0, win32con.KEYEVENTF_KEYUP, 0)
elif speechstr == "龙王破":
win32api.keybd_event(83, 0, 0, 0)
time.sleep(0.1)
win32api.keybd_event(83, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(87, 0, 0, 0)
time.sleep(0.1)
win32api.keybd_event(87, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(87, 0, 0, 0)
time.sleep(0.1)
win32api.keybd_event(87, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0,0) #鼠标左键按下
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0,0) #鼠标左键抬起
elif speechstr == "穿心破":
win32api.keybd_event(87, 0, 0, 0)
time.sleep(0.1)
win32api.keybd_event(87, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(87, 0, 0, 0)
time.sleep(0.1)
win32api.keybd_event(87, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(87, 0, 0, 0)
time.sleep(0.1)
win32api.keybd_event(87, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0)
elif speechstr == "翔天破":
win32api.keybd_event(65, 0, 0, 0)
time.sleep(0.1)
win32api.keybd_event(65, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(68, 0, 0, 0)
time.sleep(0.1)
win32api.keybd_event(68, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(87, 0, 0, 0)
time.sleep(0.1)
win32api.keybd_event(87, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0)
elif speechstr == "":
pass
elif speechstr == "闪":
win32api.keybd_event(82, 0, 0, 0)
time.sleep(0.1)
win32api.keybd_event(82, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(68, 0, 0, 0)
time.sleep(0.1)
win32api.keybd_event(68, 0, win32con.KEYEVENTF_KEYUP, 0)
if __name__ == '__main__':
wordsToAdd = ["趴下", "起来", "龙王破", "穿心破", "翔天破", "闪"]
speechReco = SpeechRecognition(wordsToAdd)
while True:
pythoncom.PumpWaitingMessages()