更新记录
0.0.6(2025-08-29)
- fix: 修复因!==问题导致多返回逗号
- fix: 修复因音频时长比较短而无法识别问题
0.0.5(2025-07-12)
0.0.4(2025-07-10)
查看更多
平台兼容性
uni-app(4.56)
Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
- |
- |
- |
- |
√ |
√ |
5.1 |
√ |
- |
微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
快应用-华为 |
快应用-联盟 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(4.61)
Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
- |
- |
5.1 |
√ |
- |
- |
lime-sherpa-onnx 实时语音识别组件
一个基于Sherpa-onnx的实时语音识别插件,Sherpa-onnx是k2-fsa团队开发的使用ONNX运行时的实时语音识别引擎,支持多种平台和多种语言模型。本插件支持音频文件识别和实时语音识别,适用于需要本地语音转文字功能的应用场景,如语音笔记、语音指令、语音交互等。组件支持Android和iOS平台。
文档链接
📚 组件详细文档请访问以下站点:
安装方法
- 在uni-app插件市场中搜索并导入
lime-sherpa-onnx
- 导入后在页面引入相关方法
- 需要自定义基座才能使用
特性
- 支持多种模型类型:paraformer、transducer、whisper、nemo_ctc、zipformer等
- 支持在线(online)和离线(offline)两种识别模式
- 支持音频文件识别和实时语音识别
- 支持语音活动检测(VAD),提高识别准确性
- 支持自定义模型路径和配置参数
- 提供完整的错误处理机制
代码演示
初始化识别器
首先,需要初始化语音识别器,指定模型路径和相关配置:
import { uesSherpaOnnx, type UesSherpaOnnxOptions, type LimeSherpaOnnxRecognizer } from '@/uni_modules/lime-sherpa-onnx';
// 初始化选项
const options: UesSherpaOnnxOptions = {
model: '/static/models/paraformer.onnx', // 单模型配置
vad: '/static/models/silero_vad.onnx',
tokens: '/static/models/tokens.txt',
modelType: 'paraformer', // 模型类型
mode: 'offline', // 识别模式:offline 或 online
numThreads: 1, // 线程数
sampleRate: 16000, // 采样率
success() {
console.log('初始化成功')
},
fail(err) {
console.log('初始化失败', err)
}
};
// 初始化识别器
let recognizer = uesSherpaOnnx(options);
多组件模型初始化
对于需要多个模型文件的模型类型(如zipformer、transducer等),可以这样初始化:
const recognizer = uesSherpaOnnx({
encoder: '/static/models/encoder.onnx',
decoder: '/static/models/decoder.onnx',
joiner: '/static/models/joiner.onnx',
tokens: '/static/models/tokens.txt',
vad: '/static/models/silero_vad.onnx',
modelType: 'zipformer',
mode: 'online',
enableVad: true,
success() {
console.log('初始化成功')
},
fail(err) {
console.log('初始化失败', err)
}
});
识别音频文件
使用初始化好的识别器识别音频文件:
import { type LimeRecognizeFileOptions } from '@/uni_modules/lime-sherpa-onnx';
// 识别选项
const recognizeOptions: LimeRecognizeFileOptions = {
audioPath: '/static/audio/test.wav',
minDurationForVad: 2.5, // 最小使用VAD的音频时长(秒)
success: (result) => {
console.log('识别结果:', result.text);
console.log('文本片段:', result.segments);
},
fail: (error) => {
console.log('识别失败:', error.errCode);
}
};
// 开始识别
recognizer.recognizeFile(recognizeOptions);
实时语音识别
实时识别语音流,适用于需要即时反馈的场景:
import { type LimeStartRecorderOptions } from '@/uni_modules/lime-sherpa-onnx';
// 监听实时录音结果
recognizer.onRecorder((res) => {
console.log('实时识别结果:', res.text);
console.log('文本片段:', res.segments);
});
// 开始录音
recognizer.startRecorder({
success() {
console.log('开始录音成功')
},
fail(err) {
console.log('开始录音失败', err)
}
});
// 停止录音
recognizer.stopRecorder();
// 取消监听
recognizer.offRecorder();
释放资源
在不再需要识别器时,应该释放资源:
// 释放资源
recognizer.dispose();
完整示例
界面部分
<text>{{txt}}</text>
<button @click="onClick">音频转文本</button>
<button @click="startRecord">开始录制音频</button>
<button @click="stopRecord">停止录制音频</button>
UniappX 示例
import { uesSherpaOnnx, type LimeRecognizeResult, type UesSherpaOnnxOptions, type LimeRecognizeFileOptions } from '@/uni_modules/lime-sherpa-onnx'
// 录制音频可以使用其它能录制wav的插件,官方的API有问题
import { getRecorderManager, type LimeRecorderManagerStartOption } from '@/uni_modules/lime-recorder'
const txt = ref('测试');
const recognizer = uesSherpaOnnx({
model: '/static/sherpa_models/model.int8.onnx',
vad: '/static/sherpa_models/silero_vad.onnx',
tokens: '/static/sherpa_models/tokens.txt',
success() {
console.log('uesSherpaOnnx 初始化成功')
},
fail(err) {
console.log('uesSherpaOnnx 初始化失败', err)
}
});
const onClick = () => {
recognizer.recognizeFile({
audioPath: '/static/ttsmaker-file-2025-7-2-18-42-28.wav',
success(res) {
console.log('识别成功', res)
txt.value = res.text
},
fail(err) {
console.log('识别失败', err)
}
});
}
// 录制音频文件
const recorderManager = getRecorderManager();
recorderManager.onStop((res) => {
recognizer.recognizeFile({
audioPath: res.tempFilePath,
success(res) {
console.log('识别成功', res)
txt.value = res.text
},
fail(err) {
console.log('识别失败', err)
}
});
});
const startRecord = () => {
const options: LimeRecorderManagerStartOption = {
format: 'wav',
numberOfChannels: 1,
}
recorderManager.start(options)
}
const stopRecord = () => {
recorderManager.stop()
}
Uniapp 示例
import { uesSherpaOnnx } from '@/uni_modules/lime-sherpa-onnx'
// 录制音频可以使用其它能录制wav的插件,官方的API有问题
import { getRecorderManager } from '@/uni_modules/lime-recorder'
const recognizer = uesSherpaOnnx({
model: '/static/sherpa_models/model.int8.onnx',
vad: '/static/sherpa_models/silero_vad.onnx',
tokens: '/static/sherpa_models/tokens.txt',
success() {
console.log('uesSherpaOnnx 初始化成功')
},
fail(err) {
console.log('uesSherpaOnnx 初始化失败', err)
}
})
// 录制音频文件
const recorderManager = getRecorderManager()
export default {
data() {
return {
txt: ''
}
},
mounted() {
recorderManager.onStop((res) => {
recognizer.recognizeFile({
audioPath: res.tempFilePath,
success: (res) => {
console.log('识别成功', res)
this.txt = res.text
},
fail(err) {
console.log('识别失败', err)
}
})
})
},
methods: {
onClick() {
recognizer.recognizeFile({
audioPath: '/static/ttsmaker-file-2025-7-2-18-42-28.wav',
success: (res) => {
console.log('识别成功', res)
this.txt = res.text
},
fail(err) {
console.log('识别失败', err)
}
})
},
startRecord() {
const options = {
format: 'wav',
numberOfChannels: 1,
}
recorderManager.start(options)
},
stopRecord() {
recorderManager.stop()
}
}
}
快速预览
导入插件后,可以直接使用以下标签查看演示效果:
<!-- 代码位于 uni_modules/lime-sherpa-onnx/components/lime-sherpa-onnx -->
<lime-sherpa-onnx />
插件标签说明
标签名 |
说明 |
l-sherpa-onnx |
组件标签 |
lime-sherpa-onnx |
演示标签 |
API文档
UesSherpaOnnxOptions 初始化选项
参数 |
说明 |
类型 |
默认值 |
modelPath |
主模型路径(兼容paraformer/nemo_ctc等单模型)(废弃) |
string |
- |
model |
主模型路径(兼容paraformer/nemo_ctc等单模型) |
string |
- |
encoder |
编码器模型路径/文件名 |
string |
- |
decoder |
解码器模型路径/文件名 |
string |
- |
joiner |
joiner模型路径/文件名 |
string |
- |
preprocessor |
Moonshine预处理模型 |
string |
- |
uncachedDecoder |
Moonshine非缓存解码器 |
string |
- |
cachedDecoder |
Moonshine缓存解码器 |
string |
- |
tokens |
tokens文件路径 |
string |
'tokens.txt' |
tokensPath |
tokens文件路径(废弃) |
string |
'tokens.txt' |
vad |
VAD模型路径 |
string |
- |
vadModelPath |
VAD模型路径(废弃) |
string |
- |
provider |
提供者 |
string |
- |
sampleRate |
采样率 |
number |
16000 |
numThreads |
线程数 |
number |
1 |
modelType |
模型类型 |
ModelType |
'paraformer' |
mode |
运行模式 |
'online' | 'offline' |
'offline' |
enableVad |
是否启用VAD |
boolean |
false |
success |
初始化成功回调 |
() => void |
- |
fail |
初始化失败回调 |
(error: LimeSherpaOnnxFail) => void |
- |
支持的模型类型 (ModelType)
模型类型 |
说明 |
paraformer |
Paraformer模型 |
transducer |
Transducer模型 |
whisper |
Whisper模型 |
nemo_ctc |
NeMo CTC模型(IOS 不支持离线) |
telespeech_ctc |
TeleSpeech CTC模型 |
sense_voice |
SenseVoice模型 |
nemo_transducer |
NeMo Transducer模型 |
fire_red_asr |
FireRedASR模型 |
moonshine |
Moonshine模型 |
zipformer |
Zipformer模型 |
zipformer2 |
Zipformer2模型 |
zipformer2_ctc |
Zipformer2 CTC模型 |
lstm |
LSTM模型 |
LimeSherpaOnnxRecognizer 识别器方法
方法名 |
说明 |
参数 |
返回值 |
recognizeFile |
识别音频文件 |
options: LimeRecognizeFileOptions |
- |
onRecorder |
注册录音监听器 |
callback: LimeRecorderCallback |
- |
offRecorder |
取消录音监听器 |
- |
- |
startRecorder |
开始录音并实时识别 |
options: LimeStartRecorderOptions |
- |
stopRecorder |
停止录音 |
- |
- |
dispose |
释放资源 |
- |
- |
LimeRecognizeFileOptions 识别选项
参数 |
说明 |
类型 |
必填 |
audioPath |
音频文件路径 |
string |
是 |
minDurationForVad |
最小使用VAD的音频时长(秒),小于此值时将绕过VAD直接识别 |
number |
否 |
success |
识别成功回调 |
(result: LimeRecognizeResult) => void |
否 |
fail |
识别失败回调 |
(error: LimeSherpaOnnxFail) => void |
否 |
LimeStartRecorderOptions 录音选项
参数 |
说明 |
类型 |
必填 |
success |
开始录音成功回调 |
() => void |
否 |
fail |
开始录音失败回调 |
(error: LimeSherpaOnnxFail) => void |
否 |
LimeRecognizeResult 识别结果
属性 |
说明 |
类型 |
text |
完整识别文本 |
string |
segments |
文本片段数组 |
string[] |
错误处理
插件可能会抛出以下错误:
错误码 |
说明 |
9010001 |
无效音频文件路径 |
9010002 |
无法读取音频文件 |
9010003 |
初始化失败 |
9010004 |
识别失败 |
9010005 |
模型加载失败 |
9010006 |
VAD模型加载失败 |
9010007 |
Paraformer模型加载失败 |
9010008 |
Tokens文件加载失败 |
9010009 |
录音权限被拒绝 |
9010010 |
未注册录音监听器 |
9010011 |
未注册录音监听器 |
常见问题
- 确保模型文件路径正确,且模型文件已正确放置在指定目录
- 音频文件格式必须为WAV格式,且采样率需与模型要求一致(通常为16kHz)
- 实时识别功能在iOS上可能表现不如安卓稳定,建议进行充分测试
- 大型模型可能会占用较多内存,请根据目标设备性能选择适当的模型
- 使用VAD(语音活动检测)可以提高识别准确性,但对于短音频(小于minDurationForVad设置的时长)可能会自动绕过VAD直接识别
- 不同模型类型需要不同的模型文件配置,请参考API文档中的模型类型说明
资源下载
📚 SherpaOnnx官方详细文档和模型请访问以下站点:
支持与赞赏
如果你觉得本插件解决了你的问题,可以考虑支持作者:
支付宝赞助 |
微信赞助 |
 |
 |