Skip to content

LimeSherpaOnnx 实时语音识别组件

一个基于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),提高识别准确性
  • 支持自定义模型路径和配置参数
  • 提供完整的错误处理机制

代码演示

初始化识别器

首先,需要初始化语音识别器,指定模型路径和相关配置:

typescript
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等),可以这样初始化:

typescript
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)
  }
});

识别音频文件

使用初始化好的识别器识别音频文件:

typescript
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);

实时语音识别

实时识别语音流,适用于需要即时反馈的场景:

typescript
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();

释放资源

在不再需要识别器时,应该释放资源:

typescript
// 释放资源
recognizer.dispose();

完整示例

界面部分

html
<text>{{txt}}</text>
<button @click="onClick">音频转文本</button>
<button @click="startRecord">开始录制音频</button>
<button @click="stopRecord">停止录制音频</button>

UniappX 示例

js
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 示例

js
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()
    }
  }
}

快速预览

导入插件后,可以直接使用以下标签查看演示效果:

html
<!-- 代码位于 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-
joinerjoiner模型路径/文件名string-
preprocessorMoonshine预处理模型string-
uncachedDecoderMoonshine非缓存解码器string-
cachedDecoderMoonshine缓存解码器string-
tokenstokens文件路径string'tokens.txt'
tokensPathtokens文件路径(废弃)string'tokens.txt'
vadVAD模型路径string-
vadModelPathVAD模型路径(废弃)string-
provider提供者string-
sampleRate采样率number16000
numThreads线程数number1
modelType模型类型ModelType'paraformer'
mode运行模式'online' | 'offline''offline'
enableVad是否启用VADbooleanfalse
success初始化成功回调() => void-
fail初始化失败回调(error: LimeSherpaOnnxFail) => void-

支持的模型类型 (ModelType)

模型类型说明
paraformerParaformer模型
transducerTransducer模型
whisperWhisper模型
nemo_ctcNeMo CTC模型(IOS 不支持离线)
telespeech_ctcTeleSpeech CTC模型
sense_voiceSenseVoice模型
nemo_transducerNeMo Transducer模型
fire_red_asrFireRedASR模型
moonshineMoonshine模型
zipformerZipformer模型
zipformer2Zipformer2模型
zipformer2_ctcZipformer2 CTC模型
lstmLSTM模型

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模型加载失败
9010006VAD模型加载失败
9010007Paraformer模型加载失败
9010008Tokens文件加载失败
9010009录音权限被拒绝
9010010未注册录音监听器
9010011未注册录音监听器

常见问题

  • 确保模型文件路径正确,且模型文件已正确放置在指定目录
  • 音频文件格式必须为WAV格式,且采样率需与模型要求一致(通常为16kHz)
  • 实时识别功能在iOS上可能表现不如安卓稳定,建议进行充分测试
  • 大型模型可能会占用较多内存,请根据目标设备性能选择适当的模型
  • 使用VAD(语音活动检测)可以提高识别准确性,但对于短音频(小于minDurationForVad设置的时长)可能会自动绕过VAD直接识别
  • 不同模型类型需要不同的模型文件配置,请参考API文档中的模型类型说明

资源下载

📚 SherpaOnnx官方详细文档和模型请访问以下站点:

支持与赞赏

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

支付宝赞助微信赞助

源代码

组件源码