更新记录
1.2.0(2026-11-09)
下载此版本
适配 安卓和鸿蒙系统
平台兼容性
uni-app(5.0)
| Vue2 |
Vue2插件版本 |
Vue3 |
Vue3插件版本 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
Android插件版本 |
iOS |
鸿蒙 |
鸿蒙插件版本 |
| √ |
1.2.0 |
√ |
1.2.0 |
- |
- |
- |
- |
5.0 |
1.2.0 |
- |
√ |
1.2.0 |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| - |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
azp-ali-speech
阿里云智能语音交互(NUI SDK)UTS 插件 —— 实时语音识别(SpeechTranscriber)。
- Android:基于 V2.7.4-039-20260909_Android_MIT_TLS(NUI SDK 2.7.4 Android MIT 版,
nuisdk-release.aar 已内置),
原生 AudioRecord 采音 + SDK 流式识别一体。
- HarmonyOS NEXT:基于 V1.5.016.napi.003.010(
neonui.har 已内置,arm64-v8a,API 12+),
系统 AudioCapturer 推流送数(updateAudio)+ SDK 流式识别。
适用于「长按说话 → 松手出文本」的语音输入场景。两端 API、事件序列、错误码完全一致。
能力
- 实时语音识别:句内中间结果(partial)、定句结果(sentenceEnd)、最终累积文本(completed)
- 录音音量回调(0~1 自适应归一化,驱动界面波形)
- 录音权限检查与运行时申请(RECORD_AUDIO)
- token 会话级热更新(支持服务端 token 轮换,无需重新初始化)
- 停止识别后等待服务端补齐最后一句,超时以当前文本兜底
环境要求
- HBuilderX 3.6.8+(UTS 插件需自定义基座运行/打包,标准基座不含本插件;鸿蒙端需 HBuilderX 4.31+)
- Android minSdkVersion 21
- App 已声明
RECORD_AUDIO 权限(本项目 src/manifest.json 已配置)
- NUI SDK 支持 ABI:arm64-v8a / armeabi-v7a / x86_64
- HarmonyOS NEXT:API 12+,仅 arm64-v8a;权限(
ohos.permission.MICROPHONE、ohos.permission.INTERNET)
由插件 module.json5 自动声明,宿主 manifest 无需重复配置
API
| 方法 |
说明 |
onSpeechEvent(listener \| null) |
注册/注销识别事件监听器(全局单例) |
initSpeechSdk(options) |
初始化 SDK(幂等),传入 appkey/token/url |
startTranscribe(options) |
开始一次识别会话(含权限申请、录音、建连) |
stopTranscribe(options) |
停止并等待最终文本(可配超时兜底) |
cancelTranscribe() |
取消当前会话(立即丢弃后续回调) |
releaseSpeechSdk() |
释放 SDK |
getSdkVersion() |
同步获取 NUI SDK 版本号 |
事件(onSpeechEvent)
| type |
触发时机 |
字段说明 |
recording |
录音器开启(SDK AudioState.STATE_OPEN) |
- |
started |
服务端确认任务启动 |
message 为 task_id(鸿蒙端 SDK 无对应事件,该值为空串,建连鉴权失败会随后以 error 事件上报) |
partial |
句内中间结果 |
text = 已定句 + 当前句累积 |
sentenceEnd |
定句(该句最终文本) |
text = 全部已定句文本 |
completed |
识别完成(或停止超时兜底) |
text = 最终累积文本;超时时 message = "stop timeout" |
error |
识别异常中断 |
code = NUI 原生错误码,message = 错误描述 |
volume |
录音音量(约 80ms 节流) |
volume = 0~1 |
错误码(AliSpeechFail.errCode)
| 错误码 |
含义 |
| 9020001 |
SDK 未初始化 |
| 9020002 |
参数无效(appkey/token 为空) |
| 9020003 |
已存在进行中的识别任务 |
| 9020004 |
未获得录音权限 |
| 9020005 |
SDK 调用失败(errMsg 附带详情) |
| 9020006 |
录音器初始化失败 |
使用示例
// #ifdef APP-PLUS
import {
onSpeechEvent, initSpeechSdk, startTranscribe,
stopTranscribe, cancelTranscribe, releaseSpeechSdk,
} from '@/uni_modules/azp-ali-speech'
// #endif
// 1. 注册事件监听(一次即可)
onSpeechEvent((event) => {
switch (event.type) {
case 'recording': /* 开始计时/波形动画 */ break
case 'partial': /* 实时显示 event.text */ break
case 'sentenceEnd': /* 定句文本 */ break
case 'completed': /* 最终文本(停止后) */ break
case 'error': /* event.code / event.message */ break
case 'volume': /* 波形强度 event.volume */ break
}
})
// 2. 初始化(token 由业务后端下发,客户端不内置密钥)
const token = await getAliyunAsrTokenApi()
initSpeechSdk({
appkey: '你的NLS项目appkey',
token,
debug: false,
success: (res) => console.log('SDK版本', res.version),
fail: (err) => console.error(err.errMsg),
})
// 3. 长按开始识别
startTranscribe({
token, // 可选:token 轮换时传入最新值
maxSentenceSilence: 800,
success: (res) => console.log('任务已启动', res.taskId),
fail: (err) => console.error(err.errMsg),
})
// 4. 松手停止,等待最终文本
const res = await new Promise((resolve) => {
stopTranscribe({
timeoutMs: 8000,
success: resolve,
fail: (err) => resolve({ text: '', timeout: true }),
})
})
// res.text 为最终识别文本;res.timeout 为 true 表示超时兜底
// 5. 取消(上滑取消/切后台/来电等场景,立即结束不等待结果)
cancelTranscribe()
// 6. 释放(长时间不用语音时;下次使用需重新 initSpeechSdk)
releaseSpeechSdk()
提示:stopTranscribe 未在识别中时为幂等调用,直接以已有文本成功返回。
实现说明
- 送数模式(Android):回调送数(
audio_update_manually=false),SDK 经 onNuiNeedAudioData 从
AudioRecord 拉取 PCM(16k/16bit/单声道),与官方示例一致,无需自建录音线程
- 送数模式(HarmonyOS NEXT):推流送数(
updateAudio),系统 AudioCapturer(readData 回调)
产出 PCM 推给 SDK;会话开始即预创建录音器,AudioState.STATE_OPEN 后启动,每次会话结束
释放重建(规避 DevEco 低版本 stop 后直接 start 不触发回调的问题)
- 纯云端模式:
service_mode = ModeFullCloud,无需拷贝本地资源与 workspace(SDK ≥ 2.6.2;
鸿蒙端初始化仍需 workspace/debug_path,插件内以应用 filesDir 填入)
- 线程模型(Android):
initialize/setParams/startDialog/stopDialog/cancelDialog/release 统一在
单线程执行器中串行执行,避免阻塞 UI 线程
- 事件线程:NUI 回调(SDK 内部线程)直接派发到 JS 监听器,业务侧无需关心线程
- 音量归一化:NUI RMS 量纲与设备相关,采用峰值跟踪自适应缩放(缓慢衰减),
保证波形在安静/嘈杂环境下均有合理动态范围
目录结构
utssdk/
├── interface.uts # 跨平台 API 类型定义
├── unierror.uts # 错误码与错误对象
├── app-android/
│ ├── index.uts # Android 实现(NUI SDK + AudioRecord)
│ ├── config.json # minSdkVersion 21
│ └── libs/
│ └── nuisdk-release.aar # 阿里云 NUI SDK 2.7.4 (MIT, MinSizeRel 版 19MB)
├── app-ios/index.uts # 占位(调用即失败,待接入 iOS SDK)
└── app-harmony/
├── index.uts # 鸿蒙实现(NUI SDK + AudioCapturer 推流)
├── config.json # 依赖 neonui.har
├── module.json5 # 声明 MICROPHONE / INTERNET 权限
├── resources/ # 权限申请理由字符串
└── libs/
└── neonui.har # 阿里云 NUI SDK 1.5.016 (HarmonyOS NEXT, arm64-v8a)
平台兼容性
| 平台 |
状态 |
| Android(uni-app vue / uni-app x) |
支持 |
| HarmonyOS NEXT(uni-app vue / uni-app x) |
支持(API 12+,arm64-v8a) |
| iOS |
占位(调用返回 9020005) |
| Web / 小程序 |
不适用(请在 APP-PLUS 条件编译中使用) |
参考文档