Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393

Голосовые команды в игре

09.02.2022, 15:03. Показов 2002. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте всем.
Работаю над скриптом голосовые команды в игре.
Вроде всё работает, говорю “а ” нажимается клавиша е.
Но какую функцию лучше использовать, чтобы она клавиша работала на самом низком уровне?
Сейчас я использую win32api.keybd_event(key1, 0, 0, 0)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import os, time, win32api, win32con
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from threading import *
 
 
KEYS = {"LBUTTON": 0x01, "RBUTTON": 0x02, "CANCEL": 0x03, "MBUTTON": 0x04, "XBUTTON1": 0x05, 
              "XBUTTON2": 0x06, "BACK": 0x08, "TAB": 0x09, "CLEAR": 0x0C, "RETURN": 0x0D, 
              "SHIFT": 0x10, "CONTROL": 0x11, "MENU": 0x12, "PAUSE": 0x13, "CAPITAL": 0x14,
              "KANA": 0x15, "JUNJA": 0x17, "FINAL": 0x18, "KANJI": 0x19, "ESCAPE": 0x1B, 
              "CONVERT": 0x1C, "NONCONVERT": 0x1D, "ACCEPT": 0x1E, "MODECHANGE": 0x1F, "SPACE": 0x20,
              "PRIOR": 0x21, "NEXT": 0x22, "END": 0x23, "HOME": 0x24, "LEFT": 0x25, "UP": 0x26, 
              "RIGHT": 0x27, "DOWN": 0x28, "SELECT": 0x29, "PRINT": 0x2A, "EXECUTE": 0x2B, 
              "SNAPSHOT": 0x2C, "INSERT": 0x2D, " DELETE": 0x2E, "HELP": 0x2F, "key0": 0x30, 
              "key1": 0x31, "key2": 0x32, " key3": 0x33, "key4": 0x34, "key5": 0x35, "key6": 0x36, "key7": 0x37, "key8": 0x38, "key9": 0x39, "A": 0x41, "B": 0x42, "C": 0x43, "D": 0x44,
              "E": 0x45, "F": 0x46, "G": 0x47, "H": 0x48, "I": 0x49,
              "J": 0x4A, "K": 0x4B, "L": 0x4C, "M": 0x4D, "N": 0x4E, "O": 0x4F, "P": 0x50, "Q": 0x51, "R": 0x52, "S": 0x53, "T": 0x54, "U": 0x55, "V": 0x56, "W": 0x57, "X": 0x58, "Y": 0x59, 
              "Z": 0x5A, "LWIN": 0x5B, "RWIN": 0x5C, "APPS": 0x5D, "SLEEP": 0x5F, "NUMPAD0": 0x60, "NUMPAD1": 0x61, "NUMPAD2": 0x62, "NUMPAD3": 0x63, "NUMPAD4": 0x64, "NUMPAD5": 0x65,
              "NUMPAD6": 0x66, "NUMPAD7": 0x67, "NUMPAD8": 0x68, "NUMPAD9": 0x69, "MULTIPLY": 0x6A, "ADD": 0x6B,
              " SEPARATOR": 0x6C, "SUBTRACT": 0x6D, "DECIMAL": 0x6E, "DIVIDE": 0x6F, "F1": 0x70, "F2": 0x71, "F3": 0x72, "F4": 0x73, "F5": 0x74, "F6": 0x75, "F7": 0x76, "F8": 0x77, "F9": 0x78, "F10": 0x79, "F11": 0x7A, "F12": 0x7B, "F13": 0x7C, "F14": 0x7D, 
              "F15": 0x7E, "F16": 0x7F, "F17": 0x80, "F18": 0x81, "F19": 0x82, "F20": 0x83, "F21": 0x84, "F22": 0x85, "F23": 0x86, "F24": 0x87, "NUMLOCK": 0x90, "SCROLL": 0x91, "OEM_FJ_JISHO": 0x92, "OEM_FJ_MASSHOU": 0x93, 
              "OEM_FJ_TOUROKU": 0x94, "OEM_FJ_LOYA": 0x95, "OEM_FJ_ROYA": 0x96, "LSHIFT": 0xA0, "RSHIFT": 0xA1, "LCONTROL": 0xA2, "RCONTROL": 0xA3, "LMENU": 0xA4, "RMENU": 0xA5, "BROWSER_BACK": 0xA6, 
              "BROWSER_FORWARD": 0xA7, "BROWSER_REFRESH": 0xA8, "BROWSER_STOP": 0xA9, "BROWSER_SEARCH": 0xAA, "BROWSER_FAVORITES": 0xAB, "BROWSER_HOME": 0xAC, "VOLUME_MUTE": 0xAD, "VOLUME_DOWN": 0xAE, 
              "VOLUME_UP": 0xAF, "MEDIA_NEXT_TRACK": 0xB0, "MEDIA_PREV_TRACK": 0xB1, "MEDIA_STOP": 0xB2, "MEDIA_PLAY_PAUSE": 0xB3, "LAUNCH_MAIL": 0xB4, "LAUNCH_MEDIA_SELECT": 0xB5, "LAUNCH_APP1": 0xB6, 
              "LAUNCH_APP2": 0xB7, "OEM_1": 0xBA, "OEM_PLUS": 0xBB, "OEM_COMMA": 0xBC, "OEM_MINUS": 0xBD, "OEM_PERIOD": 0xBE, " OEM_2": 0xBF, "OEM_3": 0xC0, "ABNT_C1": 0xC1, "ABNT_C2": 0xC2, "OEM_4": 0xDB, "OEM_5": 0xDC, "OEM_6": 0xDD, "OEM_7": 0xDE, "OEM_8": 0xDF, "OEM_AX": 0xE1,
              "OEM_102": 0xE2, "ICO_HELP": 0xE3, "PROCESSKEY": 0xE5, "ICO_CLEAR": 0xE6, "PACKET": 0xE7, "OEM_RESET": 0xE9, "OEM_JUMP": 0xEA, "OEM_PA1": 0xEB, "OEM_PA2": 0xEC, "OEM_PA3": 0xED, 
              "OEM_WSCTRL": 0xEE, "OEM_CUSEL": 0xEF, "OEM_ATTN": 0xF0, "OEM_FINISH": 0xF1, "OEM_COPY": 0xF2, "OEM_AUTO": 0xF3, "OEM_ENLW": 0xF4, "OEM_BACKTAB": 0xF5, "ATTN": 0xF6, "CRSEL": 0xF7, "EXSEL": 0xF8, " EREOF": 0xF9, "PLAY": 0xFA, "ZOOM": 0xFB, "PA1": 0xFD, " OEM_CLEAR": 0xFE
              } 
