01
核心业务
离线语音 SDK 面向 Android 与 HarmonyOS 原生应用,提供流式 ASR 和 TTS,并封装模型安装、许可证、会话创建和回调。底层复用 C++、sherpa-onnx 与 ONNX Runtime,平台层分别使用 Kotlin / JNI 和 ArkTS / N-API。
跨端接口相同不意味着线程和生命周期相同。模型属于进程级资源,会话持有自己的音频、解码和终态;业务回调又可能同步调用写入、结束或取消。SDK 需要在桥接、核心会话和业务适配层共同维护这一契约。
音频鉴伪作为独立模型服务纳入同一交付体系,提供文件输入、预处理、模型推理与检测结果接口。端侧语音 SDK、Windows 本地服务和私有 Docker 服务分别运行,复用模型资产校验、授权与制品验证方法。
- 01运行时与资源
- Runtime 管理许可证、模型池和共享后处理,Engine 管理识别配置,Session 持有流与音频状态。
- 02音频与文本
- PCM 输入经增益、切分、流式解码和最终文本处理;标点、ITN、声纹与领域处理各有入口。
- 03宿主集成
- 原生接口、回调重入、资源释放、设备授权与 SDK / Demo 制品一起交付。
- 04音频鉴伪
- 云端服务 2026-10-20 切换到新一代模型,旧模型保留热备;端侧 Windows 旧安装包因内置未保护权重停止交付,受保护版本仍是源码候选。
- 05模型服务交付
- 语音能力以原生 SDK 接入宿主应用,鉴伪能力以本地 HTTP 服务或私有镜像对接业务系统;接口和运行依赖分别管理。
02
技术栈
- 公共推理
- C++sherpa-onnxONNX Runtime
- Android
- KotlinJNIGradleAAR / APK
- HarmonyOS
- ArkTSN-APIDevEcoHAR / HAP
- 授权与交付
- 离线许可证设备绑定模型清单与验签
03
系统架构与部署
Android 与 HarmonyOS 使用不同原生桥接,共享推理能力。进程级模型资源与会话级音频状态分离,final 和 complete 受会话终态约束。 Android
Kotlin / JNI / Gradle / AAR + APK接口适配、HandlerThread 调度、原生依赖与模型资源随宿主集成。
HarmonyOS
ArkTS / N-API / HAR + HAPPromise 串行队列、音频分发与回调门控制 native 重入和生命周期。
原生能力
C++ / sherpa-onnx / ONNX RuntimeRecognizer、Stream、VAD、标点、ITN、声纹和模型资产校验。
Windows 安装包
ZIP / Setup EXE / 便携 Python安装器解出解释器、依赖、模型和服务,注册 Windows Service。
推理变体
PyTorch-slim / ONNX Runtime CPU两种引擎独立构建、独立哈希与真机验证;ONNX 候选仍由 Python 承载。
私有服务器
Docker / Python 模型服务模型资产与服务镜像组织为独立交付,不用 Windows 验收替代服务端验证。
04
核心业务链路
启动回调中立即结束会话
- 1Session 发布
- 2onStart
- 3writeAudio / finish / cancel
- 4回调门
onStart 表示会话已经可用,调用方可以在回调内同步结束或取消。适配层用 generation 与 gate 保护当前会话,防止旧 native 回调进入下一场会话,或在资源释放后继续返回结果。
一句话结束与整场识别结束
- 1partial
- 2isFinal
- 3继续输入;finish
- 4isLast
- 5onComplete
endpoint 可以产生多条 isFinal=true、isLast=false。只有显式结束或会话终止条件进入唯一的最后结果,再触发唯一 complete;cancel 路径不补 final 与 complete。长录音连续断句必须遵守这个区分。
05
关键机制与取舍
01模型池复用与会话状态隔离
- 约束
- 模型加载耗时且占用内存,如果每场会话重建就会增加启动成本;共享可变 VAD、Stream 或音频缓存又会产生串扰。
- 做法
- Runtime 管理按语言与配置组织的 Recognizer 池及共享后处理,会话持有独立流和音频状态。并发审查逐项核对模型对象可共享性与 VAD reset 的作用范围,不将所有 native 句柄视为无状态资源。
- 效果
- 模型生命周期与录音生命周期可以分别处理,跨端修复围绕对象所有权进行。
02解码、后处理与业务回调分开串行
- 约束
- decode、文本增强和宿主回调处在不同线程或语言边界,finish 与回调同步重入容易打乱最后结果顺序。
- 做法
- Android 会话使用解码、后处理和回调调度;Harmony 使用串行尾队列、音频分发与回调门。Core 与适配层共同保证 last / complete 的终止合同,并清理取消后的回调。
- 效果
- 生命周期设计落到可检查的线程与状态对象,而不是只提供 start / stop 方法名。
03授权与交付按设备和能力分别校验
- 约束
- ASR 与 TTS 能力、宿主设备指纹和模型资产需要与具体制品匹配,单独编译 SDK 不能证明客户可以运行。
- 做法
- 为能力和设备生成独立授权产物,检查设备去重、签名、包内许可证和模型清单。SDK、Demo、原生依赖与集成文档分层组织,两端制品分别验收。
- 效果
- 阶段授权覆盖 65 个唯一设备,ASR / TTS 两套授权包分别验签;这项结果对应授权产物完整性。
04长会议端侧发热:默认降载与 NPU 候选
- 约束
- 手机上长时间开角色识别,CPU 持续满载导致机身发热、内存上涨,长会议体验随时间变差。
- 做法
- HarmonyOS 候选版本默认开启三项降载设置,角色聚类限制为 512 个训练向量、32 个候选;说话人编码器可选放到 NPU 执行,默认仍走 CPU。
- 效果
- 同机 30 分钟:机身峰值 43.20 → 37.49 °C,峰值内存约 1071 → 789 MB;NPU 编码器每窗 307.7 → 27.7 ms,识别文本逐字一致。代价是单段样例的重叠语音召回 38.53% → 34.4%;均为候选版本,NPU 身份准确率尚未验收。
05运行依赖决定主要包体
- 约束
- 模型文件更换后,如果仍保留完整 PyTorch 与重复依赖,交付体积不会随引擎名称自然下降。
- 做法
- 先建立 PyTorch 精简依赖变体,再为 ONNX Runtime 单独组织解释器、CPU Runtime 和 NumPy 预处理。候选保留独立版本和构建清单,安装与推理接口保持一致。
- 效果
- Windows 候选 PyTorch-slim 为 414.48 MiB,较基线减少 7.68%;ONNX 为 286.18 MiB,减少 36.26%。
06卸载处理原生 DLL 的释放窗口
- 约束
- Windows 服务已经退出时,模型运行时 DLL 句柄仍可能延迟释放,直接删除目录会使卸载失败。
- 做法
- 在卸载流程中处理服务停止与句柄释放时序,并在 Windows 真机检查安装目录、服务项和防火墙规则残留。
- 效果
- 两种候选分别通过 9 项安装、运行和卸载验证;同一音频两引擎分数差约 2.384e-7,这一对照只对应当次样本。
06
AI 协作开发
端点检测修复、替代 PR 和真机回归由 Agent 推进;安装弹窗等真机交互先读取界面结构再操作,不盲点。
- 仓库规则
运行时改动必须真机验证
SDK 运行时行为的改动要在受影响平台的真机上验证;同一提交、设备和二进制的有效证据可复用,额外重放必须带来新的诊断信息。
- 合并门禁
CI、平台构建与真机三道
PR 合并需要 CI、对应平台构建和真机验证全部通过,候选包在验收前一律标为候选。
- 纠错
配置值不是实测值
端点检测配置 800 ms 是输入参数,真机实测约 1.6 s;“某 PR 已合并”被更正为“已关闭,由替代 PR 合并”。
正式发布版本与候选版本分开记录,候选包不写成已交付。
07
阶段成果
- 技术覆盖原生推理、音频处理、跨语言桥接、线程调度、设备授权与客户集成。
- 接口行为通过对象所有权与终态合同解释,便于处理长录音、回调重入和资源释放问题。
- 正式发布与候选版本分开记录:HarmonyOS 0.3.20–0.3.24 为候选,端侧发热与热词优化随候选验证。
- 模型工程延伸到离线运行时、系统服务、安装生命周期与产物验证。
- 两条 Windows 工程候选具备绑定精确哈希的真机结果,平台矩阵仍区分各部署形态。