Skip to content

Repository files navigation

灵隼语音键盘(tone_keyboard)

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

启用与使用

  1. 打开主 App「灵隼」,按引导下载语音模型(约 165MB,走前台服务,熄屏不中断)
  2. 系统设置 → 输入法管理 → 启用「灵隼语音键盘」(Android 安全机制要求手动启用,代码无法代劳),在任意输入框切换到本键盘
  3. 键盘顶部音色栏选择音色后,即可 🔊 朗读 / 分享光标前文本
  4. (可选)在主 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 内。

包结构(org.mxr.tone_keyboard

职责
ime 输入法服务与键盘 UI:ComposeImeService(InputMethodService ↔ Compose 生命周期桥接)、ToneKeyboardService(输入法入口,持 InputConnection 与合成协程)、ImeState(composing / 候选 / 音色等跨视图共享状态)、KeyboardScreen
pinyin 拼音引擎:PinyinEngine(候选 / 整句维特比 / 九键混合召回 / 简拼)、DictTableDictTableBuilderDoubleArrayTriePinyinSyllables
learn 用户词频叠加层 UserDictionaryfilesDir/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.onnxdecoder.int8.onnxvocos_24khz.onnxtokens.txtlexicon.txtespeak-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 音色库 —— 预置音色参考音频

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages