uniapp集成语音唤醒功能

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": {}
        }
      }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容