def prease_on_key(driver, word, key):
 
 while 1:
     try:
      time.sleep(2)
      text= driver.find_element_by_xpath('//*[@id="speech-display"]').text
      if len(text) != 0 and text != None:
 
       text= str(text).lower()
       word= str(text).lower()
       if word == text:
        key=key.upper()
        key1=KEYS[key]
        print(key1)
        driver.find_element_by_xpath('//*[@id="bottom-navbar"]//*[@id="mic"]').click()
        time.sleep(2)
        driver.find_element_by_xpath('//*[@id="bottom-navbar"]//*[@id="mic"]').click()
        win32api.keybd_event(key1, 0, 0, 0)
 
 
     except Exception as ex:
       print(ex)
       pass
def prease_on_key1(driver, word, key):
  t1 = Thread(target = prease_on_key, args =(driver, word, key,))
  t1.start()
 
 
 
os.system("taskkill /f /im  chromedriver.exe")
options = Options()
home =r"C:\Program Files (x86)\Google\Chrome"
options.add_argument("--use-fake-ui-for-media-stream")# звук
options.add_experimental_option("excludeSwitches", ['enable-automation']) # убрать окно
options.add_argument("--incognito")
options.binary_location = home +r"\Application\chrome.exe"
try:
  driver = webdriver.Chrome(home+r'\chromedriver\chromedriver.exe', options=options)
  driver.set_window_position(600, 650)
  driver.set_window_size(624, 368) # optiol
  driver.get("https://www.speechtexter.com")# открыть сайт
  driver.find_element_by_xpath('//*[@class="wave" and @id="b-lang"]//*[@id="lang-name-display"]').click()
  driver.find_element_by_xpath('//*[@class="lang-option" and @data-code="ru-ru"]').click() # выбор языка
  # driver.minimize_window()
  driver.find_element_by_xpath('//*[@id="bottom-navbar"]//*[@class="wave" and @id="mic"]').click()# включить запись голоса
  time.sleep(1)
 
  try:
    prease_on_key(driver,'а','e')
 
    while 1:
      time.sleep(6)
      driver.find_element_by_xpath('//*[@id="speech-display"]').clear()# удалить старый текст.
  except Exception as ex:
    pass
 
except Exception as ex:
   print(ex)
   # driver.close()
   # driver.quit()
   pass
finally:
   # pass
   driver.close()
   driver.quit()
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2022, 15:03
Ответы с готовыми решениями:

Голосовые команды
Здравствуйте, помогите пожалуйста, хотела создать голосовую команду для приложений, чтоб они открывались....но что то пошло не так....на...

Голосовые команды
Нашел данный код на просторах интернета и решил поработать с ним с целью ознакомления using System; using System.Collections; ...

Голосовые команды на форме
Доброго времени суток, необходима помощь опытных пользователей. Получается идет разработка проекта "Голосовой ассистент на...

14
148 / 111 / 37
Регистрация: 28.11.2013
Сообщений: 383
10.02.2022, 19:43
Уточните,что вам нужно, перехватывать клавиатуру будучи в игре? Что у вас не работает?
Вот примеры управления мышью и клавиатурой голосом: github VoiceKMB, pc shutdown
а нажатие клавиш можно по разному реализовывать:
Python
1
2
3
4
5
6
7
8
# in command prompt, type "pip install pynput" to install pynput.
from pynput.keyboard import Key, Controller
 
