更新记录

1.0.4(2025-07-21)

细节优化

1.0.3(2025-07-09)

移除无用的类型

1.0.2(2025-07-09)

修复部分编译错误的问题

查看更多

平台兼容性

云端兼容性

阿里云 腾讯云 支付宝云

uni-app(4.66)

Vue2 Vue2插件版本 Vue3 Vue2插件版本 Chrome Safari app-vue app-vue插件版本 app-nvue Android Android插件版本 iOS 鸿蒙
1.0.1 1.0.1 - - 1.0.1 - 5.0 1.0.1 - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - -

uni-app x(4.66)

Chrome Safari Android Android插件版本 iOS 鸿蒙 微信小程序
- - 5.0 1.0.0 - - -

xwq-speech-to-text

  • 安卓端封装VOSK模型语音识别功能

注意!试用需要先将插件导入项目并且页面加入引用代码再打自定义基座

注意!插件不包含模型文件,需要自行下载,因为模型文件比较大,加入无法云打包,可以打完基座后把模型拷贝到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
        }, (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: ''
    }, (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
                }, (result : CallbackType) => {
                    console.log('模型地址====', result.data)
                    modelPath.value = result.data.modelPath;
                })
            }
        })
    };

使用完整示例(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="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>
    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 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
                }, (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
        }, (result : CallbackType) => {
            console.log('模型地址====', result.data)
            modelPath.value = result.data.modelPath;
        })
    };

    /**
     * 存在模型解压路径(即已经初始化过一次)
     */
    const unzipInnit = () => {
        initVoskModel({
            modelPath: modelPath.value,
            zipModelPath: ''
        }, (result : CallbackType) => {
            console.log('模型地址====', result.data)
        })
    };
    /**
     * 开始语音识别
     */
    const start = () => {
        startSpeechVoice((res : RedultType) => {
            console.log('识别结果===', res.data.text)
            content.value += res.data.text
        })
    };

    /**
     * 停止语音识别
     */
    const stop = () => {
        stopSpeechVoice()
    };
</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} 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
                    }, (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
            }, (result) => {
                console.log('模型地址====', result.data)
                modelPath.value = result.data.modelPath;
            })
        };

        /**
         * 存在模型解压路径(即已经初始化过一次)
         */
        const unzipInnit = () => {
            initVoskModel({
                modelPath: modelPath.value,
                zipModelPath: ''
            }, (result) => {
                console.log('模型地址====', result.data)
            })
        };
        /**
         * 开始语音识别
         */
        const start = () => {
            startSpeechVoice((res) => {
                console.log('识别结果===', res.data.text)
                content.value += res.data.text
            })
        };

        /**
         * 停止语音识别
         */
        const stop = () => {
            stopSpeechVoice()
        };
</script>

<style>
    .title {
        margin: 20px 0 10px 0;
    }

    .content {
        width: 100%;
        height: 100%;
        border: 1px solid #ccc;
        background-color: #f2f2f2;
    }
</style>

隐私、权限声明

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

<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"></uses-permission>

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

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