更新记录
1.2.5(2026-02-07)
- 增加是否移除字符间空格配置字段isRemoveSpaces
- 增加销毁方法
1.2.4(2026-01-31)
- 针对唤醒词使用场景,新增热词设置,可参考示例
1.2.3(2026-01-24)
- 移除iOS端的Frameworks本地依赖,改用从远程仓库获取,减少插件体积
调整说明:之前已存在本地目录Framework的可以更新插件后删除
平台兼容性
uni-app(4.66)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-vue插件版本 | app-nvue | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.1 | √ | 1.0.1 | - | - | √ | 1.0.1 | - | 5.0 | 1.0.1 | 12 | 1.2.0 | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(4.66)
| Chrome | Safari | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|---|---|
| - | - | 5.0 | 1.0.0 | 12 | 1.2.0 | - | - |
xwq-speech-to-text
-
基于VOSK封装的语音识别功能,支持安卓和IOS
注意!试用需要先将插件导入项目并且页面加入引用代码再打自定义基座
注意!插件不包含模型文件,需要自行下载,因为模型文件比较大,加入无法云打包,可以打完基座后把模型拷贝到static目录下
模型下载地址
使用步骤
-
第一步:使用VOSK
import {downloadModel,initVoskModel,startSpeechVoice,stopSpeechVoice} from '@/uni_modules/xwq-speech-to-text'; import { CallbackType, RedultType } from '@/uni_modules/xwq-speech-to-text/utssdk/interface.uts'; -
第二步:初始化模型
/** * 初始化模型 * 将返回的模型地址缓存起来,在第二次用到的时候直接传入初始化,避免重复解压 */ const init = () => { let path = '/static/vosk-model-small-cn-0.22.zip'; initVoskModel({ zipModelPath: path, outputAllContent:true, //是否输出全部内容片段(即包含前面内容),默认false,只输出当前片段内容 hotwords:[ "小度小度", "小艺小艺", "嘿小白", "关闭窗帘", "打开灯", "关闭灯", "温度调高", "温度调低" ] //针对用于唤醒词场景设置的热词,注意:如果匹配不到会输出"[unk]" }, (result : CallbackType) => { console.log('模型地址====', result.data) modelPath.value = result.data.modelPath; }) }; -
第三步:开始语音识别
/** * 开始语音识别 */ const start = () => { startSpeechVoice((res : RedultType) => { console.log('识别结果===', res.data.text) content.value += res.data.text }) }; -
停止语音识别
/** * 停止语音识别 */ const stop = () => { stopSpeechVoice() }; -
如果已经解压过模型,存在解压路径时初始化
/** * 存在模型解压路径(即已经初始化过一次) */ initVoskModel({ modelPath: modelPath.value, zipModelPath: '', outputAllContent:true, //是否输出全部内容片段(即包含前面内容),默认false,只输出当前片段内容 hotwords:[ "小度小度", "小艺小艺", "嘿小白", "关闭窗帘", "打开灯", "关闭灯", "温度调高", "温度调低" ] //针对用于唤醒词场景设置的热词,注意:如果匹配不到会输出"[unk]" }, (result : CallbackType) => { console.log('模型地址====', result.data) }) -
在线下载模型
const downModel = () => { const url = 'https://example.com/vosk-model-small-cn-0.22.zip';//需要换成真实的模型下载地址 downloadModel(url, (res) => { console.log(res) if (res.code == 0 && res.filePath != '') { initVoskModel({ zipModelPath: res.filePath, outputAllContent:true, //是否输出全部内容片段(即包含前面内容),默认false,只输出当前片段内容 hotwords:[ "小度小度", "小艺小艺", "嘿小白", "关闭窗帘", "打开灯", "关闭灯", "温度调高", "温度调低" ] //针对用于唤醒词场景设置的热词,注意:如果匹配不到会输出"[unk]" }, (result : CallbackType) => { console.log('模型地址====', result.data) modelPath.value = result.data.modelPath; }) } }) };
初始化参数说明
| 属性 | 类型 | 默认值 | 必填 | 描述 |
|---|---|---|---|---|
| modelPath | string | - | N | 模型解压后的地址,当已存在该路径时使用,即已解压过模型 |
| zipModelPath | string | - | N | 模型地址,例如/static/vosk-model-small-cn-0.22.zip |
| outputAllContent | boolean | - | N | 是否输出全部内容,包含之前的语音内容,默认输出片段内容 |
| hotwords | string | - | N | joiner模型路径,多模型的情况使用,例如:transducer模型 |
| isRemoveSpaces | string | - | N | 是否移除字符之间的空格,默认移除 ,英文模型可以设置为false |
使用完整示例(UniappX)
<template>
<view>
<view class="area">
<button type="default" @click="downModel">在线下载vosk模型</button>
<button type="default" @click="init">初始化vosk模型</button>
<button type="default" @click="start">开始语音识别</button>
<button type="default" @click="destroy">销毁实例</button>
<button type="default" @click="unzipInnit">存在模型解压地址初始化</button>
</view>
<view>
<view class="title">
<text>识别结果:</text>
</view>
<view class="content">
<textarea :value="content" disabled style="width: 100%;padding: 15px;"></textarea>
</view>
</view>
</view>
</template>
<script setup>
import {downloadModel,initVoskModel,startSpeechVoice,stopSpeechVoice,destroyVosk} from '@/uni_modules/xwq-speech-to-text';
import { CallbackType, RedultType } from '@/uni_modules/xwq-speech-to-text/utssdk/interface.uts';
const modelPath = ref('');//储存模型解压地址
const content = ref('');//识别结果
/**
* 在线下载模型
*/
const downModel = () => {
const url = 'https://example.com/vosk-model-small-cn-0.22.zip'
downloadModel(url, (res) => {
console.log(res)
if (res.code == 0 && res.filePath != '') {
initVoskModel({
zipModelPath: res.filePath,
outputAllContent:true, //是否输出全部内容片段(即包含前面内容),默认false,只输出当前片段内容
hotwords:[
"小度小度", "小艺小艺", "嘿小白", "关闭窗帘",
"打开灯", "关闭灯", "温度调高", "温度调低"
] //针对用于唤醒词场景设置的热词,注意:如果匹配不到会输出"[unk]"
}, (result : CallbackType) => {
console.log('模型地址====', result.data)
modelPath.value = result.data.modelPath;
})
}
})
};
/**
* 初始化模型
* 将返回的模型地址缓存起来,在第二次用到的时候直接传入初始化,避免重复解压
*/
const init = () => {
let path = '/static/vosk-model-small-cn-0.22.zip';
initVoskModel({
zipModelPath: path,
outputAllContent:true, //是否输出全部内容片段(即包含前面内容),默认false,只输出当前片段内容
hotwords:[
"小度小度", "小艺小艺", "嘿小白", "关闭窗帘",
"打开灯", "关闭灯", "温度调高", "温度调低"
] //针对用于唤醒词场景设置的热词,注意:如果匹配不到会输出"[unk]"
}, (result : CallbackType) => {
console.log('模型地址====', result.data)
modelPath.value = result.data.modelPath;
})
};
/**
* 存在模型解压路径(即已经初始化过一次)
*/
const unzipInnit = () => {
initVoskModel({
modelPath: modelPath.value,
zipModelPath: '',
outputAllContent:true, //是否输出全部内容片段(即包含前面内容),默认false,只输出当前片段内容
hotwords:[
"小度小度", "小艺小艺", "嘿小白", "关闭窗帘",
"打开灯", "关闭灯", "温度调高", "温度调低"
] //针对用于唤醒词场景设置的热词,注意:如果匹配不到会输出"[unk]"
}, (result : CallbackType) => {
console.log('模型地址====', result.data)
})
};
/**
* 开始语音识别
*/
const start = () => {
startSpeechVoice((res : RedultType) => {
console.log('识别结果===', res.data.text)
content.value += res.data.text
})
};
/**
* 停止语音识别
*/
const stop = () => {
stopSpeechVoice()
};
/**
* 销毁实例
*/
const destroy=()=>{
destroyVosk()
}
</script>
<style>
.title {
margin: 20px 0 10px 0;
}
.content {
width: 100%;
height: 100%;
border: 1px solid #ccc;
background-color: #f2f2f2;
}
</style>
使用完整示例(Uniapp)
<template>
<view>
<view class="area">
<button type="default" @click="downModel">在线下载vosk模型</button>
<button type="default" @click="init">初始化vosk模型</button>
<button type="default" @click="start">开始语音识别</button>
<button type="default" @click="stop">结束语音识别</button>
<button type="default" @click="unzipInnit">存在模型解压地址初始化</button>
</view>
<view>
<view class="title">
<text>识别结果:</text>
</view>
<view class="content">
<textarea :value="content" disabled style="width: 100%;padding: 15px;"></textarea>
</view>
</view>
</view>
</template>
<script setup lang="ts">
import {downloadModel,initVoskModel,startSpeechVoice,stopSpeechVoice,destroyVosk} from '@/uni_modules/xwq-speech-to-text';
import { CallbackType, RedultType } from '@/uni_modules/xwq-speech-to-text/utssdk/interface.uts';
const modelPath = ref('');//储存模型解压地址
const content = ref('');//识别结果
/**
* 在线下载模型
*/
const downModel = () => {
const url = 'https://example.com/vosk-model-small-cn-0.22.zip';//需要换成真实的模型下载地址
downloadModel(url, (res) => {
console.log(res)
if (res.code == 0 && res.filePath != '') {
initVoskModel({
zipModelPath: res.filePath,
outputAllContent:true, //是否输出全部内容片段(即包含前面内容),默认false,只输出当前片段内容
hotwords:[
"小度小度", "小艺小艺", "嘿小白", "关闭窗帘",
"打开灯", "关闭灯", "温度调高", "温度调低"
] //针对用于唤醒词场景设置的热词,注意:如果匹配不到会输出"[unk]"
}, (result) => {
console.log('模型地址====', result.data)
modelPath.value = result.data.modelPath;
})
}
})
};
/**
* 初始化模型
* 将返回的模型地址缓存起来,在第二次用到的时候直接传入初始化,避免重复解压
*/
const init = () => {
let path = '/static/vosk-model-small-cn-0.22.zip';
const staticPath = plus.io.convertLocalFileSystemURL(path);
initVoskModel({
zipModelPath: staticPath,
outputAllContent:true, //是否输出全部内容片段(即包含前面内容),默认false,只输出当前片段内容
hotwords:[
"小度小度", "小艺小艺", "嘿小白", "关闭窗帘",
"打开灯", "关闭灯", "温度调高", "温度调低"
] //针对用于唤醒词场景设置的热词,注意:如果匹配不到会输出"[unk]"
}, (result) => {
console.log('模型地址====', result.data)
modelPath.value = result.data.modelPath;
})
};
/**
* 存在模型解压路径(即已经初始化过一次)
*/
const unzipInnit = () => {
initVoskModel({
modelPath: modelPath.value,
zipModelPath: '',
outputAllContent:true, //是否输出全部内容片段(即包含前面内容),默认false,只输出当前片段内容
hotwords:[
"小度小度", "小艺小艺", "嘿小白", "关闭窗帘",
"打开灯", "关闭灯", "温度调高", "温度调低"
] //针对用于唤醒词场景设置的热词,注意:如果匹配不到会输出"[unk]"
}, (result) => {
console.log('模型地址====', result.data)
})
};
/**
* 开始语音识别
*/
const start = () => {
startSpeechVoice((res) => {
console.log('识别结果===', res.data.text)
content.value += res.data.text
})
};
/**
* 停止语音识别
*/
const stop = () => {
stopSpeechVoice()
};
/**
* 销毁实例
*/
const destroy=()=>{
destroyVosk()
}
</script>
<style>
.title {
margin: 20px 0 10px 0;
}
.content {
width: 100%;
height: 100%;
border: 1px solid #ccc;
background-color: #f2f2f2;
}
</style>

收藏人数:
购买源码授权版(
试用
赞赏(3)
下载 924
赞赏 5
下载 11237282
赞赏 1860
赞赏
京公网安备:11010802035340号