keyboard = Controller()
key = "a"
 
keyboard.press(key)
keyboard.release(key)
или так
Python
1
2
3
4
5
6
7
8
9
10
import pyautogui
 
# Holds down the alt key
pyautogui.keyDown("alt")
 
# Presses the tab key once
pyautogui.press("tab")
 
# Lets go of the alt key
pyautogui.keyUp("alt")
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
11.02.2022, 15:24  [ТС]
Skryp,

Спасибо большое за ваш ответ. Я уже всё перепробовал ничего не помогает.
Нажатия клавиши не отправляется в игру.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import os, time, win32api, win32con, ctypes, keyboard
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from threading import *
import pydirectinput
import pyautogui
SendInput = ctypes.windll.user32.SendInput
from pynput.keyboard import Key, Controller
 
# C struct redefinitions
PUL = ctypes.POINTER(ctypes.c_ulong)
class KeyBdInput(ctypes.Structure):
    _fields_ = [("wVk", ctypes.c_ushort),
                ("wScan", ctypes.c_ushort),
                ("dwFlags", ctypes.c_ulong),
                ("time", ctypes.c_ulong),
                ("dwExtraInfo", PUL)]
 
class HardwareInput(ctypes.Structure):
    _fields_ = [("uMsg", ctypes.c_ulong),
                ("wParamL", ctypes.c_short),
                ("wParamH", ctypes.c_ushort)]
 
class MouseInput(ctypes.Structure):
    _fields_ = [("dx", ctypes.c_long),
                ("dy", ctypes.c_long),
                ("mouseData", ctypes.c_ulong),
                ("dwFlags", ctypes.c_ulong),
                ("time",ctypes.c_ulong),
                ("dwExtraInfo", PUL)]
 
class Input_I(ctypes.Union):
    _fields_ = [("ki", KeyBdInput),
                 ("mi", MouseInput),
                 ("hi", HardwareInput)]
 
class Input(ctypes.Structure):
    _fields_ = [("type", ctypes.c_ulong),
                ("ii", Input_I)]
 
# Actuals Functions
 
def PressKey(hexKeyCode):
    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    ii_.ki = KeyBdInput( 0, hexKeyCode, 0x0008, 0, ctypes.pointer(extra) )
    x = Input( ctypes.c_ulong(1), ii_ )
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
 
