Commit Graph

13 Commits

Author SHA1 Message Date
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
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
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
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
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
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
cda68e5376 feat: 添加 CapsLock 语音输入核心模块
新增三个核心组件:
- CapsLockVoiceHotkey: 基于 freedesktop GlobalShortcuts D-Bus Portal
  的全局快捷键注册,支持 Wayland 环境
- WaylandTextInjector: 通过 dlopen 动态加载 XTest 实现文本注入,
  无需编译时依赖 libXtst-devel 头文件
- VoiceInputService: 状态机协调器,实现长按 1s 录音、松开转写、
  短按恢复 CapsLock 的完整交互流程

CMakeLists.txt 新增 Qt6::DBus 依赖和新源文件。配置管理器新增
capslock_voice_enabled 开关。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-13 11:12:57 +08:00
9a6dfa3b88 feat: 集成 SenseVoice 完整推理管线
- 新增 SenseVoiceEngine: 专用 SenseVoice ONNX 模型推理引擎
- 新增 SenseVoiceFeatures: Fbank 特征提取 + LFR 拼接 + CMVN 归一化
  - 80-dim Mel 滤波器组 + 对数压缩
  - LFR (Low Frame Rate): window_size=7, window_shift=6 → 560-dim
  - CMVN: neg_mean / inv_stddev 从模型元数据自动提取
- 新增 SenseVoiceTokenizer: 加载 tokens.txt 词表,BPE 解码
- 新增 CTC 贪婪解码: 去除重复 token 和空白符
- 配置页面新增词表路径选择
- STT 测试页面和文件转写页面切换至 SenseVoiceEngine
- 更新 CMakeLists.txt 包含所有新增源文件
- 模型: /home/alvin/Documents/SenseVoice-Small/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/model.onnx
- 语言支持: 中文/英语/日语/韩语/粤语 自动检测

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-12 19:26:11 +08:00
02e100b318 feat: 初始化 Impress Voice Input 项目
基于 ONNX 的实时语音转文本输入法,C++ 跨平台实现。

核心组件:
- Qt 6 跨平台 GUI(实时识别 / 文件转写 / 配置页面)
- ONNX Runtime 推理引擎(异步模型加载)
- PortAudio 音频采集
- dr_libs 音频文件解码
- JSON 配置管理(线程安全,自动持久化)
- 日志系统(控制台 + 文件输出)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-12 15:53:05 +08:00