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.开始监听大写锁定键()