def ReleaseKey(hexKeyCode):
    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    ii_.ki = KeyBdInput( 0, hexKeyCode, 0x0008 | 0x0002, 0, ctypes.pointer(extra) )
    x = Input( ctypes.c_ulong(1), ii_ )
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
 
 
KEYS = {"LBUTTON": 0x01, "RBUTTON": 0x02, "CANCEL": 0x03, "MBUTTON": 0x04, "XBUTTON1": 0x05, 
              "XBUTTON2": 0x06, "BACK": 0x08, "TAB": 0x09, "CLEAR": 0x0C, "RETURN": 0x0D, 
              "SHIFT": 0x10, "CONTROL": 0x11, "MENU": 0x12, "PAUSE": 0x13, "CAPITAL": 0x14,
              "KANA": 0x15, "JUNJA": 0x17, "FINAL": 0x18, "KANJI": 0x19, "ESCAPE": 0x1B, 
              "CONVERT": 0x1C, "NONCONVERT": 0x1D, "ACCEPT": 0x1E, "MODECHANGE": 0x1F, "SPACE": 0x20,
              "PRIOR": 0x21, "NEXT": 0x22, "END": 0x23, "HOME": 0x24, "LEFT": 0x25, "UP": 0x26, 
              "RIGHT": 0x27, "DOWN": 0x28, "SELECT": 0x29, "PRINT": 0x2A, "EXECUTE": 0x2B, 
              "SNAPSHOT": 0x2C, "INSERT": 0x2D, " DELETE": 0x2E, "HELP": 0x2F, "key0": 0x30, 
              "key1": 0x31, "key2": 0x32, " key3": 0x33, "key4": 0x34, "key5": 0x35, "key6": 0x36, "key7": 0x37, "key8": 0x38, "key9": 0x39, "A": 0x41, "B": 0x42, "C": 0x43, "D": 0x44,
              "E": 0x45, "F": 0x46, "G": 0x47, "H": 0x48, "I": 0x49,
              "J": 0x4A, "K": 0x4B, "L": 0x4C, "M": 0x4D, "N": 0x4E, "O": 0x4F, "P": 0x50, "Q": 0x51, "R": 0x52,
              "S": 0x53, "T": 0x54, "U": 0x55, "V": 0x56, "W": 0x57, "X": 0x58, "Y": 0x59,
              "Z": 0x5A, "LWIN": 0x5B, "RWIN": 0x5C, "APPS": 0x5D, "SLEEP": 0x5F, "NUMPAD0": 0x60, "NUMPAD1": 0x61, "NUMPAD2": 0x62, "NUMPAD3": 0x63, "NUMPAD4": 0x64, "NUMPAD5": 0x65,
              "NUMPAD6": 0x66, "NUMPAD7": 0x67, "NUMPAD8": 0x68, "NUMPAD9": 0x69, "MULTIPLY": 0x6A, "ADD": 0x6B,
              " SEPARATOR": 0x6C, "SUBTRACT": 0x6D, "DECIMAL": 0x6E, "DIVIDE": 0x6F, "F1": 0x70, "F2": 0x71, "F3": 0x72, "F4": 0x73, "F5": 0x74, "F6": 0x75, "F7": 0x76, "F8": 0x77, "F9": 0x78, "F10": 0x79, "F11": 0x7A, "F12": 0x7B, "F13": 0x7C, "F14": 0x7D, 
              "F15": 0x7E, "F16": 0x7F, "F17": 0x80, "F18": 0x81, "F19": 0x82, "F20": 0x83, "F21": 0x84, "F22": 0x85, "F23": 0x86, "F24": 0x87, "NUMLOCK": 0x90, "SCROLL": 0x91, "OEM_FJ_JISHO": 0x92, "OEM_FJ_MASSHOU": 0x93, 
              "OEM_FJ_TOUROKU": 0x94, "OEM_FJ_LOYA": 0x95, "OEM_FJ_ROYA": 0x96, "LSHIFT": 0xA0, "RSHIFT": 0xA1, "LCONTROL": 0xA2, "RCONTROL": 0xA3, "LMENU": 0xA4, "RMENU": 0xA5, "BROWSER_BACK": 0xA6, 
              "BROWSER_FORWARD": 0xA7, "BROWSER_REFRESH": 0xA8, "BROWSER_STOP": 0xA9, "BROWSER_SEARCH": 0xAA, "BROWSER_FAVORITES": 0xAB, "BROWSER_HOME": 0xAC, "VOLUME_MUTE": 0xAD, "VOLUME_DOWN": 0xAE, 
              "VOLUME_UP": 0xAF, "MEDIA_NEXT_TRACK": 0xB0, "MEDIA_PREV_TRACK": 0xB1, "MEDIA_STOP": 0xB2, "MEDIA_PLAY_PAUSE": 0xB3, "LAUNCH_MAIL": 0xB4, "LAUNCH_MEDIA_SELECT": 0xB5, "LAUNCH_APP1": 0xB6, 
              "LAUNCH_APP2": 0xB7, "OEM_1": 0xBA, "OEM_PLUS": 0xBB, "OEM_COMMA": 0xBC, "OEM_MINUS": 0xBD, "OEM_PERIOD": 0xBE, " OEM_2": 0xBF, "OEM_3": 0xC0, "ABNT_C1": 0xC1, "ABNT_C2": 0xC2, "OEM_4": 0xDB, "OEM_5": 0xDC, "OEM_6": 0xDD, "OEM_7": 0xDE, "OEM_8": 0xDF, "OEM_AX": 0xE1,
              "OEM_102": 0xE2, "ICO_HELP": 0xE3, "PROCESSKEY": 0xE5, "ICO_CLEAR": 0xE6, "PACKET": 0xE7, "OEM_RESET": 0xE9, "OEM_JUMP": 0xEA, "OEM_PA1": 0xEB, "OEM_PA2": 0xEC, "OEM_PA3": 0xED, 
              "OEM_WSCTRL": 0xEE, "OEM_CUSEL": 0xEF, "OEM_ATTN": 0xF0, "OEM_FINISH": 0xF1, "OEM_COPY": 0xF2, "OEM_AUTO": 0xF3, "OEM_ENLW": 0xF4, "OEM_BACKTAB": 0xF5, "ATTN": 0xF6, "CRSEL": 0xF7, "EXSEL": 0xF8, " EREOF": 0xF9, "PLAY": 0xFA, "ZOOM": 0xFB, "PA1": 0xFD, " OEM_CLEAR": 0xFE
              } 
def prease_on_key(driver, word, key):
 
 while 1:
     try:
      time.sleep(2)
      text= driver.find_element_by_xpath('//*[@id="speech-display"]').text
      if len(text) != 0 and text != None:
 
       text= str(text).lower()
       word= str(text).lower()
       if word == text:
          keyboard = Controller()
          key = "w"
 
          keyboard.press(key)
          time.sleep(5)
          keyboard.release(key)
          # keyboard.press('w')
          #
          #
          # keyboard.release('w')
          # send key down event
          win32api.keybd_event(0x57, win32api.MapVirtualKey(0x57, 0), 0, 0)
          # wait for it to get registered.
          # You might need to increase this time for some applications
          time.sleep(.05)
          # send key up event
          win32api.keybd_event(0x57, win32api.MapVirtualKey(0x57, 0), win32con.KEYEVENTF_KEYUP, 0)
        # pydirectinput.keyDown(str('w'))
        #
        # time.sleep(1)
        # pydirectinput.keyUp(str('w'))
        # key=key.upper()
        # key1=KEYS[key]
        # print(key1)
        # driver.find_element_by_xpath('//*[@id="bottom-navbar"]//*[@id="mic"]').click()
        # time.sleep(2)
        # driver.find_element_by_xpath('//*[@id="bottom-navbar"]//*[@id="mic"]').click()
        # win32api.keybd_event(key1, 0, 0, 0)
        # PressKey(key1)
        # time.sleep(1)
        # ReleaseKey(key1)
 
 
     except Exception as ex:
       print(ex)
       pass
