uniapp应用集成语音唤醒功能
可以使用科大讯飞语音唤醒来实现
一、注册讯飞开放平台
1.访问科大讯飞开放平台,注册账号并创建应用,获取 AppID、APIKey、APISecret
2.开通 语音唤醒(新版) 功能,申请免费测试装机量(默认 10 台设备)
3.下载 SDK 资源
从讯飞平台下载 语音唤醒 SDK(Android 版),包含 .aar 库文件和资源文件夹(如 assets/ivw 下的唤醒词配置文件)
4.下载的包重命名为AIKit_AEE_Android
二、创建uni-app原生插件目录结构
1.创建目录
在src同级创建nativeplugins\IflytekVoiceWakeup文件夹
在IflytekVoiceWakeup文件夹下分别创建\android文件夹和package.json
2.在android文件夹下创建AndroidManifest.xml(权限声明)
- 权限声明:申请录音、网络访问、存储读写等7项系统权限
- 应用配置:设置应用包名和科大讯飞语音唤醒SDK的appid元数据
- 基础设置:指定XML版本和UTF-8编码格式
<?xml version="1.0" encoding="utf-8"?>
<!--
manifest 是Android清单文件的根元素
xmlns:android 定义Android命名空间,这是必须的
package 指定应用程序的包名 com.iflytek.voicedemo,这是应用的唯一标识符
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.iflytekvoicewakeup">
<!-- 允许应用录制音频 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 允许应用访问网络 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 允许应用访问网络连接状态信息 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允许应用访问Wi-Fi网络状态信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 允许应用改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 允许应用访问设备电话状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 允许应用写入外部存储 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application>
<meta-data
android:name="com.iflytek.appid"
android:value="dd27c773" />
</application>
</manifest>
3.在android文件夹下创建build.gradle(插件配置)
apply plugin: 'com.android.library'
android {
compileSdkVersion 30//指定编译时使用的SDK版本为Android 11 (API 30)
buildToolsVersion "30.0.3"//使用的构建工具版本
defaultConfig {
minSdkVersion 21// 应用支持的最低Android版本(Android 5.0)
targetSdkVersion 30//应用目标运行的Android版本
versionCode 1// 应用的内部版本号
versionName "1.0"//应用的外部版本名
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])//包含libs目录下所有jar和aar文件作为依赖
implementation 'com.android.support:appcompat-v7:28.0.0'//添加Android Support库的appcompat-v7组件
}
4.在android文件夹下创建IflytekVoiceWakeupModule.java
基于讯飞语音唤醒SDK的UniApp原生模块,实现语音唤醒功能
- 初始化:通过init方法传入AppID初始化讯飞语音工具。
- 开始监听:
startListening
设置唤醒词参数并启动监听。 - 停止监听:
stopListening
停止语音监听。 - 回调处理:通过
WakeuperListener
监听唤醒结果和错误,并将结果通过事件发射器传递给前端。
package com.example.iflytekvoicewakeup;
import android.content.Context;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.VoiceWakeuper;
import com.iflytek.cloud.WakeuperListener;
import com.iflytek.cloud.WakeuperResult;
import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.common.UniModule;
public class IflytekVoiceWakeupModule extends UniModule {
private VoiceWakeuper mIvw;
private static final String TAG = "IflytekVoiceWakeup";
@UniJSMethod(uiThread = true)
public void init(String appId) {
// 初始化讯飞语音唤醒
// 使用传入的 appid 初始化讯飞语音服务
// 通过 SpeechUtility.createUtility() 创建语音工具实例
SpeechUtility.createUtility(mUniSDKInstance.getContext(), "appid=" + appId);
mIvw = VoiceWakeuper.createWakeuper(mUniSDKInstance.getContext(), null);
}
@UniJSMethod(uiThread = true)
public void startListening(String wakeupWord) {
// 开始监听唤醒词
if (mIvw != null) {
// 设置唤醒词资源路径
mIvw.setParameter("ivw_net_res_path", "assets://ivw/IVW_GRAM_1");
mIvw.setParameter("ivw_res_path", "assets://ivw/IVW_GRAM_1");
mIvw.setParameter("ivw_threshold", "0:1450");
mIvw.setParameter("ivw_sst", "wakeup");
//mIvw.setParameter("ivw_word", "小朋小朋"); // 设置自定义唤醒词
mIvw.startListening(wakeuperListener);// 启动监听
}
}
// public void startListening(String resourcePath, String[] keywords) {
// // 构建唤醒词参数
// StringBuffer buffer = new StringBuffer();
// for (String keyword : keywords) {
// buffer.append(keyword).append(";");
// }
// // 设置唤醒参数
// this.mIvw.setParameter(SpeechConstant.IVW_RES_PATH, resourcePath); // 唤醒资源路径
// this.mIvw.setParameter(SpeechConstant.IVW_THRESHOLD, "0:" + buffer.toString()); // 唤醒词阈值
// this.mIvw.setParameter(SpeechConstant.IVW_SST, "wakeup"); // 唤醒模式
// this.mIvw.startListening(mWakeuperListener); // 启动监听
// }
@UniJSMethod(uiThread = true)
public void stopListening() {
// 停止监听
if (mIvw != null) {
mIvw.stopListening();
}
}
private WakeuperListener wakeuperListener = new WakeuperListener() {
@Override
public void onResult(WakeuperResult result) {
// 唤醒结果回调
mUniSDKInstance.getModuleEventEmitter().emit("onWakeupResult", result.getResultString());
}
@Override
public void onError(int errorCode) {
// 错误回调
mUniSDKInstance.getModuleEventEmitter().emit("onWakeupError", errorCode);
}
@Override
public void onBeginOfSpeech() {
// 开始说话回调
}
@Override
public void onEvent(int eventType, int isLast, int arg2, String msg) {
// 其他事件回调
}
};
}
5.package.json
{
"name": "IflytekVoiceWakeup",
"id": "IflytekVoiceWakeup",
"version": "1.0.0",
"description": "科大讯飞语音唤醒插件",
"_dp_type": "nativeplugin",
"_dp_nativeplugin": {
"android": {
"plugins": [
{
"type": "module",
"name": "IflytekVoiceWakeup",
"class": "com.example.iflytekvoicewakeup.IflytekVoiceWakeupModule"
}
],
"integrateType": "aar",
"minSdkVersion": 21
}
}
}
6.在android文件夹下创建libs文件夹
从SDK目录结构中查看文件:
- app/libs/AIKit.aar - 核心SDK文件
- resource/ivw/ 目录下的唤醒词资源文件
接下来需要: - 将AIKit.aar复制到插件libs目录
- 创建文件夹复制唤醒词资源文件
-
更新build.gradle配置
最终目录结构
image.png
三、配置uni-app调用接口
创建示例页面演示如何使用该插件
<template>
<view class="container">
<button @click="initVoiceWakeup">初始化语音唤醒</button>
<button @click="startListening">开始监听</button>
<button @click="stopListening">停止监听</button>
<text>状态: {{status}}</text>
</view>
</template>
<script>
export default {
data() {
return {
status: '未初始化'
}
},
methods: {
initVoiceWakeup() {
const voiceWakeup = uni.requireNativePlugin('IflytekVoiceWakeup')
voiceWakeup.init('dd27c773')
this.status = '初始化完成'
},
startListening() {
const voiceWakeup = uni.requireNativePlugin('IflytekVoiceWakeup')
voiceWakeup.startListening('')
this.status = '监听中...'
// 监听唤醒结果
voiceWakeup.addListener('onWakeupResult', (res) => {
this.status = '唤醒成功: ' + res
})
// 监听错误
voiceWakeup.addListener('onWakeupError', (err) => {
this.status = '错误: ' + err
})
},
stopListening() {
const voiceWakeup = uni.requireNativePlugin('IflytekVoiceWakeup')
voiceWakeup.stopListening()
this.status = '已停止'
}
}
}
</script>
<style>
.container {
padding: 20px;
}
button {
margin: 10px 0;
padding: 10px;
}
</style>
四、uniapp项目配置
将IflytekVoiceWakeup原生插件配置到manifest.json中,以便在自定义基座中包含该插件。
- 打开manifest.json文件
- 在nativePlugins节点下添加插件配置
- 保存后制作自定义基座调试
"nativePlugins":{
"IflytekVoiceWakeup": {
"__plugin_info__": {
"name": "科大讯飞语音唤醒插件",
"description": "集成科大讯飞语音唤醒功能的原生插件",
"platforms": "Android",
"android_package_name": "com.example.iflytekvoicewakeup",
"parameters": {}
}
}
}