· last year · Jun 02, 2024, 08:25 PM
1'''Данный скрипт предназначен для распознавания речи с использованием микрофона, автоматической замены произнесенных слов на заранее заданные и последующей печати текста с помощью симулированной клавиатуры. Он также включает функции по управлению вводом с микрофона и настройкой эквалайзера для улучшения качества звука.
2'''
3import json, os, re, subprocess, time, threading, sys, audioop
4import speech_recognition as sr
5from pywinauto import keyboard
6from pynput.keyboard import Key, Controller
7from pynput import *
8class save_key:
9 def __init__(self):
10 self.text = ""
11 self.flag = False
12 self.word=[]
13 self.res={}
14 self.new_res={}
15 def save_text(self, text):
16 self.text = text
17 def get_text(self):
18 return self.text
19 def get_flag(self):
20 return self.flag
21
22 def set_flag(self, value):
23 self.flag = value
24
25 def update_dict(self):
26 data = "/mnt/807EB5FA7EB5E954/софт/виртуальная машина/linux must have/python_linux/Project/list for replacements.json" # файл настроек.
27 if os.path.exists(data): # есть ли этот файл.
28 with open(data, encoding="cp1251") as json_file: # загрузка настроек из файла.
29 self.res = json.load(json_file) # проходимся по каждому элементу словаря
30 for key in self.res.keys(): # Если ключ содержит '*', добавляем его в новый словарь
31 if '*' in key:
32 self.new_res[key] = self.res[key]
33 for key in self.new_res.keys():
34 del self.res[key]
35
36 def get_dict(self):# словарь без *
37 return self.res
38
39 def get_new_dict(self):# словарь с *
40 return self.new_res
41
42 def save_words(self, w):
43 self.word.clear()
44 for i in w:
45 self.word.append(i)
46
47 def get_words(self):
48 return self.word
49k=save_key()
50k.update_dict()
51def replace(match):
52 res=k.get_dict()
53 return res[match.group(0)]
54class save_ln:
55 def __init__(self):
56 self.text = ""
57 def save_text(self, text):
58 self.text = text
59 def get_text(self):
60 return self.text
61def typing_text(char1):# delay = 0.0001 # Задайте здесь нужную задержку в секундах
62 for char in char1:
63 script = f'''#!/bin/bash
64 word="{char}" # Задайте здесь нужное слово # Задайте здесь нужную задержку в секундах
65 if [[ -z "$word" ]]; then
66 xte "key space"
67 else
68 xdotool type "$word"
69 fi
70 '''
71 subprocess.call(['bash', '-c', script, '_'])
72
73def repeat(text, k):
74 k.save_text(text)
75 text1=""
76 res=k.get_dict()
77 k.save_words(res)
78 words=k.get_words()
79 for i in words:
80 text = k.get_text()
81 reg = r'\b' + r'\b|\b'.join([i]) + r'\b'
82 text1 = re.sub(reg, replace, text)
83 k.save_text(text1)
84 new_res= k.get_new_dict()
85 for word, i in new_res.items():
86 text = k.get_text()
87 pattern = re.compile(re.escape(word), re.IGNORECASE)
88 text1 = pattern.sub(i, text)
89 k.save_text(text1)
90 return text1
91
92# Подавление вывода ошибок
93class NoALSAErrorOutput:
94 def __enter__(self):
95 self._stderr = sys.stderr
96 sys.stderr = open(os.devnull, 'w')
97
98 def __exit__(self, exc_type, exc_val, exc_tb):
99 sys.stderr.close()
100 sys.stderr = self._stderr
101
102
103with NoALSAErrorOutput():
104 mic = sr.Microphone()
105
106# Создаем экземпляр класса распознавания
107r = sr.Recognizer()
108
109# Настройки микрофона
110mic = sr.Microphone()
111
112# Начальная настройка микрофона для снижения уровня шума
113with mic as source:
114 r.adjust_for_ambient_noise(source)
115def on_press(key): # обработчик клави. # print(key )
116 key=str(key).replace(" ","")
117 if key == "Key.shift_r":
118 # print("okl")
119 k.set_flag(True)
120 return True
121 if key == "Key.space":
122 k.set_flag(False)
123 return True
124 else:
125 return True
126def on_release(key):
127 pass
128 return True
129def a():
130 while 1:
131 with keyboard.Listener(on_release=on_release, on_press=on_press) as listener:
132 listener.join()
133
134def apply_pulseaudio_equalizer():
135 # Применение эквалайзера с использованием PulseAudio
136 subprocess.run(['pactl', 'load-module', 'module-equalizer-sink', 'sink_name=equalizer'])
137 subprocess.run(
138 ['pactl', 'load-module', 'module-ladspa-sink', 'sink_name=ladspa_equalizer', 'sink_properties=device.description=Equalized_Sink', 'master=equalizer', 'plugin=mbeq_1197',
139 'label=mbeq', 'control=6.0,6.0,4.5,0.0,0.0,0.0,0.0,0.0,4.5,7.0,8.5,10.0,12.0,8.5,6.0'])
140
141
142# Подавление вывода ошибок ALSA
143class NoALSAErrorOutput:
144 def __enter__(self):
145 self._stderr = sys.stderr
146 sys.stderr = open(os.devnull, 'w')
147
148 def __exit__(self, exc_type, exc_val, exc_tb):
149 sys.stderr.close()
150 sys.stderr = self._stderr
151
152def get_mic_sources_pa():# Получение списка источников ввода
153 result = subprocess.run(['pactl', 'list', 'sources', 'short'], stdout=subprocess.PIPE)
154 return result.stdout.decode()
155
156def set_mic_volume_pa(source_name, volume_percentage):# Установить уровень громкости микрофона через PulseAudio
157 subprocess.run(['pactl', 'set-source-volume', source_name, f'{volume_percentage}%'])
158
159mic_sources = get_mic_sources_pa()# Получение информации о устройствах ввода с помощью PulseAudio
160# Переключитесь для вашего источника
161source_name = "alsa_input.usb-046d_HD_Webcam_C525_79588C20-00.mono-fallback"
162volume_level = 50 # Процент громкости
163set_mic_volume_pa(source_name, volume_level)# Установка уровня громкости микрофона
164
165def recognize_speech():
166 with mic as source:
167 while 1:
168 try:
169 print("Скажите что-нибудь...")
170 audio = r.listen(source) # Обработка аудио данных или передача в распознаватель речи
171 text = r.recognize_google(audio, language="ru-RU")# Распознаем услышанное при помощи Google Web Speech API
172 text = str(text.lower()) + str(" ")
173 print(text)
174 if k.get_flag() == True:
175 k.set_flag(False)
176 text0 = text[0].upper() + text[1:]
177 typing_text(text0) #(text0)
178 else:
179 typing_text(text) #(text)
180 except sr.UnknownValueError:
181 print("Google Web Speech API не смог распознать аудио")
182 except sr.RequestError as e:
183 print(f"Could not request results from Google Web Speech API; {e}")
184
185# Запуск потока для непрерывного прослушивания
186apply_pulseaudio_equalizer()
187listening_thread = threading.Thread(target=recognize_speech)
188listening_thread.start()
189t1 = threading.Thread(target=a)
190t1.start()
191while True:
192 pass
193