更新记录

0.0.6(2025-08-29)

  • fix: 修复因!==问题导致多返回逗号
  • fix: 修复因音频时长比较短而无法识别问题

0.0.5(2025-07-12)

  • chore: 更新文档

0.0.4(2025-07-10)

  • feat: 增加在线模式,用于实时识别
查看更多

平台兼容性

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平台。

文档链接

📚 组件详细文档请访问以下站点:

安装方法

  1. 在uni-app插件市场中搜索并导入lime-sherpa-onnx
  2. 导入后在页面引入相关方法
  3. 需要自定义基座才能使用

特性

  • 支持多种模型类型: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官方详细文档和模型请访问以下站点:

支持与赞赏

如果你觉得本插件解决了你的问题,可以考虑支持作者:

支付宝赞助 微信赞助

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: