一句话结论:在 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 类 / 配置
流式(实时)ASROnlineRecognizer、OnlineRecognizerConfig、OnlineStream、OnlineModelConfig
非流式 ASROfflineRecognizer、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 及以上准备。

包页面:https://ohpm.openharmony.cn/#/cn/detail/sherpa_onnx

2.2 路线 B(要改 C++ 才用):从源码构建 HAR

整体流程是「先编出鸿蒙版 .so,再把它打进 HAR」。

第 1 步:准备 Command Line Tools

设置环境变量指向 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 笔记本从零构建:

https://github.com/k2-fsa/colab/blob/master/sherpa-onnx/harmony-os/sherpa_onnx_harmonyos_build_har.ipynb

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 运行与现成安装包


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 / HarmonyOSAndroid
依赖管理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.soJNI → libsherpa-onnx-jni.so
底层 solibsherpa-onnx-c-api.so + libonnxruntime.solibsherpa-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.resourceManagerapplication.assets(AssetManager)
TTS 特殊处理常需 listRawfileDir 拷到 filesDir 沙箱常从 assets 拷到 filesDir 再用真实路径
麦克风权限ohos.permission.MICROPHONE(module.json5)android.permission.RECORD_AUDIO(Manifest)
录音 API@kit.AudioKit 的 audio.createAudioCapturerandroid.media.AudioRecord
后台推理Worker + postMessagethread / 协程 + Handler
最低 SDK官方示例 4.0.0(10);SIG 示例 API 11minSdk 21
支持架构arm64-v8a / armeabi-v7a / x86-64(含模拟器)arm64-v8a / armeabi-v7a / x86 / x86_64
构建工具DevEco Studio + hvigorw assembleHarAndroid 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
流式实时 ASRhttps://github.com/k2-fsa/sherpa-onnx/tree/master/harmony-os/SherpaOnnxStreamingAsr
VAD + 非流式 ASRhttps://github.com/k2-fsa/sherpa-onnx/tree/master/harmony-os/SherpaOnnxVadAsr
端侧 TTShttps://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/AsrAndTtsOpenHarmony 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-onnxGitHub 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 的 Colabhttps://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. 九个高频坑(按出现频率排序)

  1. 模型没放对目录:鸿蒙必须 resources/rawfile/,Android 必须 assets/;代码里填相对路径,别把目录名也写进去。
  2. 只装了 HAR 没下模型:包只有引擎,模型要自己放,否则初始化报错或返回空串。
  3. 模型包没瘦身:test_wavs、非 int8 大模型、多余 .fst 全要删;一个 163 MB 的 TTS 模型能直接把 HAP / APK 撑爆。
  4. 采样率不对:统一 16 kHz 单声道。官方 VadAsr 示例会直接判断 wave.sampleRate != 16000 并返回错误提示。
  5. 推理跑在 UI 线程:鸿蒙用 Worker,Android 用子线程;decode() 是同步阻塞的。
  6. TTS 直接用 rawfile 路径:部分 TTS 模型需要 dataDir / lexicon.txt 的真实文件路径,得先拷到 filesDir 沙箱(SIG 的 AsrAndTts 就是这么做的)。
  7. 版本号不一致:鸿蒙侧 oh-package.json5 的版本要和 HAR 内 so 一致;Android 侧 JitPack 版本必须带 v 前缀。本文的版本号取自不同时间点的快照,别混用。
  8. 直接复用示例的签名配置:开源示例工程里的 build-profile.json5 常带着提交者本机的签名文件路径与占位配置,照搬必然编译失败,要换成自己的签名材料。
  9. 在 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 核验。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