Skip to main content

ASR应用说明

修订记录

修订版本修订日期修订说明
0012026-07-10初始版本

概述

本地语音识别(ASR)应用基于 sherpa-onnx 推理框架,在 OpenHarmony 设备上实现完全离线的语音转文字功能。支持中文、英文、粤语、日语、韩语五种语言的实时识别和文件解码。

平台支持情况

平台 & 系统是否支持
K1 OpenHarmony5.0❌ 不支持
K1 OpenHarmony6.1✅ 支持
K3 OpenHarmony6.1✅ 支持

技术栈

层次技术
开发语言ArkTS(TypeScript 超集,OpenHarmony 专用)
UI 框架ArkUI(声明式 UI)
平台 SDKOpenHarmony SDK v12
构建工具Hvigor + DevEco Studio
推理后端sherpa-onnx(通过 HAR 包提供 riscv64 native 库)
ASR 模型SenseVoice(中/英/粤/日/韩多语言)
VAD 模型Silero VAD(端点检测)
多线程Worker(推理在独立线程执行)

核心功能

  • 麦克风实时识别:通过 VAD 检测语音段,自动触发 ASR 推理
  • 文件解码:选择本地 WAV 文件(16kHz)进行离线识别
  • 沙盒文件解码:通过 hdc 推送文件到应用沙盒,一键解码验证
  • 多语言支持:中文、英文、粤语、日语、韩语

项目结构

sherpaonnxvadasr_spacemit/
├── AppScope/ # 应用级资源与配置
│ ├── app.json5 # 包名、版本号
│ └── resources/ # 全局资源(图标等)
├── entry/ # 主模块(HAP)
│ ├── sherpa_onnx.har # sherpa-onnx HAR 包(riscv64 native 库)
│ ├── src/main/ets/
│ │ ├── entryability/
│ │ │ └── EntryAbility.ets # 应用入口
│ │ ├── pages/
│ │ │ └── Index.ets # 主界面(Tab 页:From file / From mic / Help)
│ │ └── workers/
│ │ └── NonStreamingAsrWithVadWorker.ets # ASR+VAD 推理 Worker
│ ├── src/main/resources/
│ │ └── rawfile/ # 模型文件
│ │ ├── sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/
│ │ │ ├── model.int8.onnx # SenseVoice 模型(~239 MB)
│ │ │ └── tokens.txt # 词表
│ │ └── silero_vad.onnx # Silero VAD 模型
│ └── build-profile.json5 # 模块构建配置
├── build-profile.json5 # 项目构建配置
├── oh-package.json5 # 依赖声明
└── README.md

架构

┌───────────────────────────────────────────────────────┐
│ OpenHarmony 设备 │
│ │
│ ┌────────────────────────────────────────────────┐ │
│ │ sherpaonnxvadasr HAP │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────────┐ │ │
│ │ │ EntryAbility │ │ Index.ets │ │ │
│ │ │ (生命周期) │ │ (UI + 控制) │ │ │
│ │ └──────────────┘ └───────┬─────────┘ │ │
│ │ │ postMessage │ │
│ │ ▼ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ NonStreamingAsrWithVadWorker │ │ │
│ │ │ ┌──────────┐ ┌──────────────────┐ │ │ │
│ │ │ │ Silero │ │ SenseVoice │ │ │ │
│ │ │ │ VAD │ → │ ASR (int8) │ │ │ │
│ │ │ └──────────┘ └──────────────────┘ │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────┐ │
│ │ sherpa_onnx.har (riscv64 native libs) │ │
│ │ libc++_shared.so | libonnxruntime.so.1 │ │
│ │ libsherpa-onnx-c-api.so | libsherpa_onnx.so│ │
│ └────────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────┘

代码获取

git clone https://gitee.com/spacemit-openharmony/sherpaonnxvadasr_spacemit.git
cd sherpaonnxvadasr_spacemit

模型文件获取

SenseVoice ASR 模型

从 GitHub Releases 下载:

https://github.com/k2-fsa/sherpa-onnx/releases/tag/asr-models
文件名:sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17.tar.bz2

解压命令(Windows,需 7-Zip):

& "C:\Program Files\7-Zip\7z.exe" x sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17.tar.bz2
& "C:\Program Files\7-Zip\7z.exe" x sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17.tar

model.int8.onnxtokens.txt 放入:

entry/src/main/resources/rawfile/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/

