HaujetZhao / CapsWriter-Offline

CapsWriter 的离线版,一个好用的 PC 端的语音输入工具
2.78k stars 226 forks source link

增加图形界面包 ( 仅 Windows 端) #53

Open H1DDENADM1N opened 8 months ago

H1DDENADM1N commented 8 months ago
  1. 基于 PySide6 的 GUI,默认使用 Qt-Material dark_yellow 主题;基于 PyStand 绿化便携 start.exestart_server_gui.exe start_client_gui.exe
  2. 支持最小化到系统托盘。
  3. Server 和 Client 以 tab 集成在一个 gui,无任务栏占用。
  4. 双击 start.exe 运行,可自行设置开机自启动。
  5. 已包含所有 Python 环境和 models 模型,解压即用。
  6. 支持转录功能,将文件拖动到 start_client_gui.exe。
  7. 按下 Capslock 键会在光标处提示 ✦ 语音输入中‧‧‧

123盘 https://www.123pan.com/s/qBxUVv-H4Zq3.html 提取码:h8vb 动图预览:

start.exe start_server_and_client_in_tray

start_server_gui.exe start_client_gui.exe start_server_or_client_in_tray

文件说明:

文件说明

HaujetZhao commented 8 months ago

你这个应该可用,但是我不能通过 pr,主因是:

  1. 服务端加载要 50 秒,客户端加载只需 2 秒,客户端最容易因为麦克风插拔、麦克风权限、文件读写等未能覆盖到的 bug 闪退,这时,重启整个程序又要载入模型。正因如此,我才做了服务端、客户端分离的。
  2. 服务端有在无 GUI 的系统下运行的能力
  3. 服务端使用协程 websockets 接收客户端数据,模型转录是计算密集型任务,会阻塞主线程,所以载入模型、转录任务使用了子进程,用主进程接收客户端输入,用队列向子进程提交识别任务。使用 GUI 也要考虑协程、进程的兼容。我记得 QT 里使用多进程,要改用 QThread 类,协程还不清楚,好像 websockets 也要改成用 Qwebsockets,不然可能会有冲突,例如 GUI 偶发卡住、无法支持多个客户端等等,因此加入 GUI 要做不少改动。
  4. 现在是通过编辑 config.py 修改配置,如果要增加新功能、新配置,直接在 config.py 加一个变量就行,修改热词也是编辑 txt,做了 GUI 之后,必然会有很多用户提需求:从 GUI 修改配置、修改热词,这时再加新配置、新功能,就要考虑如何调整 GUI 的设置界面,这不是一个轻松活。
  5. 如果从 GUI 界面调整配置,就要加入服务端的启动、停止功能,以应对端口占用的问题。

总之,加入 GUI,不是一个问题的结束,而是无数新问题的开始。

现在的 CapsWriter 还只是中间体,Whisper 模型、多语言支持、显卡加速,都还没实现,很多设计可能大改。只是我目前没有独显电脑,代码能力也还不足,还无法做进一步添加这些功能。

目前来看,保持命令行运行是最合适的。占用任务栏的问题,在 Win10 下可以通过拖动到一个虚拟桌面来解决,自启动的问题,可以通过向 shell:startup 路径添加快捷方式解决,键盘上的 Caps Lock 指示灯也能显示录音状态。

然后,你的 git 没有写 .gitignore,把 .history 目录也 commit 了。另外不需要弄一个 runtime 目录,依赖包 pip 安装就行,打包用 pyinstaller 会把依赖包放到 internal 文件夹。

HaujetZhao commented 8 months ago

你可以新开一个库,我把这个库链接放到 readme 和 release note 里

H1DDENADM1N commented 8 months ago

这个GUI启动流程是 start.exe ->runtime\pythonw.exe start.py PyStand规定的目录名runtime和site-packages,它较Pyinstaller的好处是不会每次运行在%Temp%目录自解压引起杀毒软件扫描造成卡顿 ->core_server.py和core_client.py 子进程启动,与手动点击start_server.exe和start_client.exe没区别,我运行的五六十边没遇到权限或文件读写问题,不过确实目前只能同时启动同时停止 然后,那个,怎样是新开一个库?我fork的这个 https://github.com/H1DDENADM1N/CapsWriter-Offline 有什么问题?抱歉,不太懂😵‍💫

