Commit Graph

69 Commits

Author SHA1 Message Date
impressionyang
3cf6b13392 fix: 更新 static 页面下载地址为 GitHub Releases 2026-06-12 15:31:03 +08:00
impressionyang
a273b1459a feat: 添加产品说明静态页面
独立 HTML 页面,包含:
- Hero 区域(带动画波形和打字效果演示)
- 核心功能卡片(6 个功能点)
- 使用流程(4 步引导)
- 技术栈表格
- 下载入口(Windows / Linux)
- 常见问题手风琴组件

所有 CSS/JS 内联,无外部依赖,可直接在浏览器中打开展示。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-12 15:22:56 +08:00
impressionyang
fd9de6d7fa fix: 清空日志改为通过 Logger 自身方法,避免句柄不一致导致空行
Logger 持有打开的文件句柄,用外部 QFile 句柄 truncate 会导致
Logger 写入位置异常,产生大量空行。现在通过 Logger::clearLogFile()
在持有锁的情况下 flush → resize(0) → seek(0),保证句柄一致。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-12 14:54:05 +08:00
impressionyang
71fd4f8a86 fix: 修复数据清理 — 日志文件改为清空内容而非删除
- 清除日志:使用 QIODevice::Truncate 清空文件内容,
  保留文件避免 Logger 已打开的句柄指向已删除 inode
- 清除录音:保持删除模式(.wav 调试文件无活跃句柄)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-12 14:46:50 +08:00
impressionyang
8bd95b77f0 feat: 配置页面增加数据清理功能
在界面底部增加"数据清理"区域,提供两个按钮:
- 清除日志文件:删除日志目录下所有 .log 文件,显示清除数量和释放空间
- 清除录音文件:删除调试音频目录下所有 .wav 文件,显示清除数量和释放空间

清理结果通过 QMessageBox 提示,操作记录写入日志。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-12 14:30:54 +08:00
impressionyang
f2776e24d7 docs: README 添加模型下载说明与图示
- 提供 HuggingFace 模型仓库链接
- 说明需下载 model.int8.onnx 和 tokens.txt 两个文件
- 添加模型下载图示

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-12 13:58:02 +08:00
impressionyang
231543476b docs: 完善 README 使用说明
- 添加下载安装、快速开始、使用说明、快捷键、CapsLock 工作模式
- 补充语音输入和文件转写详细流程
- 添加系统托盘、状态栏说明和常见问题
- 更新 License 为 GPLv3
- 完善项目结构、技术栈、编译指南和命令行参数

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-12 10:49:21 +08:00
impressionyang
ab3064eb4e docs: 添加 GNU GPLv3 授权文件
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-12 10:42:44 +08:00
impressionyang
c04af35b88 fix: 修复三处问题
1. Windows 重启使用 QProcess::startDetached 直接启动,移除 cmd /c start
   方案,避免路径引号导致找不到程序的问题
2. 使用说明改为可调整大小、可滚动的 QDialog + QTextBrowser,
   替代固定大小的 QMessageBox
3. 使用说明中默认语音快捷键从 F8 更新为长按 CapsLock

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-12 09:44:34 +08:00
impressionyang
0068dda47f feat: 重构菜单并添加使用说明
文件菜单:只保留重启(Ctrl+R)和退出(Ctrl+Q)
托盘菜单:增加重启选项(显示主窗口 / 重启 / 退出)
帮助菜单:增加使用说明(F1),包含基本功能、快捷键、使用流程、
          配置说明、系统托盘、状态栏、常见问题等详细说明
2026-06-12 09:38:09 +08:00
impressionyang
165c48c677 fix: 修复 Windows 上 Qt 内部 200x200 工具窗口(空白方块)问题
通过 EnumWindows 枚举并隐藏 Qt 在 Windows 上创建的 WS_EX_TOOLWINDOW
工具窗口(无标题栏、无边框),解决启动时出现的空白方块问题。

