Skip to content

LimeSherpaOnnx 实时语音识别组件

一个基于Sherpa-onnx的实时语音识别插件,Sherpa-onnx是k2-fsa团队开发的使用ONNX运行时的实时语音识别引擎,支持多种平台和多种语言模型。本插件支持音频文件识别和实时语音识别,适用于需要本地语音转文字功能的应用场景,如语音笔记、语音指令、语音交互等。组件支持Android和iOS平台。

文档链接

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

安装方法

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

代码演示

初始化识别器

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

typescript
import { UesSherpaOnnx, type UesSherpaOnnxOptions, type LimeSherpaOnnxRecognizer } from '@/uni_modules/lime-sherpa-onnx';

// 初始化选项
const options: UesSherpaOnnxOptions = {
  modelPath: '/static/models/paraformer.onnx',
  vadModelPath: '/static/models/silero_vad.onnx',
  tokensPath: '/static/models/tokens.txt'
};

// 初始化识别器
let recognizer = UesSherpaOnnx(options);

识别音频文件

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

typescript
import { type LimeRecognizeFileOptions } from '@/uni_modules/lime-sherpa-onnx';

// 识别选项
const recognizeOptions: LimeRecognizeFileOptions = {
  audioPath: '/static/audio/test.wav',
  success: (result) => {
    console.log('识别结果:', result.text);
    console.log('文本片段:', result.segments);
  }
};

// 开始识别
recognizer.recognizeFile(recognizeOptions);

实时语音识别

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

typescript
import { uesSherpaOnnx, type LimeStartRecorderOptions } from '@/uni_modules/lime-sherpa-onnx';

const recognizer = uesSherpaOnnx({
  encoder: '/static/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/encoder-epoch-99-avg-1.int8.onnx',
  decoder: '/static/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.onnx',
  joiner: '/static/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/joiner-epoch-99-avg-1.onnx',
  tokensPath: '/static/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/tokens.txt',
  modelType: 'zipformer',
  mode: 'online',
  success() {
    console.log('uesSherpaOnnx 初始化成功')
  },
  fail(err) {
    console.log('uesSherpaOnnx 初始化失败', err)
  }
});

// 监听实时录音结果
recognizer.onRecorder((res) => {
  console.log('实时识别结果', res)
});

// 开始录音
recognizer.startRecorder({
  success(res) {
    console.log('开始录音成功', res)
  },
  fail(err) {
    console.log('开始录音失败', err)
  }
});

// 停止录音
recognizer.stopRecorder();

释放资源

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

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({
  modelPath: '/static/sherpa_models/model.int8.onnx',
  vadModelPath: '/static/sherpa_models/silero_vad.onnx',
  tokensPath: '/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({
  modelPath: '/static/sherpa_models/model.int8.onnx',
  vadModelPath: '/static/sherpa_models/silero_vad.onnx',
  tokensPath: '/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演示标签

详细配置请参考官方文档:Vue Composition API

API文档

UesSherpaOnnxOptions 初始化选项

参数说明类型默认值
modelPath模型文件路径string-
encoderencoder模型文件路径string-
decoderdecoder模型文件路径string-
joinerjoiner模型文件路径string-
vadModelPathVAD模型文件路径string-
tokensPathTokens文件路径string-
modelType模型类型string-
mode识别模式'online' | 'offline''offline'
success初始化成功回调() => void-
fail初始化失败回调(err: any) => void-

LimeSherpaOnnxRecognizer 识别器方法

方法名说明参数返回值
recognizeFile识别音频文件options: LimeRecognizeFileOptions-
startRecorder开始录音并实时识别options: LimeStartRecorderOptions-
stopRecorder停止录音--
onRecorder监听实时识别结果(callback: (result: LimeRecognizeResult) => void) => void-
dispose释放资源--

LimeRecognizeFileOptions 识别选项

参数说明类型必填
audioPath音频文件路径string
success识别成功回调(result: LimeRecognizeResult) => void
fail识别失败回调(err: any) => void

LimeStartRecorderOptions 录音选项

参数说明类型必填
success开始录音成功回调(res: any) => void
fail开始录音失败回调(err: any) => void

LimeRecognizeResult 识别结果

属性说明类型
text完整识别文本string
segments文本片段数组string[]

错误处理

插件可能会抛出以下错误:

错误码错误信息说明
9010001无效音频文件路径提供的音频文件路径无效
9010002无法读取音频文件无法读取指定的音频文件
9010003初始化失败识别器初始化失败
9010004识别失败音频识别过程中出错
9010005模型加载失败无法加载指定的模型文件
9010006VAD模型加载失败无法加载VAD模型文件
9010007Paraformer模型加载失败无法加载Paraformer模型文件
9010008Tokens文件加载失败无法加载Tokens文件

常见问题

  • 确保模型文件路径正确,且模型文件已正确放置在指定目录
  • 音频文件格式必须为WAV格式,且采样率需与模型要求一致
  • 实时识别功能在iOS上可能表现不如安卓稳定,建议进行充分测试
  • 大型模型可能会占用较多内存,请根据目标设备性能选择适当的模型

资源下载

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

支持与赞赏

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

支付宝赞助微信赞助

源代码

组件源码