Silero VAD 模型

silero_vad.onnx 已包含在仓库的 rawfile/ 目录中。


编译构建

环境要求

  • DevEco Studio 5.x(推荐最新版)
  • OpenHarmony SDK v12
  • entry/sherpa_onnx.har 文件存在(约 98 MB,含 riscv64 native 库)
  • 模型文件已放置到 rawfile/ 目录

签名配置

使用 DevEco Studio 自动生成签名:

File → Project Structure → Signing Configs → 勾选 "Automatically generate signature"

构建命令

# 在项目根目录执行
node "<DevEco Studio 安装路径>/tools/hvigor/bin/hvigorw.js" \
--mode module -p module=entry@default -p product=default \
-p buildMode=release assembleHap --no-daemon

构建产物

entry/build/default/outputs/default/entry-default-signed.hap

设备部署

1. 设备连接确认

hdc list targets
# 预期输出设备序列号

2. TCM 设备权限(SpaceMiT 平台必须)

hdc shell "chmod 666 /dev/tcm"

3. 安装 HAP

hdc install entry-default-signed.hap
# 预期:install bundle successfully.

4. 启动应用

hdc shell "aa start -b com.k2fsa.sherpa.onnx.vad.asr -a EntryAbility"

5. 验证初始化

# 等待 10-15 秒模型加载,查看日志
hdc shell "hilog -x | grep -iE 'JSAPP.*(init.*done)'"
# 预期输出:
# init vad done
# init non streaming ASR done

功能验证

沙盒文件解码验证

应用支持通过 hdc 推送 WAV 文件到应用沙盒,配合"Decode test file (sandbox)"按钮进行快速验证:

# 1. 推送测试 WAV 文件到应用沙盒(必须 16kHz)
hdc file send test.wav /data/app/el2/100/base/com.k2fsa.sherpa.onnx.vad.asr/haps/entry/files/test.wav

# 2. 启动应用,等待初始化完成

# 3. 点击 "Decode test file (sandbox)" 按钮
hdc shell "uitest uiInput click 960 308"

# 4. 查看识别结果
hdc shell "hilog -x | grep -i 'JSAPP.*partial result'"

TTS ↔ ASR 互验

可使用 TTS 应用生成语音,然后推送给 ASR 识别,验证两个应用端到端正确性:

# TTS 生成后自动保存到沙盒
hdc file recv /data/app/el2/100/base/com.k2fsa.sherpa.onnx.tts/haps/entry/files/tts_output.wav tts_output.wav

# 推送给 ASR
hdc file send tts_output.wav /data/app/el2/100/base/com.k2fsa.sherpa.onnx.vad.asr/haps/entry/files/test.wav

# ASR 解码
hdc shell "uitest uiInput click 960 308"
hdc shell "hilog -x | grep -i 'JSAPP.*partial result'"

验证结果(K3-Pico ITX 实测)

项目结果
模型加载SenseVoice int8 + Silero VAD 初始化成功
英文识别the tribal chieftain called for the boy and presented him with fifty pieces of gold
中英文混合某某银行...Friends fell out often...经济不断增长... ✅
数字/电话2024年12月31号 → 二零二四年十二月三十一号 ✅
VAD 分段正确检测语音段起止时间 ✅
推理性能24 秒音频解码耗时约 4 秒

已知限制

限制说明解决方案
仅支持 16kHz模型要求 16kHz 单声道 WAV转换音频采样率后使用

FAQ

Q: 应用启动后一直显示 "Initializing..."?

模型较大(~239 MB),在 K3 设备上首次加载约需 10-15 秒。查看日志确认:

hdc shell "hilog -x | grep -i 'JSAPP.*init'"

Q: 如何验证文件解码功能?

通过 hdc 推送 16kHz WAV 文件到应用沙盒,然后点击 "Decode test file (sandbox)" 按钮即可触发解码。详见上文「功能验证」章节。

Q: 如何更换 ASR 模型?

修改 NonStreamingAsrWithVadWorker.ets 中模型配置路径,确保新模型也放置在 rawfile/ 对应目录下,采样率匹配 16kHz。

Q: sherpa_onnx.har 从哪里获取?

HAR 包可从 TTS 项目(sherpaonnxtts_spacemit/entry/sherpa_onnx.har)复制,两者使用相同的 HAR 包(含相同 riscv64 native 库)。