0
148 / 111 / 37
Регистрация: 28.11.2013
Сообщений: 383
11.02.2022, 18:42
У вас слишком большая "портянка" кода - и selenium и параллельное выполнение, куча непонятных функций в которых нет желания разбираться. Тяжело понять в каком месте ошибка. Оставьте минимальный код: нажатие клавиши - действие, тогда можно будет легко найти ошибку. Желательно, чтобы можно было запустить ваш пример и потестить.
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
11.02.2022, 21:16  [ТС]
Skryp, скажите пожалуйста функцию, которая будет отправлять нажатия клавиши в игре, spider cell pandora tomorrow. это всё что мне нужно.
0
148 / 111 / 37
Регистрация: 28.11.2013
Сообщений: 383
11.02.2022, 22:36
splinter cell у меня нет, но вот в heroes3 такой скрипт кнопки нажимает:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import pyautogui
import pydirectinput
import time
 
def main():
    # Если бот заглючит, то переместив вручную курсор
    # в левый верхний угол экрана программа остановится
    # Initialize PyAutoGui
    pyautogui.FAILSAFE = True
 
    # Countdown timer
    timer_count = 2
 
    print("Starting", end="")
    for i in range(0, timer_count):
        print(".", end="")
        time.sleep(1)
    print("Go")
 
    # Do anything
    pydirectinput.press('u')
    time.sleep(2)
    pydirectinput.press('u')
    print("Done")
 
if __name__ == "__main__":
    main()
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
12.02.2022, 09:35  [ТС]
Skryp, спасибо большое за ваш ответ, к моему большому сожалению этот метод не работает, нажатия клавиши не отправляется в игру. есть ли функция, которая работает на более низком уровне? ещё это делаю потому, моя левая рука нерабочая.
0
148 / 111 / 37
Регистрация: 28.11.2013
Сообщений: 383
12.02.2022, 13:05
Итак, я установил splinter cell. Персонаж прыгает в игре с помощью скрипта, у меня работает без проблем, тот скрипт без переделок рабочий.
Python
1
2
3
4
5
  # Do anything
    pydirectinput.press('space')
    time.sleep(2)
    pydirectinput.press('space')
    print("Done")
Добавлено через 1 час 12 минут
Добавил голосовое распознавание, работает только прыжок. speech_recognition долго распознаёт команды - до 5 секунд. Вроде можно заменить на библиотеку offline распознавания vosk для ускорения распознавания. Скрипт у меня отрабатывает нормально в игре splinter cell tomorrow.
Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import speech_recognition
import pyautogui
import pydirectinput
import time
 
 
sr = speech_recognition.Recognizer()
# пауза после которой ввод голоса завершен и начинается обработка
sr.pause_threshold = 0.5
 
# возвращает ключ, если распознана одна из команд
# если ключи в словаре называются в точности как функции, то потом можно будет
# сразу запустить функцию, применяя globals()[key]()
commands_dict = {
    'commands': {
        'greeting': ['привет', 'приветствую', 'здарова'],
        'press_space': ['прыжок', 'прыгай', 'прыгни'],
 
    }
}
 
 
def greeting():
    return "Функция greeting отработала"
 
 
def press_space():
    # Если бот заглючит, то переместив вручную курсор
    # в левый верхний угол экрана программа остановится
    # Initialize PyAutoGui
    pyautogui.FAILSAFE = True
    pydirectinput.press('space')
    return "Функция press_space отработала"
 
 
def listen_command():
    try:
        with speech_recognition.Microphone() as mic:
            # калибровка шумов, не менне 0.5 секунды
            sr.adjust_for_ambient_noise(source=mic, duration=0.5)
            # слушаем голос через микрофон
            audio = sr.listen(source=mic)
            # lower - чтобы текст команды распознавался в нижнем регистре
            # запрос, команда
            query = sr.recognize_google(audio_data=audio, language='ru-Ru').lower()
 
        return query
 
    except speech_recognition.UnknownValueError:
        return "speech_recognition не распознал голос"
 
 
 
def main():
    query = listen_command()
    print(query)
    print("=============================")
 
    # ищем совпадения голосовых команд
    for key, value in commands_dict['commands'].items():
        if query in value:
 
            # print(key)
            print(globals()[key]())
 
 
