From 6bd5f55dcf7a3857823123ff4709649f6ea5e4cf Mon Sep 17 00:00:00 2001 From: Haujet <1292756898@qq.com> Date: Thu, 31 Dec 2020 22:28:56 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=8F=E8=BF=87=E6=B5=8B=E8=AF=95=EF=BC=8C?= =?UTF-8?q?=E5=A6=82=E6=9E=9C=E5=9C=A8windows=E4=B8=8A=E6=8C=89=E4=B8=8B?= =?UTF-8?q?=E6=8C=89=E9=94=AE=E7=9A=84=E6=97=B6=E5=80=99=E6=89=8D=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E5=90=AF=E5=8A=A8=E5=BD=95=E9=9F=B3=EF=BC=8C=E5=BD=95?= =?UTF-8?q?=E9=9F=B3=E5=90=AF=E5=8A=A8=E4=BC=9A=E6=9C=89=E4=B8=80=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E5=BB=B6=E8=BF=9F=EF=BC=8C=E8=BF=99=E4=B8=AA=E5=BB=B6?= =?UTF-8?q?=E8=BF=9F=E5=A4=A7=E6=A6=82=E5=9C=A80.5=E5=88=B01=E7=A7=92?= =?UTF-8?q?=E9=92=9F=E3=80=82=E4=B8=BA=E4=BA=86=E8=83=BD=E5=81=9A=E5=88=B0?= =?UTF-8?q?=E6=8C=89=E4=B8=8B=E6=8C=89=E9=94=AE=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=EF=BC=8C=E5=B0=B1=E7=AB=8B=E5=88=BB=E5=BC=80=E5=A7=8B=E5=BD=95?= =?UTF-8?q?=E9=9F=B3=EF=BC=8C=E7=8E=B0=E5=9C=A8=E5=9C=A8=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E5=BC=95=E6=93=8E=E4=B9=8B=E5=90=8E=EF=BC=8C=E7=8E=B0=E5=9C=A8?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E4=BC=9A=E6=8C=81=E7=BB=AD=E6=80=A7=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E9=BA=A6=E5=85=8B=E9=A3=8E=EF=BC=88=E4=BD=86=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E5=B0=86=E5=BD=95=E9=9F=B3=E6=95=B0=E6=8D=AE=E5=86=99?= =?UTF-8?q?=E5=85=A5=E5=86=85=E5=AD=98=EF=BC=89=EF=BC=8C=E5=AF=B9=E8=80=97?= =?UTF-8?q?=E7=94=B5=E9=87=8F=E5=BD=B1=E5=93=8D=E4=B9=9F=E4=B8=8D=E5=A4=A7?= =?UTF-8?q?=EF=BC=8C=E5=BD=93=E6=8C=89=E4=B8=8B=E6=8C=89=E9=94=AE=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=EF=BC=8C=E5=B0=B1=E4=BC=9A=E7=AB=8B=E5=88=BB?= =?UTF-8?q?=E5=B0=86=E5=BD=95=E9=9F=B3=E6=95=B0=E6=8D=AE=E5=BC=80=E5=A7=8B?= =?UTF-8?q?=E5=86=99=E5=85=A5=E5=86=85=E5=AD=98=EF=BC=8C=E8=BF=99=E6=A0=B7?= =?UTF-8?q?=E5=B0=B1=E5=8F=AF=E4=BB=A5=E5=81=9A=E5=88=B0=E6=8C=89=E4=B8=8B?= =?UTF-8?q?=E6=8C=89=E9=94=AE=E7=9A=84=E6=97=B6=E5=80=99=E7=AB=8B=E9=A9=AC?= =?UTF-8?q?=E5=BC=80=E5=A7=8B=E8=AF=B4=E8=AF=9D=EF=BC=8C=E4=B9=9F=E8=83=BD?= =?UTF-8?q?=E6=8D=95=E6=8D=89=E5=88=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 另外,录音进程是在一个新的线程中进行的,但是发现了pyside 的一个 bug,当新线程中存在一个 pyaudio stream 时,就会阻塞其他的图形界面。所以在启动引擎之后,就不要点击其他按钮了,可能会导致页面卡死。如果换成 PyQt5 就不会有这个问题。目前已反馈至 PySide 的 bug 反馈平台:https://bugreports.qt.io/browse/PYSIDE-1465,希望官方可以修复,如果不行的话,以后就换成 PyQt5。 对导入模块进行了精简。 --- .gitignore | 1 + src/__init__.pyw | 6 ++-- src/moduels/component/Ali_CallBack.py | 6 +--- src/moduels/component/QEditBox_StdoutBox.py | 10 +++++-- src/moduels/component/SponsorDialog.py | 5 ++-- src/moduels/component/Stream.py | 5 ++-- src/moduels/gui/Combo_EngineList.py | 4 +-- src/moduels/gui/Group_EditableList.py | 2 +- src/moduels/gui/List_List.py | 5 ++-- src/moduels/gui/MainWindow.py | 6 ++-- src/moduels/gui/SystemTray.py | 7 +++-- src/moduels/gui/Tab_CapsWriter.py | 31 ++++++--------------- src/moduels/gui/Tab_Config.py | 6 ++-- src/moduels/gui/Tab_Help.py | 2 +- src/moduels/thread/Thread_AliEngine.py | 31 +++++++++++++-------- 15 files changed, 58 insertions(+), 69 deletions(-) diff --git a/.gitignore b/.gitignore index fba2581..cb6b6f1 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ __pycache__ */dist/* */build/* *.db +*test/* *.afphoto icon*.png 视频封面.png diff --git a/src/__init__.pyw b/src/__init__.pyw index b52caa4..0473407 100644 --- a/src/__init__.pyw +++ b/src/__init__.pyw @@ -6,9 +6,9 @@ os.chdir(os.path.dirname(os.path.abspath(__file__))) # 更改工作目录,指 sys.path.append(os.path.dirname(os.path.abspath(__file__))) # 将当前目录导入 python 寻找 package 和 moduel 的变量 # os.environ['PATH'] += os.pathsep + os.path.abspath('./bin') # 将可执行文件的目录加入环境变量 -from PySide2.QtWidgets import * -from PySide2.QtCore import * -from PySide2.QtGui import * +from PySide2.QtWidgets import QApplication +from PySide2.QtCore import QCoreApplication +from PySide2.QtGui import Qt from moduels.function.createDB import createDB # 引入检查和创建创建数据库的函数 diff --git a/src/moduels/component/Ali_CallBack.py b/src/moduels/component/Ali_CallBack.py index edbc310..8d3552a 100644 --- a/src/moduels/component/Ali_CallBack.py +++ b/src/moduels/component/Ali_CallBack.py @@ -1,10 +1,6 @@ # -*- coding: UTF-8 -*- -import json -import os -import pyaudio -import threading + import keyboard -import time from ali_speech.callbacks import SpeechRecognizerCallback diff --git a/src/moduels/component/QEditBox_StdoutBox.py b/src/moduels/component/QEditBox_StdoutBox.py index 2fdb5fc..9a1179b 100644 --- a/src/moduels/component/QEditBox_StdoutBox.py +++ b/src/moduels/component/QEditBox_StdoutBox.py @@ -1,7 +1,10 @@ # -*- coding: UTF-8 -*- +import sys -from PySide2.QtWidgets import * -from PySide2.QtGui import * +from PySide2.QtWidgets import QTextEdit +from PySide2.QtGui import QTextCursor + +from moduels.component.Stream import Stream # 命令输出窗口中的多行文本框 class QEditBox_StdoutBox(QTextEdit): @@ -9,6 +12,9 @@ class QEditBox_StdoutBox(QTextEdit): def __init__(self, parent=None): super(QEditBox_StdoutBox, self).__init__(parent) self.setReadOnly(True) + self.标准输出流 = Stream() + self.标准输出流.newText.connect(self.print) + sys.stdout = self.标准输出流 def print(self, text): try: diff --git a/src/moduels/component/SponsorDialog.py b/src/moduels/component/SponsorDialog.py index 8b9c1c5..1f38d55 100644 --- a/src/moduels/component/SponsorDialog.py +++ b/src/moduels/component/SponsorDialog.py @@ -1,8 +1,7 @@ # -*- coding: UTF-8 -*- -from PySide2.QtWidgets import * -from PySide2.QtGui import * -from PySide2.QtCore import * +from PySide2.QtWidgets import QDialog +from PySide2.QtGui import Qt, QIcon, QPainter, QPixmap from moduels.component.NormalValue import 常量 diff --git a/src/moduels/component/Stream.py b/src/moduels/component/Stream.py index b879f0b..65922ad 100644 --- a/src/moduels/component/Stream.py +++ b/src/moduels/component/Stream.py @@ -1,6 +1,5 @@ -from PySide2.QtWidgets import * -from PySide2.QtGui import * -from PySide2.QtCore import * + +from PySide2.QtCore import Signal, QObject class Stream(QObject): diff --git a/src/moduels/gui/Combo_EngineList.py b/src/moduels/gui/Combo_EngineList.py index 8a39ef7..f70850e 100644 --- a/src/moduels/gui/Combo_EngineList.py +++ b/src/moduels/gui/Combo_EngineList.py @@ -1,9 +1,7 @@ # -*- coding: UTF-8 -*- import os, sqlite3 -from PySide2.QtWidgets import * -from PySide2.QtGui import * -from PySide2.QtCore import * +from PySide2.QtWidgets import QComboBox from moduels.component.NormalValue import 常量 # 添加预设对话框 diff --git a/src/moduels/gui/Group_EditableList.py b/src/moduels/gui/Group_EditableList.py index c37bc4b..a11667e 100644 --- a/src/moduels/gui/Group_EditableList.py +++ b/src/moduels/gui/Group_EditableList.py @@ -1,6 +1,6 @@ # -*- coding: UTF-8 -*- -from PySide2.QtWidgets import * +from PySide2.QtWidgets import QGroupBox, QLineEdit, QPushButton, QGridLayout from moduels.gui.List_List import List_List # 添加预设对话框 diff --git a/src/moduels/gui/List_List.py b/src/moduels/gui/List_List.py index 1aee77a..67c61e9 100644 --- a/src/moduels/gui/List_List.py +++ b/src/moduels/gui/List_List.py @@ -1,8 +1,7 @@ # -*- coding: UTF-8 -*- -from PySide2.QtWidgets import * -from PySide2.QtGui import * -from PySide2.QtCore import * +from PySide2.QtWidgets import QListWidget +from PySide2.QtCore import Signal from moduels.component.NormalValue import 常量 # 添加预设对话框 diff --git a/src/moduels/gui/MainWindow.py b/src/moduels/gui/MainWindow.py index 50670ab..3bedfad 100644 --- a/src/moduels/gui/MainWindow.py +++ b/src/moduels/gui/MainWindow.py @@ -1,12 +1,11 @@ # -*- coding: UTF-8 -*- -from PySide2.QtWidgets import * -from PySide2.QtGui import * +from PySide2.QtWidgets import QMainWindow, QTabWidget +from PySide2.QtGui import QIcon, Qt from moduels.component.NormalValue import 常量 from moduels.gui.Tab_CapsWriter import Tab_CapsWriter -# from moduels.gui.Tab_Stdout import Tab_Stdout from moduels.gui.Tab_Config import Tab_Config from moduels.gui.Tab_Help import Tab_Help @@ -24,7 +23,6 @@ class MainWindow(QMainWindow): # self.setWindowState(Qt.WindowMaximized) - # sys.stdout = Stream(newText=self.onUpdateText) def initElements(self): self.状态栏 = self.statusBar() diff --git a/src/moduels/gui/SystemTray.py b/src/moduels/gui/SystemTray.py index 5f0cfc4..1f3341a 100644 --- a/src/moduels/gui/SystemTray.py +++ b/src/moduels/gui/SystemTray.py @@ -1,8 +1,9 @@ # -*- coding: UTF-8 -*- -from PySide2.QtWidgets import * -from PySide2.QtCore import * -from PySide2.QtGui import * +from PySide2.QtWidgets import QSystemTrayIcon, QMenu, QApplication, QAction +# from PySide2.QtCore import * +from PySide2.QtGui import QIcon +from PySide2.QtCore import Qt import sys diff --git a/src/moduels/gui/Tab_CapsWriter.py b/src/moduels/gui/Tab_CapsWriter.py index 0ee477d..13a482c 100644 --- a/src/moduels/gui/Tab_CapsWriter.py +++ b/src/moduels/gui/Tab_CapsWriter.py @@ -1,29 +1,16 @@ # -*- coding: UTF-8 -*- -from PySide2.QtWidgets import * -from PySide2.QtGui import * -from PySide2.QtCore import * -import sys, os, re, subprocess, time +from PySide2.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QGroupBox, QPushButton +# from PySide2.QtGui import * +from PySide2.QtCore import Signal +import os, re, subprocess, time import pyaudio -# from moduels.component.QLEdit_FilePathQLineEdit import QLEdit_FilePathQLineEdit -from moduels.component.Stream import Stream + from moduels.component.NormalValue import 常量 from moduels.component.QEditBox_StdoutBox import QEditBox_StdoutBox -# from moduels.component.SpaceLine import QHLine, QVLine from moduels.thread.Thread_AliEngine import Thread_AliEngine -# from moduels.thread.Thread_GenerateSkins import Thread_GenerateSkins -# from moduels.thread.Thread_ExtractAllSkin import Thread_ExtractAllSkin - -# from moduels.function.applyTemplate import applyTemplate -# from moduels.function.openSkinSourcePath import openSkinSourcePath -# -# from moduels.gui.Dialog_AddSkin import Dialog_AddSkin -# from moduels.gui.Dialog_DecompressSkin import Dialog_DecompressSkin -# from moduels.gui.Dialog_RestoreSkin import Dialog_RestoreSkin -# from moduels.gui.Group_EditableList import Group_EditableList -# from moduels.gui.VBox_RBtnContainer import VBox_RBtnContainer from moduels.gui.Combo_EngineList import Combo_EngineList @@ -54,10 +41,10 @@ class Tab_CapsWriter(QWidget): self.停止按钮 = QPushButton('停止 CapsWriter') self.启停按钮Box布局 = QHBoxLayout() - self.标准输出流 = Stream() + def initLayouts(self): - self.标准输出流.newText.connect(self.更新控制台输出) + self.引擎选择Box布局.addWidget(self.引擎选择下拉框) @@ -85,10 +72,8 @@ class Tab_CapsWriter(QWidget): def initValues(self): self.引擎线程 = None - # self.aliClient = ali_speech.NlsClient() - # self.aliClient.set_log_level('WARNING') # 设置 client 输出日志信息的级别:DEBUG、INFO、WARNING、ERROR self.停止按钮.setDisabled(True) - sys.stdout = self.标准输出流 + print("""\n软件介绍: CapsWriter,顾名思义,就是按下大写锁定键来打字的工具。它的具体作用是:当你按下键盘上的大写锁定键后,软件开始语音识别,当你松开大写锁定键时,识别的结果就可以立马上屏。 diff --git a/src/moduels/gui/Tab_Config.py b/src/moduels/gui/Tab_Config.py index bc91e75..83e2a9e 100644 --- a/src/moduels/gui/Tab_Config.py +++ b/src/moduels/gui/Tab_Config.py @@ -1,8 +1,6 @@ import webbrowser -from PySide2.QtCore import * -from PySide2.QtGui import * -from PySide2.QtSql import * -from PySide2.QtWidgets import * +from PySide2.QtCore import Signal +from PySide2.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QGroupBox, QPushButton, QCheckBox from moduels.component.NormalValue import 常量 from moduels.gui.Group_EditableList import Group_EditableList from moduels.gui.Dialog_AddEngine import Dialog_AddEngine diff --git a/src/moduels/gui/Tab_Help.py b/src/moduels/gui/Tab_Help.py index a98cd0a..58055aa 100644 --- a/src/moduels/gui/Tab_Help.py +++ b/src/moduels/gui/Tab_Help.py @@ -1,6 +1,6 @@ # -*- coding: UTF-8 -*- -from PySide2.QtWidgets import * +from PySide2.QtWidgets import QWidget, QPushButton, QVBoxLayout from PySide2.QtCore import Signal from moduels.component.NormalValue import 常量 from moduels.component.SponsorDialog import SponsorDialog diff --git a/src/moduels/thread/Thread_AliEngine.py b/src/moduels/thread/Thread_AliEngine.py index 0973308..d73ff17 100644 --- a/src/moduels/thread/Thread_AliEngine.py +++ b/src/moduels/thread/Thread_AliEngine.py @@ -10,9 +10,8 @@ import time import ali_speech -from PySide2.QtWidgets import * -from PySide2.QtGui import * -from PySide2.QtCore import * +from PySide2.QtCore import QThread, Signal +from PySide2.QtWidgets import QApplication from moduels.component.NormalValue import 常量 from moduels.function.getAlibabaRecognizer import getAlibabaRecognizer @@ -40,6 +39,7 @@ class Thread_AliEngine(QThread): def __init__(self, 引擎名称, parent=None): super().__init__(parent) + self.持续录音 = True self.正在运行 = 0 self.引擎名称 = 引擎名称 self.得到引擎信息() @@ -98,7 +98,8 @@ class Thread_AliEngine(QThread): self.识别中 = True try: self.data = [] - threading.Thread(target=self.录音线程, args=[self.p]).start() # 开始录音 + if not self.持续录音: # 如果录音进程不是被持续开启着,那么就需要在这里主动开启 + threading.Thread(target=self.录音线程, args=[self.p]).start() # 开始录音 threading.Thread(target=self.识别线程).start() # 开始识别 except: @@ -110,6 +111,7 @@ class Thread_AliEngine(QThread): else: # print(event.event_type) pass + def 为下一次输入准备识别器(self): self.识别器 = getAlibabaRecognizer(self.client, self.appKey, @@ -140,11 +142,20 @@ class Thread_AliEngine(QThread): rate=self.RATE, input=True, frames_per_buffer=self.CHUNK) + if self.持续录音: + while self.isRunning(): + if self.识别中: + self.录音数据存入内存(stream) + else: + stream.read(self.CHUNK) + else: + self.录音数据存入内存(stream) - # print('录制器准备完毕') - # 录音写入序号 = 1 + stream.stop_stream()# print('停止录制流') + stream.close() + + def 录音数据存入内存(self, stream): for i in range(5): - # self.访问录音数据的线程锁.acquire() if not self.识别中: self.data = [] # self.访问录音数据的线程锁.release() @@ -153,7 +164,6 @@ class Thread_AliEngine(QThread): self.data.append(stream.read(self.CHUNK)) # print(f'录音{录音写入序号},写入结束,时间 {time.time()}') # 录音写入序号 += 1 - # self.访问录音数据的线程锁.release() # 在这里录下5个小片段,大约录制了0.32秒,如果这个时候松开了大写锁定键,就不打开连接。如果还继续按着,那就开始识别。 while self.识别中: @@ -168,9 +178,6 @@ class Thread_AliEngine(QThread): self.总共写入音频片段数 = len(self.data) # self.访问录音数据的线程锁.release() self.发送大写锁定键() # 再按下大写锁定键,还原大写锁定 - stream.stop_stream()# print('停止录制流') - stream.close() - # 这边开始上传识别 def 识别(self): @@ -250,6 +257,8 @@ class Thread_AliEngine(QThread): return False self.p = pyaudio.PyAudio() # 在 QThread 中引入 PyAudio 会使得 PySide2 图形界面阻塞 + if self.持续录音: + threading.Thread(target=self.录音线程, args=[self.p]).start() self.开始监听大写锁定键()