OpenHarmony 上怎么跑 sherpa-onnx:示例工程、文档网站,以及与 Android 集成的逐项对比
一句话结论:在 OpenHarmony 上,sherpa-onnx 已经被封装成一个可以直接
ohpm install sherpa_onnx安装的 HAR 包,上层用 ArkTS 调用,模型放进rawfile,推理丢进 Worker 线程,全程不联网。和 Android 相比,算法 API 几乎同名同形,差别集中在工程配置、资源路径和打包方式上——迁移成本比大多数人预期的低得多。
0. 阅读前须知(版本是最容易踩的坑)
本文的源码细节基于 sherpa-onnx v1.12.38,同时参考了官方 HarmonyOS 示例工程与 OpenHarmony SIG 的中文示例 AsrAndTts。需要注意:官方文档站的部分示例已经出现过 v1.13.x、v2.0.x,OpenHarmony 三方库中心仓页面上的示例版本则是 1.12.x。
文中的版本号都只是示例值,落地时请统一替换成你自己实际使用的版本,并保证 oh-package.json5 里声明的版本与 HAR 内实际打包的 .so 版本一致。版本不一致是初始化失败最常见的原因之一。
1. 先搞清楚:它在鸿蒙上到底是什么形态
sherpa-onnx 是新一代 Kaldi(k2-fsa)的端侧语音推理框架,基于 ONNX Runtime,把语音识别、语音合成、VAD、声纹、关键词唤醒、标点恢复等能力全部放在设备本地运行。在鸿蒙侧,它分成三层:
| 层次 | 内容 | 开发者是否需要碰 |
|---|---|---|
| 推理引擎 | C++ 实现 + libonnxruntime.so | 一般不用 |
| 桥接层 | libsherpa-onnx-c-api.so,通过 NAPI 暴露给 ArkTS | 只有改 C++ 时才碰 |
| 应用层 | sherpa_onnx.har(Index.ets 导出 ArkTS 类) | 每天都要用 |
HAR 的 Index.ets 中导出的主要类型,基本就是全部可用接口:
| 能力 | ArkTS 类 / 配置 |
|---|---|
| 流式(实时)ASR | OnlineRecognizer、OnlineRecognizerConfig、OnlineStream、OnlineModelConfig |
| 非流式 ASR | OfflineRecognizer、OfflineRecognizerConfig、OfflineStream、OfflineModelConfig |
| VAD 端点检测 | Vad、VadConfig、SileroVadConfig、TenVadConfig、SpeechSegment、CircularBuffer |
| TTS 语音合成 | OfflineTts、OfflineTtsConfig、TtsInput、TtsOutput、TtsGenerationConfig |
| 说话人相关 | SpeakerEmbeddingExtractor、SpeakerEmbeddingManager、OfflineSpeakerDiarization |
| 其他 | KeywordSpotter、OfflinePunctuation、OnlinePunctuation、readWave、readWaveFromBinary、listRawfileDir |
这里有个关键认知:HAR 只是发动机,模型要自己下载。模型是若干 .onnx 文件加 tokens.txt,不放进工程里,代码写得再对也只会得到空结果或初始化失败。
2. OpenHarmony 集成:两条路线
2.1 路线 A(推荐):用 ohpm 一行装官方 HAR
如果不改 C++,完全没必要自己编译。官方已经把预编译 HAR 发布到 OpenHarmony 三方库中心仓:
ohpm install sherpa_onnx
也可以在 entry/oh-package.json5 里写死版本:
{
"dependencies": {
"sherpa_onnx": "1.12.38"
}
}
然后在 DevEco Studio 里执行 File -> Sync and Refresh Project。
SDK 版本要求:官方示例的 build-profile.json5 中是 "compatibleSdkVersion": "4.0.0(10)"、runtimeOS: "HarmonyOS";OHPM 页面标注的最低兼容 API 同样是 10。而 OpenHarmony AI Model SIG 的中文示例 AsrAndTts 要求 API 11、runtimeOS: "OpenHarmony"。所以结论是:最低 API 10,建议按 11 及以上准备。
2.2 路线 B(要改 C++ 才用):从源码构建 HAR
整体流程是「先编出鸿蒙版 .so,再把它打进 HAR」。
第 1 步:准备 Command Line Tools
- 官方下载:https://developer.huawei.com/consumer/cn/download/ (需华为账号)
- 备用:https://huggingface.co/csukuangfj/harmonyos-commandline-tools
- 国内加速:https://hf-mirror.com/csukuangfj/harmonyos-commandline-tools/tree/main
设置环境变量指向 native SDK:
export OHOS_SDK_NATIVE_DIR=/path/to/command-line-tools/sdk/default/openharmony/native/
第 2 步:交叉编译鸿蒙版 so
仓库根目录自带三个脚本:build-ohos-arm64-v8a.sh、build-ohos-armeabi-v7a.sh、build-ohos-x86-64.sh。以 arm64 为例:
cd sherpa-onnx
./build-ohos-arm64-v8a.sh
脚本内部做的事情值得了解:用 ohos.toolchain.cmake 做交叉编译,从 hf-mirror.com/csukuangfj/onnxruntime-libs 拉取 onnxruntime(脚本中固定为 1.16.3),CMake 开关关闭 Python / Tests / JNI / PortAudio,打开 C API 与 BUILD_SHARED_LIBS=ON,最后执行 make install/strip,并把产物自动拷贝到:
harmony-os/SherpaOnnxHar/sherpa_onnx/src/main/cpp/libs/arm64-v8a/
├── libsherpa-onnx-c-api.so
└── libonnxruntime.so
注意:这些脚本是 bash + wget + cmake 的 Linux/macOS 流程,Windows 原生命令行跑不通,建议直接在 WSL2 Ubuntu 里执行——这点和 Android 的 NDK 编译脚本完全一样。
第 3 步:用 hvigorw 打 HAR
cd sherpa-onnx/harmony-os/SherpaOnnxHar/
export PATH=/path/to/command-line-tools/bin:$PATH
hvigorw clean --no-daemon
hvigorw --mode module -p product=default -p module=sherpa_onnx@default \
assembleHar --analyze=normal --parallel --incremental --no-daemon
产物路径:
./sherpa_onnx/build/default/outputs/default/sherpa_onnx.har
仓库里的 release.sh 还给出了发布命令 ohpm publish <har路径>,以及用 DevEco Studio 图形界面 Build -> Make Module 的等价做法。不想搭本地环境的话,官方还提供了 Colab 笔记本从零构建:
2.3 模型放哪:必须是 rawfile
这是鸿蒙侧最容易搞错的一点。官方所有示例都把模型放在:
entry/src/main/resources/rawfile/
代码里填的是相对 rawfile 根目录的路径,不带 rawfile/ 前缀,例如 ${modelDir}/encoder-xxx.int8.onnx。典型下载流程(VAD + 非流式 ASR):
cd harmony-os/SherpaOnnxVadAsr/entry/src/main/resources/rawfile
# VAD 模型
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/silero_vad.onnx
# 中英日韩粤 SenseVoice(int8 量化版更适合端侧)
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17-int8.tar.bz2
tar xvf sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17-int8.tar.bz2
rm sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17-int8.tar.bz2
rm -rf sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17-int8/test_wavs
流式识别用 sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20(encoder / decoder / joiner.onnx 加 tokens.txt 共四个文件)。
务必删掉模型包里的测试音频、未量化的大模型和 README。官方文档反复强调这点:一个 vits-melo-tts-zh_en 的 model.onnx 就有 163 MB,忘删会直接让安装包体积爆炸。
有一个例外要单独说明:TTS 模型往往需要真实文件系统路径(dataDir、dict、lexicon.txt 等),而 rawfile 是打进包里的资源,不是普通目录。SIG 的 AsrAndTts 示例给的做法是先拷贝到应用沙箱:
import { listRawfileDir } from 'sherpa_onnx';
function copyRawFileDirToSandbox(context: Context, srcDir: string) {
const mgr = context.resourceManager;
const allFiles: string[] = listRawfileDir(mgr, srcDir);
for (const src of allFiles) {
const data = mgr.getRawFileContentSync(src); // ArrayBuffer
const dst = context.getApplicationContext().filesDir + '/' + src;
// 用 @ohos.file.fs 写入,必要时先 mkdir
}
}
2.4 权限、录音与线程
在 entry/src/main/module.json5 里申请麦克风权限:
"requestPermissions": [
{
"name": "ohos.permission.MICROPHONE",
"reason": "$string:mic_reason",
"usedScene": { "abilities": ["EntryAbility"], "when": "inuse" }
}
]
录音用 @kit.AudioKit 的 audio.createAudioCapturer,注册 readdata 回调拿到 ArrayBuffer,把 Int16Array 归一化成 Float32Array(除以 32768.0),采样率统一 16 kHz、单声道。官方示例还会把 16 位 PCM 拼上 WAV 头存成文件(savePcmToWav)。
推理必须放 Worker:官方每个示例都在 entry/src/main/ets/workers/ 下放了 XxxWorker.ets,主线程通过 workerPort.postMessage 把音频块送进去,识别结果再 postMessage 回来。直接在 UI 线程跑 decode() 会明显卡顿。
2.5 真实的 ArkTS 调用代码
下面这段摘自官方 StreamingAsrWorker.ets(略作精简),可以看到完整调用链:
import {
OnlineModelConfig, OnlineRecognizer, OnlineRecognizerConfig,
OnlineStream, readWaveFromBinary, Samples
} from 'sherpa_onnx';
import worker, { ThreadWorkerGlobalScope, MessageEvents } from '@ohos.worker';
const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
let recognizer: OnlineRecognizer;
let micStream: OnlineStream;
function initStreamingAsr(context: Context): OnlineRecognizer {
const modelDir = 'sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20';
const modelConfig = new OnlineModelConfig();
modelConfig.transducer.encoder = `${modelDir}/encoder-epoch-99-avg-1.int8.onnx`;
modelConfig.transducer.decoder = `${modelDir}/decoder-epoch-99-avg-1.onnx`;
modelConfig.transducer.joiner = `${modelDir}/joiner-epoch-99-avg-1.int8.onnx`;
modelConfig.tokens = `${modelDir}/tokens.txt`;
modelConfig.modelType = 'zipformer';
modelConfig.numThreads = 2;
modelConfig.debug = true;
const config = new OnlineRecognizerConfig();
config.modelConfig = modelConfig;
config.enableEndpoint = true; // 自动断句
return new OnlineRecognizer(config, context.resourceManager);
}
// 一段音频的完整识别
function decodeFile(filename: string): string {
const wave: Samples = readWaveFromBinary(readBytes(filename)) as Samples;
const stream = recognizer.createStream();
stream.acceptWaveform(wave);
const tailPadding = new Float32Array(0.5 * wave.sampleRate); // 尾部补 0.5s 静音
stream.acceptWaveform({ samples: tailPadding, sampleRate: wave.sampleRate });
while (recognizer.isReady(stream)) {
recognizer.decode(stream);
}
return recognizer.getResult(stream).text;
}
// 麦克风实时流式:主线程不断送 samples
workerPort.onmessage = (e: MessageEvents) => {
if (e.data['msgType'] === 'streaming-asr-decode-mic-samples') {
const samples = e.data['samples'] as Float32Array;
const sampleRate = e.data['sampleRate'] as number;
micStream.acceptWaveform({ samples, sampleRate });
while (recognizer.isReady(micStream)) {
recognizer.decode(micStream);
const text = recognizer.getResult(micStream).text;
if (recognizer.isEndpoint(micStream)) {
recognizer.reset(micStream);
}
workerPort.postMessage({ msgType: 'streaming-asr-decode-mic-result', text });
}
}
};
VAD + 非流式 ASR 的模式也一样清晰(NonStreamingAsrWithVadWorker.ets):new Vad(config, 60, mgr) → 逐窗 vad.acceptWaveform() → vad.flush() → 从 vad.front() 取出 SpeechSegment → 每段建一个 OfflineStream → recognizer.decode(stream) → getResult(stream).text,顺带还能拿到起止时间戳,天然适合做字幕。
2.6 运行与现成安装包
- 用 DevEco Studio 直接
Open→harmony-os/SherpaOnnxStreamingAsr(或SherpaOnnxTts/SherpaOnnxVadAsr等)→ 连真机运行。模拟器对麦克风支持有限,建议用真机。 - 不想编译可以先装官方预编译 HAP:目前只提供 VAD + 非流式 ASR 一个 HAP。
3. Android 上怎么用(作为对照)
3.1 最省事:JitPack 一行依赖
Android 侧的 Java/Kotlin 封装已经打成 AAR 发布到 JitPack,不用自己编 so。官方 SherpaOnnxJavaDemo、SherpaOnnxSimulateStreamingAsrWearOs 就是这种用法:
// settings.gradle
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
// app/build.gradle
implementation 'com.github.k2-fsa.sherpa-onnx:sherpa-onnx:v1.13.5'
注意版本号要带 v 前缀。仓库根目录的 jitpack.yml 也印证了这个坐标:它从 GitHub Releases 下载对应版本的 AAR,再用 mvn install:install-file 以 com.k2fsa.sherpa.onnx:sherpa-onnx:<version> 安装。
3.2 自己编 so / AAR
需要定制 ABI 或做内网分发时:
# 方式一:官方源码自带脚本,按 ABI 编译
./build-android-arm64-v8a.sh # 另有 armv7-eabi / x86-64 / x86 三个
cp build-android-arm64-v8a/install/lib/lib*.so \
android/SherpaOnnx/app/src/main/jniLibs/arm64-v8a/
# 方式二:直接下载官方预编译包后打 AAR
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.12.38/sherpa-onnx-1.12.38-android.tar.bz2
cd android/SherpaOnnxAar
./gradlew :sherpa_onnx:assembleRelease
# 产物:sherpa_onnx/build/outputs/aar/sherpa_onnx-release.aar
四个 ABI 目录:arm64-v8a、armeabi-v7a、x86_64、x86。官方文档建议只保留一个 ABI(真机 arm64-v8a,模拟器 x86_64),能显著减小包体。最终生成两个 so:libonnxruntime.so 与 libsherpa-onnx-jni.so。
3.3 模型放 assets,用 AssetManager 传参
cd android/SherpaOnnx/app/src/main/assets/
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20.tar.bz2
tar xvf sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20.tar.bz2
Kotlin 侧(MainActivity.kt 的 initModel()):
val config = OnlineRecognizerConfig(
featConfig = getFeatureConfig(sampleRate = 16000, featureDim = 80),
modelConfig = getModelConfig(type = 0)!!,
endpointConfig = getEndpointConfig(),
enableEndpoint = true,
)
recognizer = OnlineRecognizer(
assetManager = application.assets, // ← 与鸿蒙的 resourceManager 对应
config = config,
)
录音用 AudioRecord(MediaRecorder.AudioSource.MIC、16000 Hz、CHANNEL_IN_MONO、ENCODING_PCM_16BIT),在 kotlin.concurrent.thread 里循环读取;权限是 android.permission.RECORD_AUDIO。构建用 ./gradlew assembleDebug + adb install,或用 Android Studio 的 Build -> Make Project。
3.4 现成 APK
Android 侧官方提供了 14 个预编译 APK(流式识别、Two-pass、TTS、TTS Engine、VAD、VAD+ASR、音频标签、WearOS、声纹、语种识别、KWS、QNN NPU 版等),并且几乎每个都配了国内下载页:
- 总列表:https://k2-fsa.github.io/sherpa/onnx/android/prebuilt-apk.html
- 流式识别国内入口:https://k2-fsa.github.io/sherpa/onnx/android/apk-cn.html
- TTS 国内入口:https://k2-fsa.github.io/sherpa/onnx/tts/apk-cn.html
- VAD+ASR 国内入口:https://k2-fsa.github.io/sherpa/onnx/vad/apk-asr-cn.html
- Two-pass 国内入口:https://k2-fsa.github.io/sherpa/onnx/android/apk-2pass-cn.html
4. OpenHarmony vs Android:逐项对比
| 维度 | OpenHarmony / HarmonyOS | Android |
|---|---|---|
| 依赖管理 | ohpm install sherpa_onnx,OHPM 中心仓 | Gradle + JitPack(com.github.k2-fsa.sherpa-onnx:sherpa-onnx:vX.Y.Z) |
| 交付包形态 | sherpa_onnx.har(HAR) | sherpa-onnx-*.aar(AAR)/ APK |
| 上层语言 | ArkTS(.ets) | Kotlin / Java |
| Native 桥接 | NAPI → libsherpa_onnx.so | JNI → libsherpa-onnx-jni.so |
| 底层 so | libsherpa-onnx-c-api.so + libonnxruntime.so | libsherpa-onnx-jni.so + libonnxruntime.so |
| so 放置目录 | sherpa_onnx/src/main/cpp/libs/arm64-v8a/ | app/src/main/jniLibs/<ABI>/ |
| 模型资源目录 | entry/src/main/resources/rawfile/ | app/src/main/assets/ |
| 模型路径传入 | context.resourceManager | application.assets(AssetManager) |
| TTS 特殊处理 | 常需 listRawfileDir 拷到 filesDir 沙箱 | 常从 assets 拷到 filesDir 再用真实路径 |
| 麦克风权限 | ohos.permission.MICROPHONE(module.json5) | android.permission.RECORD_AUDIO(Manifest) |
| 录音 API | @kit.AudioKit 的 audio.createAudioCapturer | android.media.AudioRecord |
| 后台推理 | Worker + postMessage | thread / 协程 + Handler |
| 最低 SDK | 官方示例 4.0.0(10);SIG 示例 API 11 | minSdk 21 |
| 支持架构 | arm64-v8a / armeabi-v7a / x86-64(含模拟器) | arm64-v8a / armeabi-v7a / x86 / x86_64 |
| 构建工具 | DevEco Studio + hvigorw assembleHar | Android Studio + gradlew assembleDebug |
| 交叉编译脚本 | build-ohos-*.sh(3 个) | build-android-*.sh(4 个) |
| 官方示例数量 | harmony-os/ 下 6 个 | android/ 下 18+ 个 |
| 预编译安装包 | 1 个 HAP(VAD + 非流式 ASR) | 14 个 APK,含国内镜像页 |
| NPU 示例 | 暂无专门示例(框架层面支持 RKNN / Ascend / Axera) | 有 QNN(高通)APK、RKNN 预编译包 |
| 中文示例生态 | GitCode 上 OpenHarmony AI Model SIG 的 AsrAndTts | 中文博客与教程较多 |
最值得记住的一条:两边的 API 名字和调用链几乎是同一套——
构造 XxxConfig → new XxxRecognizer(config, mgr / assetManager)
→ createStream() → acceptWaveform() → decode() → getResult().text
OnlineRecognizer、OfflineRecognizer、Vad、OfflineTts、KeywordSpotter 在 ArkTS 和 Kotlin 里都是这个名字。所以把一个 Android 语音功能迁到鸿蒙,真正要改的是「依赖怎么引、模型放哪、权限怎么申、线程怎么写」,识别逻辑基本可以照搬,反之亦然。
5. Demo 与网站地址清单
5.1 官方 GitHub(权威来源)
| 用途 | 地址 |
|---|---|
| 主仓库 | https://github.com/k2-fsa/sherpa-onnx |
| HarmonyOS 示例总目录(6 个工程) | https://github.com/k2-fsa/sherpa-onnx/tree/master/harmony-os |
| HAR 源码工程 | https://github.com/k2-fsa/sherpa-onnx/tree/master/harmony-os/SherpaOnnxHar |
| 流式实时 ASR | https://github.com/k2-fsa/sherpa-onnx/tree/master/harmony-os/SherpaOnnxStreamingAsr |
| VAD + 非流式 ASR | https://github.com/k2-fsa/sherpa-onnx/tree/master/harmony-os/SherpaOnnxVadAsr |
| 端侧 TTS | https://github.com/k2-fsa/sherpa-onnx/tree/master/harmony-os/SherpaOnnxTts |
| 说话人日志 | https://github.com/k2-fsa/sherpa-onnx/tree/master/harmony-os/SherpaOnnxSpeakerDiarization |
| 说话人识别 | https://github.com/k2-fsa/sherpa-onnx/tree/master/harmony-os/SherpaOnnxSpeakerIdentification |
| Android 示例总目录(18+ 个) | https://github.com/k2-fsa/sherpa-onnx/tree/master/android |
| Android Java Demo(JitPack 免编 so,最快上手) | https://github.com/k2-fsa/sherpa-onnx/tree/master/android/SherpaOnnxJavaDemo |
| Android AAR 构建工程 | https://github.com/k2-fsa/sherpa-onnx/tree/master/android/SherpaOnnxAar |
| Android 主 Demo(Kotlin 流式 ASR) | https://github.com/k2-fsa/sherpa-onnx/tree/master/android/SherpaOnnx |
| WearOS 模拟流式 ASR(Kotlin DSL + JitPack) | https://github.com/k2-fsa/sherpa-onnx/tree/master/android/SherpaOnnxSimulateStreamingAsrWearOs |
| 问题反馈 | https://github.com/k2-fsa/sherpa-onnx/issues |
Android 侧的
SherpaOnnxTts、SherpaOnnxVadAsr、SherpaOnnxKws等工程,把上面地址里的最后一段替换掉即可。
5.2 国内仓库(GitCode / Gitee)
| 类型 | 地址 | 说明 |
|---|---|---|
| 官方中文鸿蒙 Demo(重点推荐) | https://gitcode.com/openharmony-sig/applications_ai_model_samples/tree/master/AsrAndTts | OpenHarmony AI Model SIG 出品,中文 README,ASR + TTS 一体(按住说话、语音播放、语速/音色切换),基于 sherpa_onnx HAR,API 11 |
| 官方 SIG 示例仓库首页 | https://gitcode.com/openharmony-sig/applications_ai_model_samples | 同仓库还含 AIModelChat、RknnFacialRecognitionDemo 等 |
| GitCode 官方镜像 | https://gitcode.com/GitHub_Trending/sh/sherpa-onnx | GitHub Trending 自动镜像,含 harmony-os/ 全量示例 |
| Gitee 社区镜像(较新) | https://gitee.com/fit_ants/sherpa-onnx | 同步较勤,README 完整(含国内镜像链接表) |
| Gitee 社区镜像 | https://gitee.com/bubailong/sherpa-onnx | 完整 README 与中文模型说明 |
| Gitee OpenHarmony 专区镜像 | https://openharmony.gitee.com/849604155/sherpa-onnx | 个人镜像,版本偏旧 |
避坑提示:Gitee 上并不存在
openharmony-sig/applications_ai_model_samples这个官方仓库(实测 404),该 SIG 的示例仓库托管在 GitCode / AtomGit。Gitee 上搜到的sherpa-onnx基本都是个人或社区镜像,不是官方发布源,版本可能滞后、不保证与 OHPM 包同步。生产项目请以 GitHub 官方仓库 + OHPM 中心仓为准,镜像只适合做国内拉代码加速。
5.3 官方文档与示例网站
| 内容 | 地址 |
|---|---|
| 文档总入口 | https://k2-fsa.github.io/sherpa/onnx/ |
| HarmonyOS 章节 | https://k2-fsa.github.io/sherpa/onnx/harmony-os/index.html |
| 构建 HAR 完整教程(含 ohpm 用法、hvigorw 命令) | https://k2-fsa.github.io/sherpa/onnx/harmony-os/how-to-build-har.html |
| 鸿蒙 TTS 图文教程 | https://k2-fsa.github.io/sherpa/onnx/harmony-os/tts.html |
| 鸿蒙 VAD+ASR 图文教程 | https://k2-fsa.github.io/sherpa/onnx/harmony-os/vad-asr.html |
| 鸿蒙说话人识别教程 | https://k2-fsa.github.io/sherpa/onnx/harmony-os/speaker-identification.html |
| 鸿蒙预编译 HAP 列表 | https://k2-fsa.github.io/sherpa/onnx/harmony-os/prebuilt-hap.html |
| Android 章节 | https://k2-fsa.github.io/sherpa/onnx/android/index.html |
| Android 从源码构建(ABI / jniLibs / assets) | https://k2-fsa.github.io/sherpa/onnx/android/build-sherpa-onnx.html |
| Android 预编译 APK 列表 | https://k2-fsa.github.io/sherpa/onnx/android/prebuilt-apk.html |
Android Java / JitPack 教程(官方文件名拼作 anroid-java.html) | https://k2-fsa.github.io/sherpa/onnx/java-api/anroid-java.html |
| 预训练模型总表 | https://k2-fsa.github.io/sherpa/onnx/pretrained_models/index.html |
| 从零构建 HAR 的 Colab | https://github.com/k2-fsa/colab/blob/master/sherpa-onnx/harmony-os/sherpa_onnx_harmonyos_build_har.ipynb |
| OpenHarmony 三方库中心仓(包页面) | https://ohpm.openharmony.cn/#/cn/detail/sherpa_onnx |
| 浏览器在线试:语音识别 | https://huggingface.co/spaces/k2-fsa/automatic-speech-recognition |
| 浏览器在线试:语音合成 | https://huggingface.co/spaces/k2-fsa/text-to-speech |
5.4 模型下载(国内网络重点)
| 内容 | 地址 |
|---|---|
| ASR 模型(GitHub Releases tag) | https://github.com/k2-fsa/sherpa-onnx/releases/tag/asr-models |
| TTS 模型 | https://github.com/k2-fsa/sherpa-onnx/releases/tag/tts-models |
VAD 模型直链(silero_vad.onnx,约 1.7 MB) | https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/silero_vad.onnx |
| 全部 Release / 预编译库 | https://github.com/k2-fsa/sherpa-onnx/releases |
| HuggingFace 官方模型库 | https://huggingface.co/k2-fsa/sherpa-onnx-models |
| ModelScope 官方模型库(国内直连) | https://modelscope.cn/models/k2-fsa/sherpa-onnx-models |
| ModelScope 社区 ASR 模型镜像(160+ 模型,含下载命令) | https://www.modelscope.cn/models/ZhaoChaoqun/sherpa-onnx-asr-models |
| HF-Mirror(下载加速 / 命令行工具) | https://hf-mirror.com/ |
国内拉不动 GitHub 时,优先用 ModelScope 的 k2-fsa/sherpa-onnx-models(git clone https://www.modelscope.cn/k2-fsa/sherpa-onnx-models.git 或 snapshot_download),或者给 HuggingFace 链接套 hf-mirror.com 前缀。
5.5 中文教程(适合照着做)
| 内容 | 地址 |
|---|---|
开源鸿蒙「拆·应用」第 3 期:sherpa_onnx 实现 ASR/TTS(AI Model SIG 供稿,含流程图与逐段代码) | http://mp.weixin.qq.com/s?__biz=MzkzNTIyNTY3Mg==&mid=2247511129&idx=1&sn=c8c5d5db48db04b1afeb4419bd068e3c |
| GitCode 博客:HAR 集成与五个端侧 AI 示例工程 | https://blog.gitcode.com/522171fe31778ce9417d1a6722a40c10.html |
| GitCode 博客:HAR 包安装与 API 使用 | https://blog.gitcode.com/ca2fac1a25fc88c6d7abad63335263b4.html |
6. 九个高频坑(按出现频率排序)
- 模型没放对目录:鸿蒙必须
resources/rawfile/,Android 必须assets/;代码里填相对路径,别把目录名也写进去。 - 只装了 HAR 没下模型:包只有引擎,模型要自己放,否则初始化报错或返回空串。
- 模型包没瘦身:
test_wavs、非 int8 大模型、多余.fst全要删;一个 163 MB 的 TTS 模型能直接把 HAP / APK 撑爆。 - 采样率不对:统一 16 kHz 单声道。官方
VadAsr示例会直接判断wave.sampleRate != 16000并返回错误提示。 - 推理跑在 UI 线程:鸿蒙用
Worker,Android 用子线程;decode()是同步阻塞的。 - TTS 直接用 rawfile 路径:部分 TTS 模型需要
dataDir/lexicon.txt的真实文件路径,得先拷到filesDir沙箱(SIG 的AsrAndTts就是这么做的)。 - 版本号不一致:鸿蒙侧
oh-package.json5的版本要和 HAR 内 so 一致;Android 侧 JitPack 版本必须带v前缀。本文的版本号取自不同时间点的快照,别混用。 - 直接复用示例的签名配置:开源示例工程里的
build-profile.json5常带着提交者本机的签名文件路径与占位配置,照搬必然编译失败,要换成自己的签名材料。 - 在 Windows 上直接跑
build-ohos-*.sh:脚本是 Linux/macOS 的 bash 流程,用 WSL2 执行最省事。
7. 怎么选:给不同场景的建议
| 你的情况 | 建议路线 |
|---|---|
| 只想在鸿蒙 App 里加离线语音识别 | ohpm install sherpa_onnx + 抄 SherpaOnnxVadAsr 或 SherpaOnnxStreamingAsr 的代码 |
| 要中文 UI、按住说话 + 语音播报一体 | 直接用 GitCode 上 openharmony-sig/applications_ai_model_samples 里的 AsrAndTts,中文注释、API 11、含 VAD + SenseVoice + 6 种 TTS 音色 |
| 要改 C++ / 换 onnxruntime / 加自定义算子 | 走路线 B:build-ohos-arm64-v8a.sh → hvigorw assembleHar → 本地 HAR 依赖 |
| 只是评估效果,不想装环境 | 先装官方预编译 HAP(鸿蒙)或 APK(Android),再打开 HuggingFace Spaces 在浏览器里试模型 |
| 同时做 Android 和鸿蒙双端 | 同一套模型文件 + 同一套调用链,差异只做一层薄封装:把「资源管理器 / 权限 / 录音 / 线程」抽象掉,业务层代码可复用 |
| 网络受限、GitHub 拉不动 | 代码用 GitCode 镜像,模型用 ModelScope 的 k2-fsa/sherpa-onnx-models,Command Line Tools 用 hf-mirror.com 备用源 |
最后说一句现实差异:Android 生态明显更成熟——18+ 个示例、14 个预编译 APK、QNN / RKNN 的 NPU 版本、JitPack 一行依赖;鸿蒙侧目前是 6 个官方示例 + 1 个预编译 HAP。但鸿蒙的优势在于 OHPM 官方包 + ArkTS 原生接口 + OpenHarmony SIG 的中文示例,做政企、专网、纯离线类终端时反而更顺手。两边都是 Apache-2.0,模型也基本同源,双端落地没有授权障碍。
8. 小结
- 鸿蒙用法:
ohpm install sherpa_onnx→ 模型放rawfile→module.json5加麦克风权限 →AudioCapturer采 16 kHz 音频 →Worker里new OnlineRecognizer(config, resourceManager)→createStream / acceptWaveform / decode / getResult。 - Android 用法:JitPack 加 AAR → 模型放
assets→AssetManager传参 →AudioRecord+ 子线程 → 同名 Kotlin 类完成同样调用链。 - 示例地址:官方在
github.com/k2-fsa/sherpa-onnx/tree/master/harmony-os与/android;国内最值得收藏的是gitcode.com/openharmony-sig/applications_ai_model_samples/tree/master/AsrAndTts;文档站在k2-fsa.github.io/sherpa/onnx/。 - 迁移要点:换的是工程壳,不是算法逻辑。
本文源码结论依据 sherpa-onnx v1.12.38 与 OpenHarmony SIG 示例工程;官方文档站、OHPM 中心仓、GitHub / GitCode / Gitee / ModelScope 页面均于 2026-11-12 核验。
更多推荐

所有评论(0)