if __name__ == "__main__":
    main()
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
12.02.2022, 15:29  [ТС]
Skryp, спасибо большое за ваш ответ, итак почему у меня не работало? оказывается необходимо python скрипт конвертировать в exe файл и запустить от имени администратора. только тогда всё заработало. когда я запускал скрипт через pycharm не хватало прав. Прошу прощение, за эту путаницу.
0
148 / 111 / 37
Регистрация: 28.11.2013
Сообщений: 383
12.02.2022, 15:29
Переделал скрипт под vosk. Распознавание идет намного быстрее, хотя качество распознавания немного ухудшилось, но теперь играть приятнее.
Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# import speech_recognition
import pyautogui
import pydirectinput
import time
 
from vosk import Model, KaldiRecognizer
import pyaudio
import json
 
 
# 0) pip install PyAudio
# 1) pip install vosk
# 2) Качаем модель (мини версия для русского языка 45 МБ) с сайта https://alphacephei.com/vosk/models
 
 
# возвращает ключ, если распознана одна из команд
# если ключи в словаре называются в точности как функции, то потом можно будет
# сразу запустить функцию, применяя globals()[key]()
commands_dict = {
    'commands': {
        'greeting': ['привет', 'приветствую', 'здарова'],
        'press_space': ['прыжок', 'прыгай', 'прыгни', 'пры гай', 'пры гни'],
 
    }
}
 
 
 
# путь к папке с моделью
path = "vosk-model-small-ru-0.22"
 
# Чтение модели в оперативную память
model = Model(path)
 
speech_frequency = 16000  # Hz
recognizer = KaldiRecognizer(model, speech_frequency)
 
 
def greeting():
    return "Функция greeting отработала"
 
 
def press_space():
    # Если бот заглючит, то переместив вручную курсор
    # в левый верхний угол экрана программа остановится
    # Initialize PyAutoGui
    pyautogui.FAILSAFE = True
 
    # pyautogui.press('space')
    pydirectinput.press('space')
    
    return "Функция press_space отработала"
 
 
def listen_command():
    # распознаём голос с микрофона
    cap = pyaudio.PyAudio()
    stream = cap.open(format=pyaudio.paInt16, channels=1, rate=speech_frequency, input=True, frames_per_buffer=8192)
    stream.start_stream()
 
    byte_number = 4096
    data = stream.read(byte_number)
 
    query = ""
    if recognizer.AcceptWaveform(data):
        data = json.loads(recognizer.Result())
        query = data['text']
 
    return query
 
 
 
cap = pyaudio.PyAudio()
stream = cap.open(format=pyaudio.paInt16, channels=1, rate=speech_frequency, input=True, frames_per_buffer=8192)
stream.start_stream()
 
 
def main():
 
    while True:
        # query = listen_command()
 
        byte_number = 4096
        data = stream.read(byte_number)
 
        query = ""
        if recognizer.AcceptWaveform(data):
            data = json.loads(recognizer.Result())
            query = data['text']
 
        print(query)
        print("=============================")
 
        # ищем совпадения голосовых команд
        for key, value in commands_dict['commands'].items():
            if query in value:
 
                # print(key)
                print(globals()[key]())
 
 
if __name__ == "__main__":
    main()



По поводу не работающих команд - если функции pyautogui не работают в играх, то заменяйте их на pydirectinput
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
13.02.2022, 12:28  [ТС]
Skryp, спасибо вам огромное, всё работает отлично. очень вам благодарен. скажите пожалуйста, если вас не затруднит, как через python переназначить клавиши на мыши? иными словами как блокировать оригинальные нажатия клавиш, например, нажимаем правую кнопку мыши, а нажимается клавиша w.
0
148 / 111 / 37
Регистрация: 28.11.2013
Сообщений: 383
14.02.2022, 18:41
Чтобы блокировать нажатия клавиатуры и мыши надо обращаться к api операционной системы, это заморочено. У меня мышь A4Tech X7 с програмкой-драйвером, где можно целые скрипты писать на кнопку. По-моему легче найти стороннюю программу,например, X-Mouse Button Control. Но всё можно и питоном, но я так не делал.
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
16.02.2022, 11:46  [ТС]
Skryp, в том-то и дело, что X-Mouse Button Control не работает в игре, может что-то ему мешает? я не знаю что надо удалить или отключить
0
148 / 111 / 37
Регистрация: 28.11.2013
Сообщений: 383
16.02.2022, 19:31
У меня X-mouse в игре отрабатывает нормально (у меня Win10). Вам надо гуглить возможные причины. Прикладываю, на всякий случай, скриншот настройки X-mouse (для Mouse Button 4)
Миниатюры
Голосовые команды в игре  
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
19.02.2022, 23:14  [ТС]
Skryp, спасибо вам за Ваш совет. может кому-то это поможет, ну вот как решил эту проблему, первое удалить все драйвера на мышку, потом перезагрузить компьютер, запускать X-Mouse Button Control от имени администратора, раскладка должна быть на английском языке.

