Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '''Данный скрипт предназначен для распознавания речи с использованием микрофона, автоматической замены произнесенных слов на заранее заданные и последующей печати текста с помощью симулированной клавиатуры. Он также включает функции по управлению вводом с микрофона и настройкой эквалайзера для улучшения качества звука.
- '''
- from libs_voice import *
- get_user_name = f'''#!/bin/bash
- current_user=$(whoami);
- echo $current_user
- exit;# Завершаем выполнение скрипта
- '''
- # Убивает текущий процесс, запущенный текущим пользователем и соответствующий имени исполняемого скрипта.
- def kill_current_script():# Получаем идентификатор активного окна
- result = str(subprocess.run(['ps', 'aux'], stdout=subprocess.PIPE, text=True).stdout) # print(result)
- name_scrypt = sys.argv[0]
- # Вызываем скрипт
- user = subprocess.run(['bash'], input=get_user_name, stdout=subprocess.PIPE, text=True).stdout.strip()
- for line in result.split("\n"):
- user_name = ' '.join(line.split()[0]).replace(" ", "")
- process_name = ' '.join(line.split()[10:])
- if user_name==user and name_scrypt in process_name:
- pid_id = int(line.split()[1]) # или используйте другой индекс, если нужны другие данные
- # print(process_name)
- f = '''#!/bin/bash
- kill {} '''.format(pid_id)
- subprocess.call(['bash', '-c', f])#
- # Подавление вывода ошибок ALSA
- class NoALSAErrorOutput:
- def __enter__(self):
- self._stderr = sys.stderr
- sys.stderr = open(os.devnull, 'w')
- def __exit__(self, exc_type, exc_val, exc_tb):
- sys.stderr.close()
- sys.stderr = self._stderr
- def get_mic_sources_pa():# Получение списка источников ввода
- result = subprocess.run(['pactl', 'list', 'sources', 'short'], stdout=subprocess.PIPE)
- return result.stdout.decode()
- def set_mic_volume_pa(source_name, volume_percentage):# Установить уровень громкости микрофона через PulseAudio
- subprocess.run(['pactl', 'set-source-volume', source_name, f'{volume_percentage}%'])
- mic_sources = get_mic_sources_pa()# Получение информации о устройствах ввода с помощью PulseAudio
- # Переключитесь для вашего источника
- source_name = "alsa_input.usb-046d_HD_Webcam_C525_79588C20-00.mono-fallback"
- volume_level = 50 # Процент громкости
- set_mic_volume_pa(source_name, volume_level)# Установка уровня громкости микрофона
- # Применение эквалайзера с использованием PulseAudio
- subprocess.run(['pactl', 'load-module', 'module-equalizer-sink', 'sink_name=equalizer'])
- subprocess.run(
- ['pactl', 'load-module', 'module-ladspa-sink', 'sink_name=ladspa_equalizer', 'sink_properties=device.description=Equalized_Sink', 'master=equalizer', 'plugin=mbeq_1197',
- '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'])
- get_user_name = f'''#!/bin/bash
- current_user=$(whoami);
- echo $current_user
- exit;# Завершаем выполнение скрипта
- '''
- # Убивает текущий процесс, запущенный текущим пользователем и соответствующий имени исполняемого скрипта.
- def kill_current_script():# Получаем идентификатор активного окна
- result = str(subprocess.run(['ps', 'aux'], stdout=subprocess.PIPE, text=True).stdout) # print(result)
- name_scrypt = sys.argv[0]
- # Вызываем скрипт
- user = subprocess.run(['bash'], input=get_user_name, stdout=subprocess.PIPE, text=True).stdout.strip()
- for line in result.split("\n"):
- user_name = ' '.join(line.split()[0]).replace(" ", "")
- process_name = ' '.join(line.split()[10:])
- if user_name==user and name_scrypt in process_name:
- pid_id = int(line.split()[1]) # или используйте другой индекс, если нужны другие данные
- # print(process_name)
- f = '''#!/bin/bash
- kill {} '''.format(pid_id)
- subprocess.call(['bash', '-c', f])#
- class MyThread(QtCore.QThread): # Определение класса потока
- mysignal = QtCore.pyqtSignal(str) # Объявление сигнала
- error_signal = QtCore.pyqtSignal(str) # Добавлено объявление сигнала ошибки
- def __init__(self, parent=None): # Конструктор класса потока
- super(MyThread, self).__init__(parent) # Вызов конструктора базового класса
- self.running = True # Инициализация флага выполнения потока
- self.r = sr.Recognizer() # Создаем экземпляр класса распознавания
- self.mic = sr.Microphone() # Настройки микрофона
- with self.mic as source:
- self.r.adjust_for_ambient_noise(source)
- # Следующая строка создает новый экземпляр микрофона each time, seems unnecessary
- with NoALSAErrorOutput():
- mic = sr.Microphone()
- def run(self): # Метод, исполняемый потоком
- # Установка флага выполнения в True
- while 1:
- time.sleep(0.1)
- try:
- with self.mic as source:
- audio = self.r.listen(source)
- if self.running: # Цикл, работающий пока running == True
- text = self.r.recognize_google(audio, language="ru-RU")
- print(text)
- typing_text(text) ## Излучение сигнала со строкой, содержащей текущее значение счетчика
- except sr.UnknownValueError: # Пример показа подсказки в позиции (400, 300) на экране
- self.error_signal.emit("Ошибка распознавания")# print("Ошибка распознавания")
- time.sleep(0.001) # self.message_signal.emit("Ошибка распознавания")
- pass
- except Exception as ex2:
- print(ex2)
- class MyWindow(QtWidgets.QWidget): # Определение класса главного окна
- def __init__(self, parent=None): # Конструктор класса окна
- super(MyWindow, self).__init__(parent) # Вызов конструктора базового класса
- self.mythread = MyThread() # Создание экземпляра потока
- self.tray_icon = QSystemTrayIcon(QtGui.QIcon("/mnt/807EB5FA7EB5E954/софт/виртуальная машина/linux must have/python_linux/Project/голос.png"), self)
- # Создание контекстного меню для иконки в системном трее
- menu = QMenu()
- quit_action = QAction("Quit", self)
- quit_action.triggered.connect(self.quit_t) # Используйте метод quit, определённый ниже
- menu.addAction(quit_action)
- # Установка меню в трей
- self.tray_icon.setContextMenu(menu)
- self.mythread.error_signal.connect(self.showCustomTooltip) # Слот для отображения ошибки
- self.tray_icon.setToolTip("ON" if self.mythread.running else "OFF") # Установка начальной подсказки
- self.tray_icon.activated.connect(self.on_tray_icon_activated) # Привязываем обработчик к сигналу нажатия
- self.tray_icon.show()
- self.on_start()#
- def quit_t(self): # Метод обработки события закрытия окна
- self.mythread.running = False # Остановка потока перед закрытием окна
- QApplication.quit()
- kill_current_script()
- def showCustomTooltip(self, text="Ошибка", pos=QPoint(1700, 1800), timeout=3000):
- self.label = QLabel(text, self)
- self.label.setStyleSheet("QLabel { background-color : rgb(252,231,167); color : rgb(0,0,0); padding: 10px; font-size: 12pt;}")
- self.setWindowFlags(Qt.ToolTip | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
- self.setAttribute(Qt.WA_TranslucentBackground)
- self.setWindowTitle('Tooltip')
- self.label.adjustSize()
- self.adjustSize()
- self.move(pos)
- self.show()
- QTimer.singleShot(timeout, self.close)
- self.mythread.running = True
- self.mythread.start() # Запуск потока
- return 0
- def on_start(self): # Метод обработки события запуска потока
- if not self.mythread.isRunning(): # Проверка, не запущен ли уже поток
- self.mythread.running = True
- self.mythread.start() # Запуск потока
- def on_stop(self): # Метод обработки события остановки потока
- self.mythread.running = False # Остановка потока путем изменения флага
- def on_tray_icon_activated(self):
- # Данная функция должна корректно управлять состоянием running
- if self.mythread.running:
- self.on_stop()
- self.tray_icon.setToolTip("ON")
- self.tray_icon.show()
- print("Recognition paused.")
- else:
- self.mythread.running = True
- self.tray_icon.setToolTip("OFF")
- self.tray_icon.show()
- print("Recognition resumed.")
- app = QApplication(sys.argv)
- window = MyWindow()
- sys.exit(app.exec_())
Add Comment
Please, Sign In to add comment