Skip to content

Repository files navigation

AtomType - 精准离线语音输入法

Rust License Platform PRs Welcome

您的声音,绝不离开电脑。

AtomType 是一款基于 Rust + Tauri 构建的精准离线语音输入法。所有语音识别均在本地完成,无惧断网,不上传任何数据。通过全局热键即可将语音实时转换为文字并自动输入到当前应用焦点位置。

词源内核

Atom 本意是不可分割的最小单元,对应项目的三个核心设计理念:

理念 含义
内核极简 Rust 编写,底层内核精简,不臃肿
离线原子化运行 模型、输入引擎全部内置在本地,不需要依赖云端拆分组件
最小输入单元 每一个文字、代码字符都是由引擎输出的基础原子单元

在开发者圈子中,Atom 代表底层基础基建。这一命名凸显 AtomType 面向程序员、适配代码场景的定位,格调硬核。

使用场景

作为一个开发者,我开发它不仅仅是为了「情怀」,更是因为我真的每天都在用它偷懒。

🎮 Vibe Coding 的最佳搭档

现在写代码,我基本是「动口不动手」。

比如我要写一个正则表达式,我直接按快捷键说:「写一个匹配邮箱的正则,要求支持子域名」。

AtomType 配合现在的 AI 编程助手,简直是绝配。而且最爽的是,它支持中英混合识别

我说:「把这个 Kubernetes Pod 重启一下,检查 Docker 日志。」 它识别:「把这个 Kubernetes Pod 重启一下,检查 Docker 日志。」

不用频繁切换输入法,这种流畅感谁用谁知道。

📝 会议纪要整理

开那些又臭又长的会,或者是看几十个小时的网课视频。我直接把录音或者视频文件拖进 AtomType。

它用本地 CPU 跑完转写,输出带时间轴的字幕和纯文本。关键是不用上传几个 G 的文件;同时如果你不启用 AI 优化,文本整理也不会被发送到第三方模型服务商。

🎮 游戏玩家

游戏内极速语音输入,无需切出或打字,释放双手,不错过任何战机。

🎧 客服人员

高效回复客户咨询,减少重复输入,提升响应速度与服务满意度。

💬 通讯聊天

日常聊天输入,语音转文字,本地完成,隐私无忧。

🔓 为什么要开源?

其实理由很务实:

  1. 隐私需要「自证清白」:我说我不上传数据,你凭什么信?代码开源了,大家自己看。没有任何网络请求的代码,才是最硬的信任证书。
  2. 想借助社区一起改进:我现在用的模型虽然已经能用,但肯定还有优化空间。开源出来,有更多人一起改进,我也能跟着受益。

特性

  • 🛡️ 100% 离线:所有语音识别在本地完成,音频数据绝不上传。
  • ⚡️ 旗舰级识别引擎:基于 sherpa-onnx + Paraformer 模型,中英混合输入精准。
  • 🎹 全局热键:支持单键与组合键,pressed / toggle / trigger-end 三种模式,GUI 内可直接修改快捷键。
  • ✏️ 系统级文本注入:在任意应用、任意输入框直接语音输入。
  • 📖 自定义词典:hotwords、rewrites、Rime 英文词库导入。
  • 🎚️ VAD 分段 + 标点恢复:长录音自动分段,自动补全标点。
  • 🎬 WAV 转写 + SRT 字幕:离线转写音频文件并生成字幕。
  • 💤 空闲自动卸载模型:降低内存占用。
  • ⚙️ TOML 配置 + JSON Schema:可编辑、可校验、可导出模板。
  • 🖥️ Tauri 图形界面:设置面板(快捷键/模式/开关控制)、悬浮球录音指示器、状态仪表盘。
  • 🔢 智能数字转换:中文数字自动转为阿拉伯数字(一百二十 → 120)。
  • 🗣️ 过滤语气词:自动删除嗯、啊、呃等填充词。
  • 📜 繁体中文输出:简转繁实时转换。
  • 🎯 删除结尾标点:转录结果自动去除尾部标点符号。

开发状态

以下列出了各模块当前已完成/未完成的项目。
✅ = 已完成并可用 · 🔧 = 部分完成/可运行但有约束 · ❌ = 未实现/尚为空壳

✅ 已完成