HaujetZhao commented 8 months ago

懂了,你是用的 pystand 打包,而不是 pyinstaller ,等我有空把你的 repo 放到 readme

qmzmdqs commented 8 months ago

服务端加载要 50 秒,客户端加载只需 2 秒,客户端最容易因为麦克风插拔、麦克风权限、文件读写等未能覆盖到的 bug 闪退,这时,重启整个程序又要载入模型。正因如此,我才做了服务端、客户端分离的。

我赞同这个,gui 封装 client 端就行,Windows 上为了使用方便,可以将 server 注册成服务,或者干脆 client server 分别封装 GUI

H1DDENADM1N commented 8 months ago

我赞同这个,gui 封装 client 端就行,Windows 上为了使用方便,可以将 server 注册成服务,或者干脆 client server 分别封装 GUI

做好了,如下图,配合Groupy更好用了,我一会更新 start_server_or_client_in_tray

SingleCoreSun commented 7 months ago

Hi @H1DDENADM1N 从项目Readme中看到了fork的项目地址,觉得新加入的翻译功能非常的好,在使用过程中我也萌生了一些想法, 我在实际使用过程中发现自己在语音输入的过程中,出现了同时需要输入中文和英文翻译的场景, 但是在目前的版本中,翻译功能的开关似乎不能够“热生效”(我不知道这个词用的对不对( •̀ ω •́ )✧) 在config.py中设置了translate开关之后,程序需要重新启动才能生效,然而你知道的,加载模型要几十秒钟~

所以我有了一些想法,不知道合不合适:

  1. 是否能让翻译功能在GUI上出现开关? 但是就跟HaujetZhao说的一样:

    总之,加入 GUI,不是一个问题的结束,而是无数新问题的开始。

  2. 如果开关翻译功能并不合适,有没有可能增加一个录音按键,用来区分识别中文,还是识别中文并翻译? 我觉得这可能比增加一个开关还要方便一些,毕竟这个项目的出发点可能是作为服务常驻在后台,用户感知更低一些?

比如说: a) 按下CAPSLOCK默认是识别中文不翻译 b) 按下右Shift是识别中文并且翻译成英文

这样似乎能同时达到输入中文和英文翻译的可能

因为我是在使用过程中产生的这个想法,我觉得可能从用户角度来讲如果能同时用上这个项目的识别和翻译功能应该是很棒的, 如果中文和翻译需要来回设置并且重启软件+1分钟等待的话,用户体验并不是很好。

H1DDENADM1N commented 7 months ago

@SingleCoreSun 感谢你的建议,我发布了新的提交:默认加载翻译模型,组合键按住Left Shift再按 CapsLock进行翻译,以适应同时需要输入中文和英文翻译的场景。 注意输入结束时,先松开CapsLock 键,待输入完成,再松开 Shift 键。

https://github.com/H1DDENADM1N/CapsWriter-Offline/commit/ed1eab3d1f3c88bac464ff98df7c58b136f5cee7

预览图: 语音中英混输

H1DDENADM1N commented 7 months ago

@SingleCoreSun 感谢你的建议,我发布了新的提交:https://github.com/H1DDENADM1N/CapsWriter-Offline/releases/tag/gui-v1.1.0

新增功能 支持基于 DeepLX 的在线多译多,默认译日 按下键盘上的 Right Shift 再按 CapsLock 可以将识别结果在线翻译为多国语言,默认设置翻译为日文。

在线翻译基于 DeepLX ,过于频繁的请求可能导致 IP 被封,如果出现 429 错误,则表示你的 IP 被 DeepL 暂时屏蔽了,请不要在短时间内频繁请求。

通过 config.pytrans_online_shortcuttrans_online_target_languages 配置。常用的 EN JA RU ,更多选择参考 docs-api

预览图:

start_server_or_client_in_tray