说出来,它就帮你写上去。
听墨是 Windows 上一个自由、安静的 AI 语音输入工具。按右 Alt 说话,松手,文字直接出现在光标位置——写文档、回消息、敲代码注释,嘴巴比手指快。
不绑任何 AI 厂商。本地引擎离线跑,数据不出电脑;云端接 OpenAI、火山、阿里云随你换。8 家大模型可选,翻译热键一键出译文。
轻量开源,托盘常住。没有皮肤弹窗、没有会员订阅。只有一粒胶囊浮窗,说话时浮起,说完消失。
🎙️ Vibe Coding 项目 — 听墨由自然语言驱动开发,代码主要由 AI(Claude Code)生成,人工做方向决策和审核。
- 按热键说话,再按停止,语音实时转文字注入光标
- 两种按键模式:按下说话(Toggle,按一下开始/再按停止)和按住说话(Hold,按住录音松手停止)
- 本地 ASR 全量推理(录音静默采集,松键一次出结果,准确率更高)
- 云端 ASR 流式实时出字(火山/阿里云 WebSocket)
- 独立翻译热键(默认 右 Shift + 右 Alt)
- 说话直接出译文,支持 7 种目标语言:英文、中文、日文、韩文、法语、德语、西班牙语
- 翻译失败时胶囊显示错误面板,不会注入错误文字
| 引擎 | 技术 | 说明 |
|---|---|---|
| 本地 | SenseVoiceSmall(sherpa-onnx) | 完全离线,~230MB,5 语言(中/英/日/韩/粤),全量推理 |
| 云端 · OpenAI | Whisper(whisper-1 / large-v3 / large-v3-turbo) | HTTP multipart 上传 |
| 云端 · 火山引擎 | 豆包 SeedASR(bigmodel / doubao-seed-asr-2.0) | WebSocket 流式 + 全量回退,录音期间实时出结果 |
| 云端 · 阿里云 | Fun-ASR / Qwen-ASR | WebSocket 流式 + HTTP 异步回退,DashScope 百炼平台 |
- 可选 LLM 对识别结果智能优化,三档风格:
- 轻量:补标点、改错字,不动措辞(temperature=0.0)
- 均衡(默认):去口癖、纠错、补标点、保留原意(temperature=0.1)
- 结构化:口语转书面,分行分点整理(temperature=0.3)
- 润色失败自动降级到本地纠错规则,不会丢失文本
- 自定义纠错词对,支持拼音模糊匹配和英文拼写修正
- 内置 150+ 条常见术语自动纠正(技术专有名词、数字格式等)
- 自动记录每次语音输入,首页展示今日/累计统计和 7 天趋势图
- 历史记录支持搜索、复制,复制按钮有点击反馈
- 基于 GitHub Releases,启动后自动检查
- 用户控制下载 + 安装并重启
- 更新过程自动备份并恢复用户数据,不会丢失设置
- 简体中文 / 繁體中文 / English / 日本語 / 한국어
- 首次启动自动检测系统语言
- 托盘菜单和工具提示同步切换
- 录音时自动降低系统音频音量,避免麦克风录入扬声器声音
- 语音热键支持修饰键(左右 Shift/Ctrl/Alt)
- 翻译热键支持独立组合键(Insert、F1-F12、Space 等非修饰键)
- 设置页可视化录制热键
| 服务商 | 模型示例 | 鉴权 |
|---|---|---|
| OpenAI | gpt-4o-mini, gpt-4.1-nano | Bearer |
| DeepSeek | deepseek-v4-flash | Bearer |
| Kimi (Moonshot) | moonshot-v1-8k | Bearer |
| MiniMax | MiniMax-M2.5 | Bearer |
| 智谱 AI | glm-4-flash | Bearer |
| Google Gemini | gemini-2.5-flash | API Key (Query) |
| 火山引擎 | doubao-seed-2.1-turbo | Bearer |
| Ollama | llama3.2(可换) | 无需鉴权 |
从 Releases 下载最新安装包。如果安装时被 Windows 阻止,右键安装包 → 属性 → 勾选「解除锁定」即可。
系统要求:Windows 10+ x64
首次启动会弹出引导向导,3 步完成初始配置:
- 欢迎 — 了解基本功能
- 选择引擎 — 本地引擎(离线免费)或云端引擎(高精度需联网)
- 配置引擎 —
- 本地模式:下载语音模型(~230MB),下载完成后即可离线使用
- 云端模式:选择 ASR 和 LLM 服务商并填写 API Key,支持连接测试
所有设置之后都可在设置界面中修改。
数据存储:
- 配置和统计:
%APPDATA%/TingMo/data/ - 本地模型:
%APPDATA%/TingMo/models/funasr/ ⚠️ API Key 明文存储于settings.json,请注意本地安全
| 操作 | 默认快捷键 | 说明 |
|---|---|---|
| 语音输入 | 右 Alt | 按下开始录音,再按停止(按下模式)/ 按住录音松手停止(按住模式) |
| 翻译输入 | 右 Shift + 右 Alt | 录音后自动翻译 |
| 取消录音 | Esc | 放弃当前录音 |
| 打开设置 | 左键托盘图标 | 配置语音引擎、API Key、热键、语言等 |
| 颜色 | 状态 |
|---|---|
| 默认 | 空闲 |
| 🔴 红色 | 录音中 |
| 🔵 蓝色 | 识别中 |
右键托盘图标弹出菜单:切换本地/云端、按下/按住、录音静音、设置、退出。
| 层级 | 技术 | 版本 |
|---|---|---|
| 框架 | Electron + React + TypeScript | 33 / 18 / 5.6 |
| 构建(主进程) | esbuild | 0.28 |
| 构建(渲染进程) | Vite | 6.0 |
| 本地 ASR | sherpa-onnx(SenseVoiceSmall) | 1.13 |
| ONNX 运行时 | onnxruntime-node | 1.26 |
| 云端 ASR | 火山引擎 WS / 阿里云 Fun-ASR WS / OpenAI HTTP | — |
| LLM | OpenAI 兼容 SSE 流式 + Gemini | — |
| 音频 | Web Audio API → 48→16kHz 抗混叠重采样 → WAV | — |
| 文字注入 | Win32 SendInput + KEYEVENTF_UNICODE(koffi FFI) |
2.16 |
| 全局热键 | SetWindowsHookExW(koffi FFI) |
— |
| 拼音匹配 | pinyin | 4.0 |
| 状态管理 | Zustand | 5.0 |
| 自动更新 | electron-updater | 6.3 |
| 打包 | electron-builder(NSIS 安装包) | 25.1 |
| 测试 | tsx(内置 test runner) | 4.22 |
┌──────────────────────────────────────┐
│ Main Process │
│ hotkey.ts main.ts tray.ts │
│ (键盘钩子) (核心调度) (托盘) │
│ text-inserter.ts stats-history.ts │
│ (文字注入) (统计持久化) │
└──────────┬──────────────────────────┘
│ IPC (contextBridge)
┌──────────┴──────────────────────────┐
│ Renderer Process │
│ FloatingWindow.tsx (浮窗胶囊) │
│ Settings/ (设置窗口) │
│ useAudioCapture.ts (音频采集) │
│ services/ (ASR/LLM 接口) │
└─────────────────────────────────────┘
状态机:IDLE → RECORDING → RECOGNIZING → REFINING → SUCCESS → IDLE
- 15 秒看门狗:所有进入 RECOGNIZING 的路径均受保护,超时自动重置
- 任意非 IDLE 状态按热键强制重置到 IDLE
# 安装依赖
npm install
# 启动开发环境(Vite + esbuild + Electron,主进程热更新)
npm run dev
# 仅构建主进程
npm run build:main
# 完整构建
npm run build
# 打包安装包
npm run electron:build
# 运行测试
npm run test:unitelectron-builder 只生成安装包,不会自动上传 latest.yml 到 GitHub Release。electron-updater 靠读取 latest.yml 判断更新,漏传会导致已安装用户检查不到新版本。
# 1. 更新版本号(package.json)
# 2. 构建安装包
npm run electron:build
# 3. 创建 GitHub Release 并上传全部文件(缺一不可)
gh release create v<version> \
release/TingMo-Setup-<version>.exe \
release/TingMo-Setup-<version>.exe.blockmap \
release/latest.yml \
--title "TingMo V<version>" \
--notes "<release notes>"- 仅支持 Windows x64
- SenseVoiceSmall 精度有限,建议配合 LLM 润色或使用云端 ASR
- API Key 明文存储于本地 JSON 文件
- 翻译热键设为独立键时该键被全局拦截(如 Insert 不再触发系统功能)
- 录音热键仅支持修饰键(左/右 Shift、Ctrl、Alt)
- 透明浮窗禁用 box-shadow(会产生灰色光晕),用 border 替代
MIT
听墨由 @shaoxin12 使用 Vibe Coding 方式开发,代码主要由 Claude Code 生成。感谢以下开源项目:
- sherpa-onnx — 本地语音识别引擎
- koffi — Node.js 高性能 FFI
- Zustand — 轻量状态管理
- electron-builder — 打包分发
