语音输入这件事,在线服务早就做得很好了。但有两类场景一直不太好办:一是内容比较敏感, 不想让录音离开自己的电脑;二是识别出来的文字没法直接用——口述里夹着“嗯”“那个”“就是说”, 说到一半还会改口,识别得再准,也还得回头手动删改。
过去几个月我在做一个开源的 Windows 中文语音输入工具 Saymore,目标是把“识别”和“整理” 都放在本机完成,说完就能得到可以直接发出去的文字。这篇文章记录它的整体链路和几个关键取舍, 希望对做端侧语音应用的同学有参考价值。
一次完整的输入分成五步,全部在本机运行:
麦克风 → 唤醒词检测(KWS) → 语音活动检测(VAD)切句 → Qwen3-ASR 识别 → LoRA 文本整理 → UI Automation 回填到输入框环节 | 方案 | 选择理由 |
|---|---|---|
唤醒 | sherpa-onnx 关键词检测 | 模型小,常驻 CPU 占用低,唤醒词可自定义 |
切句 | Silero VAD v5(约 2MB ONNX) | 对键盘声、风扇声不敏感,短停顿不会把一句话切碎 |
识别 | Qwen3-ASR 1.7B,GGUF 4bit,跑在 llama.cpp 上 | 中文效果好,Vulkan 与纯 CPU 都能跑 |
整理 | 同一基座 + 自训 LoRA | 不额外加载第二个模型,显存与进程复用 |
上屏 | Windows UI Automation 定位输入框 | 任意应用都能填字,不依赖输入法框架 |
大多数听写工具靠“按住快捷键说话”。这对打字场景没问题,但当手在鼠标上、或者要连续口述 几段话时,按键本身就是负担。Saymore 选择常驻后台 + 唤醒词:说“小咪”(可改)开始录音, 说“发送”把文字填进输入框,说“回退”删掉上一句,说“休眠”停止监听。超过 5 分钟没有语音输入 会自动休眠并卸载模型,释放内存。
识别结果不会直接打进输入框,而是先进一个暂存窗口。这一步是刻意设计的:口述的内容先在暂存区 完成整理,用户可以过目、双击手改,确认后再整体回填。实际用下来,这比“边说边上屏、上屏后再改” 的误操作少很多。
通用 ASR 最容易错的是人名、产品名和行业术语。Qwen3-ASR 支持把上下文文本作为提示输入, Saymore 利用这一点做了三路偏置:
三路合在一起,效果是“越用越懂你”,而这些数据同样只保存在本地。
整理层是和普通听写工具差别最大的地方。它不是简单的正则删口头禅,而是让模型重写:
<!-- 发布前:用 v1.1.4 实跑一次,把下面的示例替换成真实输入输出 -->
举个例子,口述:
呃那个我看了一下这个方案啊,就是说整体上我觉得是可以的,但是那个上线时间可能要往后推一推, 推到下周三吧,对,下周三。
深度整理后:
我看过这个方案,整体上是可行的,但上线时间需要推迟到下周三。
四种风格共用同一个 LoRA,靠系统提示词切换。这样做的好处是只需要维护一份适配器, 推理时也只挂一个模型。训练数据约 3200 条,由更大的模型标注后人工抽检, 量化方式与训练时的 4bit 码本对齐,避免部署后效果下滑。
硬件 | 单句识别 | 整段整理 |
|---|---|---|
普通 CPU | 约 1–2 秒 | 约 5 秒 |
4GB 显存、支持 Vulkan 的独显 | 约 0.5 秒 | 约 2 秒 |
选 llama.cpp + Vulkan 而不是 CUDA,是为了让 AMD、Intel 显卡和没有独显的笔记本都能用。 磁盘占用约 2GB,其中识别模型约 1.5GB,首次启动时下载,程序会自动在 HuggingFace 和 ModelScope 之间选择可用的源。
没有独立显卡能用吗? 可以,纯 CPU 能流畅运行,只是整段整理慢一些。
需要联网吗? 只有首次下载模型时需要,之后识别和整理都离线完成,录音不会上传。
能用在哪些软件里? 只要是能输入文字的地方:聊天软件、浏览器、Office、VS Code、 AI 编程助手的输入框等。
有什么限制? 目前只支持 Windows 10/11 x64;安装包未做代码签名,杀毒软件可能拦截, 需要手动允许;自动整理的正式邮件建议发送前再检查一遍。
端侧语音输入的难点不在单个模型,而在把唤醒、切句、识别、整理、上屏串成一个低延迟、 低打扰的流程。Saymore 是我对这个问题的一次完整实践,代码以 MIT 协议开源,欢迎交流和提 Issue。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。