模块 说明
CLI 框架 clap 命令行解析,含 devices / models / daemon / transcribe / dict / config / completion 全子命令
配置系统 TOML 配置加载、校验、JSON Schema 生成、模板导出、config doctor 健康检查
词典系统 词典加载、rewrites 改写(大小写不敏感最长优先匹配)、Rime 英文词库导入、hotwords 规范化、dict doctor
音频采集 cpal 设备枚举与筛选、录音采集、WAV 文件读写、任意采样率到 16kHz 重采样
ASR 识别引擎 sherpa-onnx(sherpa-rs 静态链接)+ Paraformer-zh-small int8,中英混合识别已验证,默认启用(--no-default-features 回退 Stub)
VAD 分段 silero-vad v5 真实分段:长录音按语音活动切段,自动去除首尾静音
标点恢复 ct-transformer int8 模型自动补全中英文标点
模型下载 GitHub release 下载(失败自动回退 AtomGit 镜像)、SHA256 校验、tar.bz2 自动解压、models doctor
全局热键 rdev 全局按键监听,支持 pressed / toggle / trigger-end 三种模式,组合键解析
文本注入 enigo Unicode 文本注入,中文/CJK 全支持;cps 控制逐字速度
Tauri GUI 图形界面:状态仪表盘、设置面板(快捷键/模式/开关)、配置/词典/模型管理、悬浮球录音指示器
Daemon 循环 热键→录音→重采样→VAD→ASR→标点→改写→后处理→注入,完整端到端链路
智能数字转换 中文数字(一百二十)→ 阿拉伯数字(120);保守触发,"一起/十分/万一/千万"等习语不误转
过滤语气词 边界感知删除嗯、啊、呃等填充词,"哈尔滨/酒吧"等正常词不误删
繁体中文输出 2000+ 字简繁映射表实时转换
删除结尾标点 转录结果自动去除尾部 。?!.!?
悬浮球指示器 独立置顶透明小窗,主窗口隐藏时依然可见;录音计时 + 呼吸动效,可开关
AI 智能优化 文本润色、纠错、摘要;可下载本地 GGUF 模型(Qwen2.5-0.5B)由 llama.cpp 推理,未安装 llama-cli 时回退规则处理
词典管理 GUI 专有名词与替换词典可视化增删改,保存即生效(下一句语音生效)
专有名词纠错 英文大小写规范化(chatgpt → ChatGPT)+ 中文拼音同音字纠错(章三峰 → 张三丰),词边界感知
识别器常驻 模型加载一次全局复用,按键到出字延迟大幅降低
空闲模型卸载 空闲超过 idle-seconds 自动卸载识别模型释放内存,下次使用自动重载;录音/转写中不误卸,GUI 可开关、调时长、手动加载(预热)/卸载,仪表盘实时显示驻留状态
音视频解码回退 未装 ffmpeg 时 macOS 自动回退 afconvert(mp3/m4a/aac/mp4/mov)
VAD/标点开关 asr.vad / asr.punctuation 真实生效:关闭即不加载对应模型(省内存);GUI 设置页可视化开关,改动后无需重启,下一次转写自动按新配置重建识别器
静音超时自动停止 点按(toggle)模式下说完话持续静音 silence-seconds 秒自动停止录音并识别,免去再按一次快捷键;流式 RMS 检测(说话后才武装倒计时,开口前的停顿不误触发),GUI/CLI 均生效,可开关、可调时长;采样线程经事件通知主线程执行停止,规避自我 join 死锁
托盘录音状态 托盘提示(tooltip)在录音开始/停止时切换为"录音中…",与录音事件同步

快速开始

构建依赖

  • Rust 1.96+
  • Node.js 20+
  • macOS: Xcode Command Line Tools
  • Linux: libasound2-dev libgtk-3-dev libwebkit2gtk-4.1-dev librsvg2-dev
  • Windows: Microsoft C++ Build Tools (勾选“使用 C++ 的桌面开发”)和 WebView2 Runtime

Linux 运行时依赖

macOS 和 Windows 通过系统 API 直接注入文本(enigo);Linux 没有等价的进程内接口, 必须借助外部命令行工具,因此 Linux 是唯一有运行时依赖的平台

打包产物(.deb / .rpm)已声明 ydotool 为硬依赖、其余为推荐依赖。手动构建时按会话类型安装:

会话 需要 机制
Wayland(KDE / GNOME 等) ydotool + wl-clipboard 写剪贴板后模拟 Ctrl+V,兼容所有合成器
Wayland(wlroots) wtype sway / Hyprland 支持 virtual-keyboard 协议,直接输入,不经剪贴板
X11 xdotool + xclip xdotool type 直接输入,失败时回退剪贴板粘贴
# Debian / Ubuntu
sudo apt install ydotool wl-clipboard wtype xdotool xclip
# Arch
sudo pacman -S ydotool wl-clipboard wtype xdotool xclip
# Fedora
sudo dnf install ydotool wl-clipboard wtype xdotool xclip

