Android 端离线拼音输入法,内置零样本语音克隆 TTS:随时把光标前的文本用预置音色或你自己的声音朗读出来,也能生成语音文件直接分享到微信 / QQ。
- 纯离线:拼音引擎与 TTS 推理全部在端侧 CPU 完成,输入内容不出设备(唯一联网场景是首次下载模型文件)
- 完整键盘体验:26 键 / 九键(T9)双布局、整句输入、简拼、用户词频学习、中英标点切换
- 零样本克隆:录一段话 + 逐字转写即可克隆音色;另附 6 个预置音色开箱即用
- 26 键全键盘:整句输入(维特比在词图上求最优切分)、前缀联想、简拼(
nh→ 你好) - 九键 T9:数字串直接出候选(
64426→ 你好);左列音节槽逐段锁定读法,纠正 T9 固有歧义;长按数字直接上屏 - 用户词频学习:选词即学习、越用越懂你;数据仅存本机,可在主 App 关闭或一键清除
- Shift 键切换英文大小写与中英标点;数字符号面板;候选栏内嵌键盘顶部,可展开为网格全览
- 词典未加载完成时字母直接上屏(可预测的降级,不打断输入)
- 基于 ZipVoice(蒸馏 int8 量化)+ Vocos 声码器,经 sherpa-onnx 端侧推理
- 6 个预置音色(曼波 / 维克托 / 柔声细语女声 / 可爱搞笑女 / 青年音 / 噜噜),安装即用、无需录制
- 在主 App 录制参考音频 + 逐字转写,即可克隆自己的音色(合成时需提供参考音频与逐字一致的转写)
- 🔊 朗读:朗读光标前最多 200 字文本
- 转语音分享:合成 → AAC m4a → 系统分享面板,微信 / QQ 以文件形式发送
- JDK 25(
androidApp编译目标为 JVM 25;本机多 JDK 时可在~/.gradle/gradle.properties中用org.gradle.java.home指定) - Android 设备或模拟器:
arm64-v8a/x86_64(ABI 已在构建中过滤) - 最低支持 Android 7.0(minSdk 24)
./gradlew :androidApp:assembleDebug
adb install androidApp/build/outputs/apk/debug/androidApp-debug.apk- 打开主 App「灵隼」,按引导下载语音模型(约 165MB,走前台服务,熄屏不中断)
- 系统设置 → 输入法管理 → 启用「灵隼语音键盘」(Android 安全机制要求手动启用,代码无法代劳),在任意输入框切换到本键盘
- 键盘顶部音色栏选择音色后,即可 🔊 朗读 / 分享光标前文本
- (可选)在主 App 录制自己的音色;九键 / 26 键布局偏好自动记住
tone_keyboard/
├── androidApp/ # ★ 全部功能代码 —— 键盘 IME、拼音引擎、TTS、主 App UI
├── shared/ # Kotlin Multiplatform 模板遗留(键盘功能不依赖)
├── iosApp/ # 同上
├── tools/ # build_pinyin_dict.py 词典编译、gen_icons.sh 图标生成
└── docs/design/ # 图标源图
项目最初由 KMP 模板生成,后决定 Android-only:
androidApp已不依赖shared,键盘功能代码全部收敛在androidApp内。
| 包 | 职责 |
|---|---|
ime |
输入法服务与键盘 UI:ComposeImeService(InputMethodService ↔ Compose 生命周期桥接)、ToneKeyboardService(输入法入口,持 InputConnection 与合成协程)、ImeState(composing / 候选 / 音色等跨视图共享状态)、KeyboardScreen |
pinyin |
拼音引擎:PinyinEngine(候选 / 整句维特比 / 九键混合召回 / 简拼)、DictTable、DictTableBuilder、DoubleArrayTrie、PinyinSyllables |
learn |
用户词频叠加层 UserDictionary(filesDir/user_dict.json,上限 5000 条、滞后淘汰、代际号防复活) |
tts |
TtsEngine(进程级单例)、ModelManager / ModelDownloader / ModelDownloadService(模型下载与就绪管理)、AudioExporter(PCM → AAC m4a) |
voice |
音色档案:VoiceProfile(参考音频 + 逐字转写)、PresetVoices(assets 预置音色)、VoiceProfileRepository |
audio |
VoiceRecorder(16kHz 单声道 PCM16 录音)、AudioPlayer(AudioTrack 流式播放)、WavFile |
ui |
主 App MainScreen:模型下载管理、音色录制 / 管理、键盘启用引导、学习开关 |
键盘与主 App 同进程同 UID,直接共享 filesDir 与进程内单例,无 IPC。
数据与加载:
- 词库来自 rime-ice 雾凇拼音(已合并清华 THUOCL 开源词库与腾讯词向量),经
tools/build_pinyin_dict.py编译为按「(拼音升序, 词频降序)」排序的文本词库,约 55 万词条打进 assets(≈15MB) - 音节表来自 Mandarin-Chinese-Syllable-Dataset 的「Mandarin Chinese syllables (excluding tones).txt」(418 个无声调音节),原样拷贝为
assets/pinyin_syllables.txt,引擎加载期解析注入(仅收拉丁拼写,另补 ei / fiao 两个词库在用但数据集缺失的音节),无需自行维护 - 首次运行流式编译为紧凑二进制(两棵 Double-Array Trie + 有序 block 表 + 词条 blob)写入
filesDir,此后 mmap 零拷贝加载(对标 librime 的 prism.bin),运行内存只驻留实际触碰的页,加载约百毫秒
查询设计:
- 不做音节切分:拼音串整体作为 Trie key,
xian同时命中「先」与「西安」(xi'an拼接后同串),歧义交给词频 / 维特比解决 - 九键:数字 Trie 精确匹配 + 混合召回(T9 歧义下召回不丢);k-best 拼音组成供左列逐段锁定读法
- 简拼:加载后对词频 top 块建内存声母索引,在精确 / 整句 / 前缀三路全空时兜住召回
- 个性化:只读 mmap 大词典之外,用户词频作为 boost 表传入引擎,对数域加权重排
- 模型体积装不进 APK(仅 sherpa-onnx 就使 debug APK 达 132MB),首次启动由前台服务下载约 165MB 到
filesDir/zipvoice/:encoder.int8.onnx、decoder.int8.onnx、vocos_24khz.onnx、tokens.txt、lexicon.txt、espeak-ng-data/ - 下载源双保险:GitHub release 直链 → ghfast.top 反代;tar.bz2 边下边流式解压,总耗时 ≈ max(下载, 解压) 而非两者之和;中断恢复有完整性校验
- 推理调优(详见
TtsEngine注释):蒸馏模型固定 4 步;推理线程固定 2(实测 4 线程反而慢 9%~71%);参考音频 LRU 解码缓存;生成全程持锁串行化 - 键盘弹出延迟 2.5s 后台预热模型(首次点朗读不必等 ~2.8s 的加载),键盘收起后空闲自动释放
# 1. 下载 rime-ice 词库(cn_dicts/base.dict.yaml 多字词 + cn_dicts/8105.dict.yaml 单字表)
# 2. 编译为引擎资产(TAB 分隔、(拼音升序, 词频降序) 全局排序)
python3 tools/build_pinyin_dict.py /tmp/base.dict.yaml /tmp/8105.dict.yaml \
-o androidApp/src/main/assets/pinyin_dict.txt启动器图标:bash tools/gen_icons.sh(需 ImageMagick 7,源图 docs/design/tone_keyboard.png)。
./gradlew :androidApp:testDebugUnitTest # 单元测试(引擎 / 状态 / 用户词典)
./gradlew :androidApp:testDebugUnitTest -PscaleDictTest # 规模化验证(用真实 55 万词条 assets 词库)- 拼音输入、候选学习、音色档案与合成过程全部在本机完成;学习数据仅存应用内部存储,可随时关闭 / 一键清除
- 唯一网络访问:首次模型下载(sherpa-onnx 官方 release 及其国内反代)
| 组件 | 版本 |
|---|---|
| Kotlin | 2.4.10 |
| Android Gradle Plugin | 9.4.0 |
| Compose Multiplatform | 1.12.0 |
| sherpa-onnx | v1.13.7(JitPack) |
| minSdk / targetSdk | 24 / 36 |
本项目以 Apache License 2.0 发布。
- rime-ice 雾凇拼音 —— 词库数据(MIT/GPL,随其上游声明)
- Mandarin-Chinese-Syllable-Dataset —— 拼音音节表数据源(CC BY-NC 4.0)
- sherpa-onnx / ZipVoice —— 端侧 TTS 推理与模型
- 清华 THUOCL、腾讯词向量(经 rime-ice 合并)
- mossland.studio 音色库 —— 预置音色参考音频