egor230

Набор текста голосом

Jun 2nd, 2024 (edited)
737
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.28 KB | None | 0 0
  1. '''Данный скрипт предназначен для распознавания речи с использованием микрофона, автоматической замены произнесенных слов на заранее заданные и последующей печати текста с помощью симулированной клавиатуры. Он также включает функции по управлению вводом с микрофона и настройкой эквалайзера для улучшения качества звука.
  2. '''
  3. from libs_voice import *
  4.  
  5. get_user_name = f'''#!/bin/bash
  6. current_user=$(whoami);
  7. echo $current_user
  8. exit;# Завершаем выполнение скрипта
  9. '''
  10. # Убивает текущий процесс, запущенный текущим пользователем и соответствующий имени исполняемого скрипта.
  11. def kill_current_script():# Получаем идентификатор активного окна
  12.   result = str(subprocess.run(['ps', 'aux'], stdout=subprocess.PIPE, text=True).stdout)  # print(result)
  13.   name_scrypt =  sys.argv[0]
  14.   # Вызываем скрипт
  15.   user = subprocess.run(['bash'], input=get_user_name, stdout=subprocess.PIPE, text=True).stdout.strip()
  16.   for line in result.split("\n"):
  17.    user_name = ' '.join(line.split()[0]).replace(" ", "")
  18.    process_name = ' '.join(line.split()[10:])
  19.    if user_name==user and name_scrypt in process_name:
  20.      pid_id = int(line.split()[1])  # или используйте другой индекс, если нужны другие данные
  21.      # print(process_name)
  22.      f = '''#!/bin/bash
  23.          kill {}   '''.format(pid_id)
  24.      subprocess.call(['bash', '-c', f])#
  25.  
  26. # Подавление вывода ошибок ALSA
  27. class NoALSAErrorOutput:
  28.     def __enter__(self):
  29.         self._stderr = sys.stderr
  30.         sys.stderr = open(os.devnull, 'w')
  31.  
  32.     def __exit__(self, exc_type, exc_val, exc_tb):
  33.         sys.stderr.close()
  34.         sys.stderr = self._stderr
  35.  
  36. def get_mic_sources_pa():# Получение списка источников ввода
  37.     result = subprocess.run(['pactl', 'list', 'sources', 'short'], stdout=subprocess.PIPE)
  38.     return result.stdout.decode()
  39.  
  40. def set_mic_volume_pa(source_name, volume_percentage):# Установить уровень громкости микрофона через PulseAudio
  41.     subprocess.run(['pactl', 'set-source-volume', source_name, f'{volume_percentage}%'])
  42.  
  43. mic_sources = get_mic_sources_pa()# Получение информации о устройствах ввода с помощью PulseAudio
  44. # Переключитесь для вашего источника
  45. source_name = "alsa_input.usb-046d_HD_Webcam_C525_79588C20-00.mono-fallback"
  46. volume_level = 50  # Процент громкости
  47. set_mic_volume_pa(source_name, volume_level)# Установка уровня громкости микрофона
  48.  
  49. # Применение эквалайзера с использованием PulseAudio
  50. subprocess.run(['pactl', 'load-module', 'module-equalizer-sink', 'sink_name=equalizer'])
  51. subprocess.run(
  52.   ['pactl', 'load-module', 'module-ladspa-sink', 'sink_name=ladspa_equalizer', 'sink_properties=device.description=Equalized_Sink', 'master=equalizer', 'plugin=mbeq_1197',
  53.    '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'])
  54.  
  55. get_user_name = f'''#!/bin/bash
  56. current_user=$(whoami);
  57. echo $current_user
  58. exit;# Завершаем выполнение скрипта
  59. '''
  60. # Убивает текущий процесс, запущенный текущим пользователем и соответствующий имени исполняемого скрипта.
  61. def kill_current_script():# Получаем идентификатор активного окна
  62.   result = str(subprocess.run(['ps', 'aux'], stdout=subprocess.PIPE, text=True).stdout)  # print(result)
  63.   name_scrypt =  sys.argv[0]
  64.   # Вызываем скрипт
  65.   user = subprocess.run(['bash'], input=get_user_name, stdout=subprocess.PIPE, text=True).stdout.strip()
  66.   for line in result.split("\n"):
  67.    user_name = ' '.join(line.split()[0]).replace(" ", "")
  68.    process_name = ' '.join(line.split()[10:])
  69.    if user_name==user and name_scrypt in process_name:
  70.      pid_id = int(line.split()[1])  # или используйте другой индекс, если нужны другие данные
  71.      # print(process_name)
  72.      f = '''#!/bin/bash
  73.          kill {}   '''.format(pid_id)
  74.      subprocess.call(['bash', '-c', f])#
  75.  
  76. class MyThread(QtCore.QThread):  # Определение класса потока
  77.     mysignal = QtCore.pyqtSignal(str)  # Объявление сигнала
  78.     error_signal = QtCore.pyqtSignal(str)  # Добавлено объявление сигнала ошибки
  79.  
  80.     def __init__(self, parent=None):  # Конструктор класса потока
  81.         super(MyThread, self).__init__(parent)  # Вызов конструктора базового класса
  82.  
  83.         self.running = True   # Инициализация флага выполнения потока
  84.         self.r = sr.Recognizer()  # Создаем экземпляр класса распознавания
  85.         self.mic = sr.Microphone()  # Настройки микрофона
  86.         with self.mic as source:
  87.           self.r.adjust_for_ambient_noise(source)
  88.           # Следующая строка создает новый экземпляр микрофона each time, seems unnecessary
  89.           with NoALSAErrorOutput():
  90.               mic = sr.Microphone()
  91.     def run(self):  # Метод, исполняемый потоком
  92.          # Установка флага выполнения в True
  93.      while 1:
  94.         time.sleep(0.1)
  95.         try:
  96.             with self.mic as source:
  97.                audio = self.r.listen(source)
  98.                if self.running:  # Цикл, работающий пока running == True
  99.                  text = self.r.recognize_google(audio, language="ru-RU")
  100.                  print(text)
  101.                  typing_text(text)  ## Излучение сигнала со строкой, содержащей текущее значение счетчика
  102.         except sr.UnknownValueError:             # Пример показа подсказки в позиции (400, 300) на экране
  103.                 self.error_signal.emit("Ошибка распознавания")#   print("Ошибка распознавания")
  104.                 time.sleep(0.001)  # self.message_signal.emit("Ошибка распознавания")
  105.                 pass
  106.         except Exception as ex2:
  107.                 print(ex2)
  108. class MyWindow(QtWidgets.QWidget):  # Определение класса главного окна
  109.     def __init__(self, parent=None):  # Конструктор класса окна
  110.         super(MyWindow, self).__init__(parent)  # Вызов конструктора базового класса
  111.  
  112.         self.mythread = MyThread()  # Создание экземпляра потока
  113.  
  114.         self.tray_icon = QSystemTrayIcon(QtGui.QIcon("/mnt/807EB5FA7EB5E954/софт/виртуальная машина/linux must have/python_linux/Project/голос.png"), self)
  115.         # Создание контекстного меню для иконки в системном трее
  116.         menu = QMenu()
  117.         quit_action = QAction("Quit", self)
  118.         quit_action.triggered.connect(self.quit_t)  # Используйте метод quit, определённый ниже
  119.         menu.addAction(quit_action)
  120.  
  121.         # Установка меню в трей
  122.         self.tray_icon.setContextMenu(menu)
  123.  
  124.         self.mythread.error_signal.connect(self.showCustomTooltip)  # Слот для отображения ошибки
  125.  
  126.         self.tray_icon.setToolTip("ON" if self.mythread.running else "OFF")  # Установка начальной подсказки
  127.         self.tray_icon.activated.connect(self.on_tray_icon_activated)  # Привязываем обработчик к сигналу нажатия
  128.         self.tray_icon.show()
  129.         self.on_start()#
  130.  
  131.     def quit_t(self):  # Метод обработки события закрытия окна
  132.       self.mythread.running = False  # Остановка потока перед закрытием окна
  133.       QApplication.quit()
  134.       kill_current_script()
  135.     def showCustomTooltip(self, text="Ошибка", pos=QPoint(1700, 1800), timeout=3000):
  136.         self.label = QLabel(text, self)
  137.         self.label.setStyleSheet("QLabel { background-color : rgb(252,231,167); color : rgb(0,0,0); padding: 10px; font-size: 12pt;}")
  138.  
  139.         self.setWindowFlags(Qt.ToolTip | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
  140.         self.setAttribute(Qt.WA_TranslucentBackground)
  141.  
  142.         self.setWindowTitle('Tooltip')
  143.         self.label.adjustSize()
  144.         self.adjustSize()
  145.         self.move(pos)
  146.         self.show()
  147.         QTimer.singleShot(timeout, self.close)
  148.         self.mythread.running = True
  149.         self.mythread.start()  # Запуск потока
  150.         return 0
  151.     def on_start(self):  # Метод обработки события запуска потока
  152.         if not self.mythread.isRunning():  # Проверка, не запущен ли уже поток
  153.             self.mythread.running = True
  154.             self.mythread.start()  # Запуск потока
  155.  
  156.     def on_stop(self):  # Метод обработки события остановки потока
  157.         self.mythread.running = False  # Остановка потока путем изменения флага
  158.  
  159.     def on_tray_icon_activated(self):
  160.        # Данная функция должна корректно управлять состоянием running
  161.        if self.mythread.running:
  162.           self.on_stop()
  163.           self.tray_icon.setToolTip("ON")
  164.           self.tray_icon.show()
  165.           print("Recognition paused.")
  166.        else:
  167.           self.mythread.running = True
  168.           self.tray_icon.setToolTip("OFF")
  169.           self.tray_icon.show()
  170.           print("Recognition resumed.")
  171.  
  172. app = QApplication(sys.argv)
  173. window = MyWindow()
  174. sys.exit(app.exec_())
  175.  
Add Comment
Please, Sign In to add comment