ydotool 需要额外配置

ydotool 通过内核 uinput 设备合成按键,需要守护进程和设备权限——这部分包管理器无法代劳:

# 启动守护进程
systemctl --user enable --now ydotoold
# 确认 /dev/uinput 可写;不可写则加入 input 组后重新登录
ls -l /dev/uinput
sudo usermod -aG input $USER

ydotoold 未运行时注入会失败,日志中可见 Please check if ydotoold is running

合成器差异

  • KWin(KDE)/ Mutter(GNOME) 不实现 zwp_virtual_keyboard_manager_v1wtype 在这些桌面上必然失败。程序每个会话探测一次并记录一条 INFO,之后直接走 ydotool 路径,属正常行为。
  • wlroots 系(sway、Hyprland、river)支持该协议,wtype 可直接输入。

剪贴板行为

Wayland 上没有 wtype 时,注入通过"写剪贴板 → 模拟 Ctrl+V"完成,因此涉及剪贴板:

  • 关闭「保留识别文本到剪贴板」时,粘贴后还原原剪贴板内容;图片等非文本内容无法还原,会被清空
  • 开启时,识别文本保留在剪贴板上
  • 终端的粘贴键是 Ctrl+Shift+V,可用 ATOMTYPE_PASTE_KEY=ctrl+shift+v 覆盖
  • 还原前默认等待 400ms 让目标应用取走数据,慢应用可用 ATOMTYPE_CLIPBOARD_RESTORE_MS 调大

构建与运行 CLI

首次构建时 sherpa-rs 会自动下载 sherpa-onnx 预编译静态库(需要网络), 之后完全离线。构建 --no-default-features 可去掉原生依赖(Stub 后端,仅用于开发)。

cargo build --release
# 下载模型(约 140MB,自动解压)
./target/release/atomtype models download
# 检查模型
./target/release/atomtype models doctor
# 生成词典模板
./target/release/atomtype dict default > ~/.config/atomtype/dict.toml
# 启动热键监听(按住 F2 录音,松开转写并注入)
./target/release/atomtype daemon --hotkey F2
# 可选的本地 AI 优化模型(需单独安装 llama.cpp 的 llama-cli 才能启用本地推理)
./target/release/atomtype models download --ai

macOS 用户首次运行 daemon 需要授权(系统设置 → 隐私与安全性):

  • 输入监控:全局热键监听(rdev)
  • 辅助功能:向焦点应用注入文本(enigo)
  • 麦克风:录音采集

构建与运行图形界面

# 开发模式(热重载)
cargo tauri dev

# 发布打包(按当前平台生成安装包)
cargo tauri build

Windows 安装与打包

普通用户应从项目的 AtomGit 发行版 下载安装包,而不是安装仓库中的源代码:

  • AtomType_<版本>_x64-setup.exe:NSIS 安装程序,适合大多数 Windows 用户。
  • AtomType_<版本>_x64_en-US.msi:Windows Installer 包,适合需要 MSI 的部署环境。

安装后可从开始菜单启动 AtomType;卸载时进入“设置 → 应用 → 已安装的应用”,找到 AtomType 并选择“卸载”。Windows 首次运行需要在系统隐私设置中允许麦克风访问。

维护者在 Windows x64 开发环境中执行:

cargo tauri build

构建完成后会生成:

target/release/bundle/msi/AtomType_1.0.0_x64_en-US.msi
target/release/bundle/nsis/AtomType_1.0.0_x64-setup.exe

文件名中的版本号来自 src-tauri/tauri.conf.json。安装包应上传到 AtomGit Release, 不要提交到 Git 历史。AtomGit 当前托管 Runner 不提供 Windows 环境;自动打包需要由 项目维护者配置 Windows 自托管 Runner,在此之前应在 Windows 开发机上执行上述命令。

命令一览

atomtype devices                       # 列出可用音频输入设备
atomtype models download               # 下载离线 ASR 模型
atomtype models download --ai          # 下载本地 AI 优化 GGUF 模型(Qwen2.5-0.5B)
atomtype models doctor                 # 检查模型可用性
atomtype daemon --hotkey F2            # 启动热键监听守护进程
atomtype transcribe input.wav          # 转写 WAV,输出 JSON
atomtype transcribe input.wav --format srt --output out.srt
atomtype dict default                  # 输出词典模板
atomtype dict doctor                   # 检查词典加载
atomtype config default                # 输出配置模板
atomtype config schema                 # 输出 JSON Schema
atomtype config doctor                 # 检查配置加载
atomtype completion zsh                # 输出 shell 补全脚本

