先说背景。我一直想在 Linux 上用语音输入,最开始瞄上的是 fcitx5-vinput ,这个项目用的是本地语音识别,想法很好。但我试了一下发现一个问题——它要在本地跑模型,我的轻薄本 16G 内存本来写个 IDE 再开几个浏览器标签就差不多了,再跑个语音模型,风扇直接起飞。也有这个请求 API 的模式,但是,它使用的是一个单独的进程在做。我有点架构洁癖,代码洁癖。
所以退而求其次,走云端方案。但现有方案基本都要你手动按快捷键开始/停止,或者用系统级方案加外部脚本,体验很割裂。
后来想了想,不如自己写一个 Fcitx5 的插件:fcitx5-voice-input
核心思路就三个:
- Silero VAD 自动检测语音 — 不用 push-to-talk ,张嘴说话就行,停 800ms 自动结束
- 后台队列流水线 — 采集 → VAD → ASR 三个独立线程走队列,不阻塞输入法
- 兼容 OpenAI 协议 — 可以用自己的 OpenAI 账号,也可以用 Groq (免费额度够用而且很快唯一不足的就是 Whisper ,它的识别率不是很好。)、SiliconFlow 啥的
云端识别的好处就是本地几乎零开销,16G 轻薄本完全无感。
写完了装到 Arch 上用了几天,几个实际感受:
- 800ms 停顿时长默认挺合理,正常说话不会断,停下来了自动提交
- 切窗口时加了 200ms 延迟停止,不会因为切出去看一眼就被打断
- 已经打包到 release ,也支持编译安装
README 写了详细配置和构建步骤: https://github.com/devcxl/fcitx5-voice-input
有啥建议或者 bug 直接提 issue ,目前 MVP ,后续计划加本地 ASR 。