uniapp集成语音唤醒功能

内容分享1周前发布
1 0 0

uniapp应用集成语音唤醒功能
可以使用科大讯飞语音唤醒来实现

一、注册讯飞开放平台

1.访问科大讯飞开放平台,注册账号并创建应用,获取 AppID、APIKey、APISecret
2.开通 语音唤醒(新版) 功能,申请免费测试装机量(默认 10 台设备)
3.下载 SDK 资源
从讯飞平台下载 语音唤醒 SDK(Android 版),包含 .aar 库文件和资源文件夹(如 assets/ivw 下的唤醒词配置文件)
4.下载的包重命名为AIKit_AEE_Android

二、创建uni-app原生插件目录结构

1.创建目录

在src同级创建nativepluginsIflytekVoiceWakeup文件夹
在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配置
    最终目录结构

    uniapp集成语音唤醒功能

三、配置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": {}
        }
      }
}

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...