热键模式

# 按住录音
atomtype daemon --hotkey "ctrl+f2" --hotkey-mode pressed

# 按一次开始,再按一次停止
atomtype daemon --hotkey "ctrl+f2" --hotkey-mode toggle

# 触发键开始,结束键停止
atomtype daemon --hotkey "ctrl+f2" --hotkey-mode trigger-end --end-hotkey "ctrl+f3"

配置

默认配置路径:

  • macOS: ~/.config/atomtype/config.toml
  • Linux: ~/.config/atomtype/config.toml
  • Windows: %APPDATA%\atomtype\config.toml

示例:

[asr]
model = "paraformer"
sample-rate = 16000

[hotkey]
key = "ctrl+f2"
mode = "pressed"
end-key = ""

[post]
english-punctuation = true
strip-trailing-period = true
append-newline = false
smart-numbers = true          # 中文数字 → 阿拉伯数字
filter-fillers = false        # 过滤语气词(嗯、啊、呃)
traditional-chinese = false   # 简转繁输出
strip-trailing-punctuation = false  # 删除结尾标点

[models]
auto-unload = true    # 空闲时自动卸载识别模型,释放内存
idle-seconds = 60     # 空闲多少秒后卸载(上限 3600),下次使用自动重载

词典

默认词典路径:~/.config/atomtype/dict.toml

hotwords = ["GPT", "ChatGPT", "OpenAI", "API"]

rime-imports = ["~/Library/Rime/wanxiang_english.dict.yaml"]
max-rime-words = 20000

[rewrites]
"g p t" = "GPT"
"a p i" = "API"
"u r l" = "URL"

架构

atomtype/
├── crates/
│   ├── atomtype            # 公共类型与错误
│   ├── atomtype-config     # TOML 配置 + schema + 后处理选项
│   ├── atomtype-audio      # cpal 录音采集
│   ├── atomtype-asr        # sherpa-onnx ASR + VAD + PUNC
│   ├── atomtype-hotkey     # 全局热键监听
│   ├── atomtype-inject     # 跨平台文本注入 (enigo)
│   ├── atomtype-dict       # 词典加载与改写
│   └── atomtype-cli        # CLI 入口 (clap)
└── src-tauri/             # Tauri 2 GUI(状态面板、设置、悬浮球)
└── ui/                    # 纯静态 HTML/CSS/JS 前端

设计决策与亮点

对比参考:vocotype-cli — 同样定位的 Python 离线语音输入法。

方面 决策 理由
识别引擎抽象 Recognizer trait + Stub/Sherpa 双实现 开发期可编译运行,正式期通过 feature flag 启用 native 绑定;vocotype-cli 的 FunASR/Volcengine 双后端设计验证了这种插拔式架构的价值
音频管道 采集端用设备原生采样率(44100/48000),rubato 重采样到 16kHz 避免 cpal no matching input config(已踩坑修复);与 vocotype-cli 相同的重采样思路但用 Rust 实现更安全
热键模式 三种模式(pressed/toggle/trigger-end)在 daemon 层用 match 实现 热键库只负责按键事件,模式逻辑上移,各层各司其职
配置分层 Config(6 个子结构)+ DictConfig(独立) 配置和词典各自独立存储、独立加载、独立 schema
Tauri 集成 前端纯静态 HTML(无构建步骤),frontendDist: "../ui";设置面板含开关、快捷键、悬浮球 零前端工具链,保持最小依赖,适合 Rust 开发者;所有设置即时同步到 TOML 配置
配置路径跨平台 macOS: ~/Library/Application Support/,其他: XDG/config 通过 dirs crate 实现平台感知
ASR 引擎选型 sherpa-onnx + Paraformer(~140MB) 相比 vocotype-cli 的 FunASR(~500MB),模型更小、推理更快、Rust 原生绑定无需 Python 运行时;Paraformer 专为短语音输入法场景优化
语言与分发 Rust + 静态编译单二进制 对比 vocotype-cli(Python + 依赖安装),Rust 编译产物无运行时依赖(Linux 的文本注入除外,需要 ydotool 等外部工具,见Linux 运行时依赖),分发成本极低

社区交流

用微信扫描下方二维码加入 AtomType 项目交流群,反馈问题、分享使用心得,和其他用户、维护者一起交流:

0cb7e4b7b0d154e75630b3b53ac20cc7.jpg


致谢

感谢以下开源项目为 AtomType 提供的灵感与技术参考:

License

Apache 2.0 © 小鸿 AI

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages