Skip to content

feat(android/voice): online/offline engine adapters, safe model switching and import completion (#149) - #150

Open
Slacker-LLC wants to merge 54 commits into
mainfrom
feat/voice-engine-adapters-149
Open

Slacker-LLC wants to merge 54 commits into
mainfrom
feat/voice-engine-adapters-149

Conversation

@Slacker-LLC

@Slacker-LLC Slacker-LLC commented Oct 20, 2026 •

Copy link
Copy Markdown
Owner

Issue #149:Android 语音模型与识别运行时解耦

本 PR 仍只推送到 feat/voice-engine-adapters-149,目标分支为 main,未合并。

已实现

  • 统一 VoiceEngineAdapter / VoiceEngineRegistry:根据经过校验的 manifest 选择已编译引擎;未知引擎或格式/语音模式拒绝并解释原因。
  • 统一 VoiceModelRuntime / VoiceModelSession,保留原 sherpa-onnx 流式接口及 PCM 录音管线,支持纯最终结果的离线推理(不伪装 partial)。
  • 两种 sherpa 运行时:OnlineRecognizer 与基于 sherpa-onnx 1.13.6 真实 API 的 OfflineRecognizer。离线模型需明确声明 engineId=sherpa-onnx-offline、recognitionMode=offline 及 family/file roles;目前支持离线 Paraformer、Transducer、Zipformer CTC、NeMo CTC 的适配定义。这是在线/离线两种识别模式,不是声称适配了第二种独立推理框架。
  • 向后兼容的 manifest 字段:engineId、recognitionMode、schemaVersion、modelFormat、sampleRate、channelCount、quantization、licenseId、sourceUrl,新增字段纳入信任指纹,旧模型指纹不变。
  • 模型适配能力决定设置页标点、热词、流式模式和导入时提示;录音不再与具体解码器类型耦合。
  • 引擎/模型切换时通过已选模型 identity 重新初始化识别运行时,并等待旧会话释放,防止旧回调释放新 recognizer。
  • 导入采用暂存、校验、预加载与旧版本备份/失败回滚;启用模型在工作线程先做内存准入和 native 初始化,失败时不切换偏好;模型包不能执行自带 native 库或脚本。
  • 导入成功显示“导入完成 → 完成”;点击完成立即重新初始化输入法的语音组件,保留当前输入框、候选与布局,避免直接杀 IME 进程。
  • 单元测试与独立架构文档 docs/VOICE_ENGINE_ADAPTERS.md。

验证与安全边界

  • 新增 API 34 Android instrumentation:利用仓库自带 voice-beta4.wav 录音,调用真实内置 Paraformer 解码并检查最终文本;该测试必须以 CI 通过为准。\n- GitHub Actions Android CI:./gradlew :app:testDebugUnitTest :app:lintDebug :app:assembleDebug :app:assembleDebugAndroidTest,通过后继续 API 26/29/31/34 模拟器仪表测试;以 CI 实际结论为准,未通过前不宣称完成验证。
  • 仍需可用离线权重完成真实语音端到端识别与性能测试;模型清单可校验不等于手机上已经确认精度/稳定性。
  • 无 INTERNET 权限、无录音落盘、禁用任意 native 插件装载。
  • 新的独立后端(MNN/ncnn/LiteRT 等)属于 [架构] Android 语音模型/推理框架解耦:自动适配、可扩展引擎与模型即插即用 #149 的持续扩展能力与后续独立工作,不在未验证前宣称兼容。
  • [功能建议] 完善中文流式语音模型兼容性,建立模型仓库与 App 内下载目录 #147 仅维护官方链接与具体模型家族适配,不建立额外模型仓库。

Related #149、#147。该 PR 不自动关闭 #149;需先审阅构建、仪表测试及实际 ASR 验证。

本轮继续补充

  • 独立的 VoiceModelInstallTransaction:可回滚 staged→installed 替换;恢复崩溃留下的备份,不覆盖已装的可用模型。

  • VoiceModelRepository 跨实例安装互斥与持久化信任状态恢复,避免预热/安装竞争导致异常回滚。

  • VoiceModelInstallTransactionTest 六项验证:成功、校验失败、原生加载失败回滚、两种中断恢复和危险路径拒绝。

  • Android 14 增加 VoiceOfflineEngineInstrumentedTest:CI 临时下载 sherpa 官方 NeMo CTC 英文小模型,ADB 放入调试应用私有目录,以真正的 sherpa OfflineRecognizer 完成最终结果解码,验证离线模式不输出流式 partial;其他 API 不下载模型,不影响正式 APK 体积。

  • 完整验收以当前功能分支最新 CI 为准;该测试的成功结果不代表所有第三方离线模型均受支持。

  • 录音期模型操作准入:记录当前语音手势 generation,禁止导入、切换、删除;迟到的上一会话 final 不会解除当前手势保护,并添加对应 JUnit 测试。

@Slacker-LLC Slacker-LLC changed the title refactor(android/voice): introduce engine adapters and model capability negotiation (#149) feat(android/voice): online/offline engine adapters, safe model switching and import completion (#149) Oct 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant