v1.1.0 — Offline Dictation, Multi-Camera & Hardened UX
✨ 新功能
🎙️ 语音听写(板书模式)
- 接入离线 SenseVoice-Small(阿里达摩院开源,sherpa-onnx 加载),支持 中/英/日/韩/粤 五语种自动识别
- 板书模式说 "开始板书" 开录,"结束板书" 停录,识别结果自动写到画布
- KWS 误触发"结束板书"时用 SenseVoice 复核最近 3 秒音频做二次确认,避免长句被中途截断
- 实时字幕黑底随文字伸缩,不再一开始就遮挡整个屏幕
📷 摄像头多选 + 自动探测
- ⚙ 设置顶部新增摄像头下拉,后台异步枚举可用索引(跳过当前正在用的避免抢占),保存即运行时切换
- 启动按 1080p → 720p → 540p → 480p → 360p 从高到低探测,选第一个驱动接受且 ≥20 fps 的
- 断连后指数退避自动重连,不刷日志
💬 语音指令面板(cheatsheet)
- 浮动面板列出当前模式可用的全部语音指令
- 点 🎤 标签 toggle 开关
- 无边框 + 右上角红 ✕ + 可拖动 + 跟随主程序窗口移动
🐛 关键修复
- 鼠标模式死锁:手势 LEFTDOWN 落在对话框标题栏触发 Win32 模态拖拽循环,堵死主线程导致 `handle()` 停转、左键 hold 状态卡死。新增后台守护线程,检测到 `handle()` 静默 >0.7s 且左键 hold 中时直接发 LEFTUP 打破死锁
- 光标层被对话框遮住:`SetWindowPos(HWND_TOPMOST, NOACTIVATE)` 每 50 ms 把光标层钉到 topmost 组最上层,`WS_EX_TRANSPARENT` 保证点击仍穿透
- VoiceDictationService.dictate() 加锁串行化,避免 partial ASR 与验证 ASR 并发使用同一 recognizer
⚙️ 配置变更
- 新增:`dictation_`、`camera_width/height/force_mjpeg/min_fps`、`hand__confidence`、`floating_window_scale`、`debug_overlay`
- 删除:`tencent_asr_*`(已被离线 SenseVoice 替代)
📦 模型下载
SenseVoice 模型 239 MB 超过 GitHub 单文件 100 MB 限制,需要手动下载:
- 去 sherpa-onnx releases(tag: `asr-models`)
- 下载 `sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17.tar.bz2`
- 解压并放到 `models/sense-voice/`,需要包含 `model.int8.onnx` 和 `tokens.txt`
未放置模型时听写功能自动停用,KWS 关键词不受影响。
🧪 升级影响
- 配置文件向下兼容:旧的 `config.json` 启动时会自动补齐新字段
- 如果之前用过腾讯云 ASR,那几个 `tencent_asr_*` 字段可以从 `config.json` 里删掉(保留也不影响运行)
完整 diff: `v1.0.0...v1.1.0` — 28 files changed, +3046 / -305