同时包含:
- Windows 使用原生 windows 风格替代 Fusion,避免渲染问题
- 托盘图标改为圆形轮廓,AudioWaveform 背景主题适配
- QSS 完善(MenuBar、录音按钮动态属性、StackedWidget 背景)
- 内联样式表改为 objectName/dynamic property,QSS 统一管理
- 日志记录版本信息、编译时间、Qt 版本、平台信息

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-12 09:21:18 +08:00
impressionyang
a3130d0d2a fix: 修复 light 主题黑色方块 — 显式设置 light palette + 移除 tab 圆角
1. light 主题 palette 改用显式颜色(QPalette::Window #ffffff 等),
   替代 standardPalette(),后者在 Fusion 风格下可能返回不正确的颜色
2. QTabWidget::pane 移除 border-radius,Fusion 风格下圆角会导致
   裁剪区域渲染为黑色

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 19:37:20 +08:00
impressionyang
58eabec900 fix: 移除 QSS 中 QWidget/QFrame 全局背景色,修复运行时黑色方块
QWidget 和 QFrame 的全局 background-color 会影响 Qt 内部容器控件,
导致出现黑色方块。改为由 QPalette 处理背景色,QSS 仅针对具体控件。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 19:33:17 +08:00
impressionyang
3971358f86 fix: 图标改为圆角透明(128x128),四角白色区域变为透明
- 原图 2048x2048 缩小为 128x128
- 四角圆角裁切,白色背景变为透明
- 重新生成 ICO(128/64/48/32/16 多尺寸)
- Linux(Qt 资源 PNG)和 Windows(.rc 嵌入 ICO)均生效

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 19:28:12 +08:00
impressionyang
27bd78bf17 feat: 嵌入应用图标(窗口图标 + Windows exe 图标)
- 使用用户提供的 icon 图片作为应用图标
- Windows: .rc + windres 嵌入 exe 图标(256px 多尺寸 ICO)
- Qt: 窗口图标从 Qt 资源加载 PNG

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 19:20:16 +08:00
impressionyang
6824ce1f4a feat: Windows隐藏启动控制台,关闭按钮改为隐藏到托盘
- CMakeLists.txt: Windows 使用 add_executable WIN32 构建 GUI 程序(无控制台)
- closeEvent: 点击关闭按钮隐藏到托盘而非退出程序
- 托盘菜单已有"显示主窗口"和双击恢复功能

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 19:15:02 +08:00
impressionyang
ae35404d26 feat: 主题切换(light/dark QSS)、QSS资源编译修复、托盘图标主题色
- 新增 main_dark.qss 暗色主题样式表
- 使用 .qrc + add_executable 方式确保 QSS 资源正确编译
- Application::applyTheme 动态切换主题和样式表
- 托盘图标 light 主题黑色、dark 主题白色
- Settings 保存后实时应用主题/字体

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 19:13:34 +08:00
impressionyang
f8173cd0c1 feat: 构建脚本每次强制重新编译 application.cpp 以更新编译时间
在 build-linux.sh 和 build-win.sh 中增加 touch application.cpp 步骤,
确保 __DATE__ 和 __TIME__ 每次构建都是最新的,日志中的编译时间
能准确反映本次构建的时间。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 17:31:43 +08:00
impressionyang
835b9fcdd8 feat: 托盘图标使用 QStyle 标准图标切换状态
- 就绪/停止: SP_MediaStop (■)
- 录音/识别: SP_MediaPlay (▶)

避免自定义绘制导致的黑色方块问题,使用 Qt 原生支持的
系统标准图标,跨平台兼容性好。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 17:27:55 +08:00
impressionyang
3ccdff0828 fix: 修复 CapsLock 重复复位和托盘图标黑色方块
1. 重复复位: onHotkeyDeactivated() 中移除 simulateCapsLock(),
   只保留 onRecognitionComplete() 中的复位调用,确保只复位一次。
   无音频时也调用 simulateCapsLock() 复位。

2. 托盘图标黑色方块: 移除自定义 QPixmap 绘制(在某些平台/主题下
   渲染为黑色方块),改用应用窗口图标 + QStyle::SP_ComputerIcon 回退。
   状态变化通过 tooltip 文字指示,不再切换不同颜色的图标。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 17:14:10 +08:00
impressionyang
c64a8123be perf: 消除按键到录音 1s 延迟,按下立即录音
旧流程: 按下 → PreRecording → 1s 定时器 → Recording (延迟 ~1032ms)
新流程: 按下 → 立即 Recording (延迟 ~0ms)

状态机简化:
  - 移除 PreRecording 状态和 1s 长按确认逻辑
  - Idle → Activated → 直接 Recording
  - Deactivated → 识别 → 复位 CapsLock → Cooldown

统计仍然保留,现在应该显示 0ms 延迟。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 16:45:55 +08:00
impressionyang
2152dcb296 feat: 统计按键触发到正在录音的延迟并在日志中打印
每次长按进入 Recording 状态时打印本次延迟,并维护累计统计:
  ⏱ 按键→录音延迟: 123ms (平均: 120ms, 最小: 98ms, 最大: 155ms, 累计: 5次)

使用 QElapsedTimer 精确计时。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 16:39:59 +08:00
impressionyang
ff7318efd6 perf: 预打开音频流,消除按键到录音 3-4s 延迟
根因: 每次按键时 Pa_OpenStream() + Pa_StartStream() 耗时 3-4s,
stop() 时又 Pa_CloseStream() + Pa_Terminate() 销毁流。

优化:
- AudioCapture::start() 复用已打开的流(参数匹配时跳过 OpenStream)
- AudioCapture::stop() 只 Pa_StopStream(),保留流
- 新增 stopAndClose() 彻底关闭流(析构和服务停止时使用)
- VoiceInputService::start() 时预打开音频流再立即 stop()
  → 后续 hotkey start() 只需 Pa_StartStream() (<100ms)

效果: 按键到录音延迟从 3-4s 降至 <100ms

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 16:26:20 +08:00
impressionyang
04ca41f4c3 fix: 恢复托盘图标状态更新(statusChanged 连接误删)
之前修复按键卡顿时误将 statusChanged 信号连接中的 updateTrayIcon() 调用移除,
导致托盘图标始终显示初始绿色,不随录音/识别状态变化。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 16:18:53 +08:00
impressionyang
1efaa6909a fix: CapsLock 灯改为识别完成后复位,状态完全通过托盘图标指示
CapsLock 灯流程变更:
  旧: 按下 → 灯亮 → 1s 灯灭 → 录音 → 松开 → 识别 → 注入
  新: 按下 → 灯亮 → 1s 开始录音(灯保持亮) → 松开 → 识别 → 注入 → 灯灭

- 移除 timer callback 中的 simulateCapsLock()
- 移除 onHotkeyDeactivated Recording 分支的 simulateCapsLock()
- onRecognitionComplete() 开始时调用 simulateCapsLock() 复位灯
- stopRecordingAndTranscribe() 空音频时也复位灯

托盘图标指示:
  绿色 ○ — 就绪/静默
  黄色 ○ — 等待长按确认
  红色 ● — 正在录音(CapsLock 灯亮)
  橙色 ◉ — 正在识别

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 16:13:59 +08:00
impressionyang
0b9ea40d20 feat: 添加 Linux/Windows 构建和打包脚本
build-linux.sh:
  - 支持 --clean --release --debug 参数
  - 输出到 build_linux/ 目录

build-win.sh:
  - 自动化 Windows 交叉编译 + 依赖收集 + 打包
  - 自动收集 Qt6/MinGW/MSVC/ICU 等 30+ DLL
  - 输出 dist_win/ 目录(可直接运行)+ dist/ 发布 zip
  - 支持 --clean --release --debug 参数

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 16:06:25 +08:00
impressionyang
8425fb4a04 fix: 修复托盘图标/退出/卡顿 4 个问题
1. 关闭窗口无法退出: closeEvent 改为调用 doExit(),正常执行退出流程
2. 托盘右键无法退出: 统一使用 doExit() → qApp->quit(),与菜单/快捷键退出一致
3. 托盘图标更新慢: 6 个状态图标在 setupTrayIcon() 中预创建缓存,
   updateTrayIcon() 只做 QMap 查找 + setIcon(),避免每次重建 QPixmap
4. 按键识别卡顿/误释放: simulateCapsLock() 在 XTest 模拟前后设置
   CapsLockVoiceHotkey::ignoreEvents_ 标志,屏蔽 portal 的
   Activated/Deactivated 回传信号,防止状态机被打断

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 16:01:00 +08:00
impressionyang
6bf22041f8 fix: 彻底修复 Windows 托盘图标不显示 + 添加版本编译时间日志
Windows 托盘修复:
- 设置 setQuitOnLastWindowClosed(false),关闭主窗口时不退出应用
- 关闭主窗口改为隐藏 (event->ignore()),托盘继续运行
- 托盘菜单"退出"调用 qApp->quit() 真正退出
- 图标简化为 16x16 QImage ARGB32 + 纯色圆,确保 Windows 兼容
- 先设置图标再 trayIcon_->show()
- 添加托盘气泡通知

日志增强:
- 启动日志显示版本号 (v0.1.0)
- 打印编译时间 (__DATE__ __TIME__),方便确认二进制是否更新

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 15:39:00 +08:00
impressionyang
dc2f8e5c4f fix: 修复 Windows 托盘图标不显示问题
- 图标改为不透明深色背景 + 纯色圆形 + 白色符号,避免透明背景兼容性问题
- 图标尺寸从 22 增加到 32
- 添加托盘气泡通知提示用户
- 确保 updateTrayIcon 时检查图标可见性
- 配置 git credential.store 记住凭据

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 15:28:01 +08:00
4836a82cad feat: 添加系统托盘图标,实时指示语音录制状态
托盘图标根据状态变色:绿色(就绪)、黄色(等待确认)、红色(录音中)、
橙色(识别中)。支持双击托盘显示/隐藏主窗口,右键托盘菜单显示窗口和退出。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 15:20:09 +08:00
277ac01f46 fix: 1s 后自动复位 CapsLock 灯,LED 作为录音状态指示器
按下 CapsLock → 灯亮 (PreRecording) → 1s 后灯灭 → 正式录音 (Recording)
→ 松开 → 识别 → 注入。Recording/Cooldown 状态屏蔽所有 Activated 信号防抖。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 15:03:09 +08:00
88b0d57722 fix: 长按松开后增加 CapsLock 复位 2026-06-11 14:52:17 +08:00
58a732e161 refactor: 用明确状态机重写 CapsLock 语音输入,彻底解决抖动
旧方案依赖多个布尔标志(capsResetDone_/cooldownActive_/longPressDetected_)
分散在各个处理函数中,复杂交互下容易产生竞态。

新方案使用明确四态状态机:
  Idle → PreRecording(按下) → Recording(1s后) → Cooldown(松开后)

核心防抖:
- Recording 状态下屏蔽所有 Activated 信号
- Cooldown 状态下屏蔽所有 Activated 信号
- PreRecording 状态下忽略重复 Activated

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 14:46:08 +08:00
13d4aae725 fix: 长按 1s 录音 + 3s 复位 CapsLock 灯 + 防抖保护
- 分离两个定时器:longPressTimer(1s) 启动录音,capsResetTimer(3s) 复位灯
- 1s 时只确认录音状态,不操作 CapsLock 灯
- 3s 时才模拟 CapsLock 按键复位灯,避免手指抖动导致状态闪烁
- 松开时自动取消 3s 定时器,避免松开后再复位

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 14:38:30 +08:00
d4db8756b5 fix: 松开 CapsLock 后 1s 冷却期再检测下次按下
新增 cooldownTimer_ 和 cooldownActive_ 标志,
松开后启动 1s 冷却定时器,期间忽略所有 Activated 信号,
防止快速连续操作导致的重复触发。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 14:32:07 +08:00
74212ff564 fix: CapsLock 复位后忽略重复 Activated 信号
长按阈值触发 CapsLock 复位时设置 capsResetDone_ 标志,
松开前忽略任何重复的 Activated 信号,防止状态混乱。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 14:25:41 +08:00
1bb0d3895b fix: 长按阈值调回 1s 2026-06-11 14:22:21 +08:00
072a571a89 fix: 长按 3s 立即复位 CapsLock,不等松开
CapsLock 语音输入流程调整为:
按下 CapsLock → 预录音 → 长按 3s → 立即复位 CapsLock → 正式录音 →
松开 → 停止录音 → 识别 → 注入文本

短按(< 3s)保持原有行为:模拟 CapsLock 切换大小写

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 14:19:52 +08:00
cf44a23c57 fix: 修复 CTC 重复字符识别和 CapsLock 复位时机
- CTC 解码新增空白帧检测:空白后出现相同 token 且置信度>0.5 时
  保留为重复字符(如"好好好"),无空白时仍按 CTC 规则去重
- 长按松开后先模拟 CapsLock 恢复原始状态,再开始识别
  确保识别结果注入时 CapsLock 状态已正确

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 14:15:26 +08:00
79085b862b fix: 修复 chunkCompleted 信号文件路径为空的 bug
closeCurrentFile() 会清空 currentFilePath_,之前代码在 closeCurrentFile()
之后才读取 currentFilePath_ 赋值给 completedPath,导致 emit 的路径为空。
修复:在 closeCurrentFile() 之前先保存文件路径和时长。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 14:08:16 +08:00
f4b7149435 feat: 支持手动指定日志目录和调试音频目录
- 新增 app.log_dir 配置项,支持通过设置页面或命令行 (-l/--log-dir) 指定日志目录
- 调试音频目录 (audio.debug_dir) 已正确传入 StreamingAudioWriter
- 设置页面新增"通用设置"分组,包含日志目录选择
- 未设置时使用系统默认 AppDataLocation 路径

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 14:00:23 +08:00
801dbe1ec2 fix: 降低 VAD 能量阈值并添加 STT 推理诊断日志
- VAD 能量阈值从 0.015 降至 0.003,适配低增益麦克风
- transcribeChunk 添加 WAV 文件大小、样本数、RMS 诊断日志
- onChunkCompleted 增加空文件路径检查

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 13:50:37 +08:00
271fccb39b fix: 修复 CapsLock 长按松开后未恢复大小写状态的问题
- 长按松开后调用 simulateCapsLock 模拟一次 CapsLock 按键恢复原始状态
- 新增 simulateKeysym 方法,正确处理 X11 keysym → keycode 转换
- Windows 端添加 X11 keysym → VK 虚拟键码映射

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 13:45:18 +08:00
8c2e787a25 feat: 添加 Windows 交叉编译支持与 ONNX Runtime MinGW 兼容方案
- 新增 C API shim (ort_api_shim.h) 解决 MinGW 与 ONNX Runtime 的 SAL 注解/_stdcall 兼容性问题
- 新增轻量级 C++ 包装器 (ort_minimal) 替代 onnxruntime_cxx_api.h
- cmake/dependencies.cmake 支持 Windows/ Linux 平台自动识别依赖路径
- 修复音频采集 paNonInterleaved bug(指针被误解析为 float 导致 RMS=inf)
- 修复 Windows 热键和 UI 相关代码
- 添加 MinGW 交叉编译工具链配置

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 11:50:16 +08:00
01a39ddc8c feat: 实现基于 VAD 的流式 WAV 录制识别方案
- 新增 StreamingAudioWriter 组件:持续录制 WAV 文件,VAD 检测静音段自动切换
- 静音检测:检测到 ~1s 连续静音后关闭当前文件,触发 chunkCompleted 信号
- STTTestPage 重构:移除缓冲区推理模式,改为 WAV 文件流式识别
- 每个 WAV 文件完成后在后台线程读取并推理,不阻塞继续录制
- 设置页面新增「调试音频目录」配置项
- 音频存储路径:debug 模式使用配置目录,非 debug 模式使用系统临时目录

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-13 15:33:03 +08:00
dc4ebab47c feat: 添加音频输入设备选择器与音频电平诊断
- audio_capture 启动时输出详细设备信息(名称、Host API、采样率)
- 录音停止时输出 RMS 电平和峰值,帮助诊断音频质量问题
- 设置页面新增音频输入设备下拉选择,支持从 PortAudio 设备列表中手动选择
- 语音输入服务使用配置的音频设备和采样率参数
- 检测 monitor/output 类型设备时发出警告,避免选错回环设备

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-13 15:16:56 +08:00
a2b216092f fix: 修复配置保存死锁,添加快捷键录制组件
- 修复 ConfigManager::set() 在持有锁时发射信号导致的死锁
- 添加 setBatch() 方法批量更新配置,只发射一次 configChanged
- 新增 HotkeyRecorder 组件:点击按钮后按键录制任意快捷键
- SettingsPage 保存配置改为批量写入,避免多次触发服务重启

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-13 14:49:55 +08:00
33ae22ce62 fix: 修复模型加载时机问题,在配置加载后才加载模型
Application 构造函数中调用 loadGlobalModel() 时,配置文件
尚未加载,导致模型路径始终为空。改为将 loadGlobalModel() 设为
公开方法,在 main() 中配置加载和命令行参数处理完成后显式调用。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-13 14:36:59 +08:00
6f55ec5780 feat: 添加状态栏显示模型名称和加载状态
主窗口底部状态栏实时显示模型加载状态:
- 已就绪:绿色显示"模型已就绪: <文件名>"
- 路径为空:红色显示"⚠️ 模型路径未设置"
- 加载失败:橙色显示"⚠️ 模型加载失败: <文件名>"

Application 新增 modelLoading 信号和 modelPath() 方法,
配置变化时自动刷新状态栏显示。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-13 14:19:12 +08:00
ef97b962c3 refactor: 全局共享 STT 模型,避免重复加载
将 SenseVoiceEngine 提升为 Application 级别的全局单例,应用启动时
异步加载一次模型,实时语音识别、文件转写和快捷键语音输入共享同一实例。

- Application 创建并管理全局 SenseVoiceEngine,启动时加载模型
- STTTestPage、FileTranscribePage、VoiceInputService 不再各自
  创建引擎,改为接收全局实例
- 移除各模块中冗余的 loadModel/loadModelAsync/unloadModel 调用
- 模型未加载时提供友好的等待提示,而非加载失败的错误弹窗

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-13 14:10:31 +08:00