Добавлено через 3 часа 17 минут
всё я работает, представляю код вашему вниманию
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import os, time, win32api, win32con, ctypes, keyboard
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from threading import *
import pydirectinput as pyinput
 
 
KEYS = {"LBUTTON": 0x01, "RBUTTON": 0x02, "CANCEL": 0x03, "MBUTTON": 0x04, "XBUTTON1": 0x05, 
              "XBUTTON2": 0x06, "BACK": 0x08, "TAB": 0x09, "CLEAR": 0x0C, "RETURN": 0x0D, 
              "SHIFT": 0x10, "CONTROL": 0x11, "MENU": 0x12, "PAUSE": 0x13, "CAPITAL": 0x14,
              "KANA": 0x15, "JUNJA": 0x17, "FINAL": 0x18, "KANJI": 0x19, "ESCAPE": 0x1B, 
              "CONVERT": 0x1C, "NONCONVERT": 0x1D, "ACCEPT": 0x1E, "MODECHANGE": 0x1F, "SPACE": 0x20,
              "PRIOR": 0x21, "NEXT": 0x22, "END": 0x23, "HOME": 0x24, "LEFT": 0x25, "UP": 0x26, 
              "RIGHT": 0x27, "DOWN": 0x28, "SELECT": 0x29, "PRINT": 0x2A, "EXECUTE": 0x2B, 
              "SNAPSHOT": 0x2C, "INSERT": 0x2D, "DELETE": 0x2E, "HELP": 0x2F, "KEY0": 0x30,
              "KEY1": 0x31, "KEY2": 0x32, "key3": 0x33, "key4": 0x34, "key5": 0x35, "key6": 0x36,
              "key7": 0x37, "key8": 0x38, "key9": 0x39, "A": 0x41, "B": 0x42, "C": 0x43, "D": 0x44,
              "E": 0x45, "F": 0x46, "G": 0x47, "H": 0x48, "I": 0x49,
              "J": 0x4A, "K": 0x4B, "L": 0x4C, "M": 0x4D, "N": 0x4E, "O": 0x4F, "P": 0x50, "Q": 0x51, "R": 0x52,
              "S": 0x53, "T": 0x54, "U": 0x55, "V": 0x56, "W": 0x57, "X": 0x58, "Y": 0x59,
              "Z": 0x5A, "LWIN": 0x5B, "RWIN": 0x5C, "APPS": 0x5D, "SLEEP": 0x5F, "NUMPAD0": 0x60, "NUMPAD1": 0x61, "NUMPAD2": 0x62, "NUMPAD3": 0x63, "NUMPAD4": 0x64, "NUMPAD5": 0x65,
              "NUMPAD6": 0x66, "NUMPAD7": 0x67, "NUMPAD8": 0x68, "NUMPAD9": 0x69, "MULTIPLY": 0x6A, "ADD": 0x6B,
              " SEPARATOR": 0x6C, "SUBTRACT": 0x6D, "DECIMAL": 0x6E, "DIVIDE": 0x6F, "F1": 0x70, "F2": 0x71, "F3": 0x72, "F4": 0x73, "F5": 0x74, "F6": 0x75, "F7": 0x76, "F8": 0x77, "F9": 0x78, "F10": 0x79, "F11": 0x7A, "F12": 0x7B, "F13": 0x7C, "F14": 0x7D, 
              "F15": 0x7E, "F16": 0x7F, "F17": 0x80, "F18": 0x81, "F19": 0x82, "F20": 0x83, "F21": 0x84, "F22": 0x85, "F23": 0x86, "F24": 0x87, "NUMLOCK": 0x90, "SCROLL": 0x91, "OEM_FJ_JISHO": 0x92, "OEM_FJ_MASSHOU": 0x93, 
              "OEM_FJ_TOUROKU": 0x94, "OEM_FJ_LOYA": 0x95, "OEM_FJ_ROYA": 0x96, "LSHIFT": 0xA0, "RSHIFT": 0xA1, "LCONTROL": 0xA2, "RCONTROL": 0xA3, "LMENU": 0xA4, "RMENU": 0xA5, "BROWSER_BACK": 0xA6, 
              "BROWSER_FORWARD": 0xA7, "BROWSER_REFRESH": 0xA8, "BROWSER_STOP": 0xA9, "BROWSER_SEARCH": 0xAA, "BROWSER_FAVORITES": 0xAB, "BROWSER_HOME": 0xAC, "VOLUME_MUTE": 0xAD, "VOLUME_DOWN": 0xAE, 
              "VOLUME_UP": 0xAF, "MEDIA_NEXT_TRACK": 0xB0, "MEDIA_PREV_TRACK": 0xB1, "MEDIA_STOP": 0xB2, "MEDIA_PLAY_PAUSE": 0xB3, "LAUNCH_MAIL": 0xB4, "LAUNCH_MEDIA_SELECT": 0xB5, "LAUNCH_APP1": 0xB6, 
              "LAUNCH_APP2": 0xB7, "OEM_1": 0xBA, "OEM_PLUS": 0xBB, "OEM_COMMA": 0xBC, "OEM_MINUS": 0xBD, "OEM_PERIOD": 0xBE, " OEM_2": 0xBF, "OEM_3": 0xC0, "ABNT_C1": 0xC1, "ABNT_C2": 0xC2, "OEM_4": 0xDB, "OEM_5": 0xDC, "OEM_6": 0xDD, "OEM_7": 0xDE, "OEM_8": 0xDF, "OEM_AX": 0xE1,
              "OEM_102": 0xE2, "ICO_HELP": 0xE3, "PROCESSKEY": 0xE5, "ICO_CLEAR": 0xE6, "PACKET": 0xE7, "OEM_RESET": 0xE9, "OEM_JUMP": 0xEA, "OEM_PA1": 0xEB, "OEM_PA2": 0xEC, "OEM_PA3": 0xED, 
              "OEM_WSCTRL": 0xEE, "OEM_CUSEL": 0xEF, "OEM_ATTN": 0xF0, "OEM_FINISH": 0xF1, "OEM_COPY": 0xF2, "OEM_AUTO": 0xF3, "OEM_ENLW": 0xF4, "OEM_BACKTAB": 0xF5, "ATTN": 0xF6, "CRSEL": 0xF7, "EXSEL": 0xF8, " EREOF": 0xF9, "PLAY": 0xFA, "ZOOM": 0xFB, "PA1": 0xFD, " OEM_CLEAR": 0xFE
              } 
def prease_on_key(driver, key, *words):
 # print(words)
 while 1:
     try:
      time.sleep(2)
      text= driver.find_element_by_xpath('//*[@id="speech-display"]').text
      if len(text) != 0 and text != None:
        text = str(text).lower()
        for word1 in words:
           # print(word1)
           word= str(word1).lower()
           if word == text:
              key1=key.upper()
              key2=KEYS[key1]
              # key=str(key1).replace("KEY","").lower()
              print(key)
              driver.find_element_by_xpath('//*[@id="bottom-navbar"]//*[@id="mic"]').click()
              # pyinput.press(key)
              pyinput.keyDown(str(key1).replace("KEY","").lower())
              time.sleep(0.5)
              pyinput.keyUp(str(key1).replace("KEY","").lower())
              driver.find_element_by_xpath('//*[@id="bottom-navbar"]//*[@id="mic"]').click()
              break
     except Exception as ex:
       print(ex)
       pass
def prease_on_key1(driver, key, *word):
  t1 = Thread(target = prease_on_key, args =(driver, key, *word))
  t1.start()
 
 
 
os.system("taskkill /f /im  chromedriver.exe")
options = Options()
home =r"C:\Program Files (x86)\Google\Chrome"
options.add_argument("--use-fake-ui-for-media-stream")# звук
options.add_experimental_option("excludeSwitches", ['enable-automation']) # убрать окно
options.add_argument("--incognito")
options.binary_location = home +r"\Application\chrome.exe"
try:
  driver = webdriver.Chrome(home+r'\chromedriver\chromedriver.exe', options=options)
  driver.set_window_position(600, 650)
  driver.set_window_size(624, 368) # optiol
  driver.get("https://www.speechtexter.com")# открыть сайт
  driver.find_element_by_xpath('//*[@class="wave" and @id="b-lang"]//*[@id="lang-name-display"]').click()
  driver.find_element_by_xpath('//*[@class="lang-option" and @data-code="ru-ru"]').click() # выбор языка
  # driver.minimize_window()
  driver.find_element_by_xpath('//*[@id="bottom-navbar"]//*[@class="wave" and @id="mic"]').click()# включить запись голоса
  time.sleep(1)
 
  try:
     prease_on_key1(driver, 'e', 'а','ах')
     prease_on_key1(driver, 'key1', 'один','1','одень','день')
     prease_on_key1(driver, 'key2','два','2')
     prease_on_key1(driver, 'c', 'сидеть', 'С')
     while 1:
      try:
       time.sleep(6)
       driver.find_element_by_xpath('//*[@id="speech-display"]').clear()# удалить старый текст.
      except Exception as ex:
         pass
  except Exception as ex:
    pass
 
except Exception as ex:
   # print(ex)
   # driver.close()
   # driver.quit()
   pass
finally:
   # pass
   driver.close()
   driver.quit()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.02.2022, 23:14
Помогаю со студенческими работами здесь

Распознавание речи (Голосовые команды)
Здравствуйте! ребза кто-нибудь работал с голосовыми командами в Delphi? давно как-то натыкался на подобные темы.. ещё в дельфи 5-7 ...

Голосовые команды в стиле Google Now
Добрый день форумчане! Как многие знают Google Now можно вызвать сказав просто "Ok Google". И я бы хотел узнать поподробнее как данная...

Распознавание речи (Голосовые команды)
Здравствуйте! :senor: ребза кто-нибудь работал с голосовыми командами в Delphi? давно как-то натыкался на подобные темы.. ещё в...

Голосовые команды для управления программой
Здравствуйте, уважаемые форумчане. Без вашей помощи не обойтись в реализации следующей задачи: необходимо, чтобы программа реагировала на...

Программа(Железный человек): голосовые команды - голосовой ответ
Здравствуйте, все же смотрели фильм "железный человек" ?! Так вот, у него была программа (Джарвис) которой он обращался, а она находила ту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru