Unity接入 百度语音识别 SDK

2023-05-16

接入百度语音识别

  • 跟之前文章写过的接入讯飞语音识别一样,都要去官网下载对应的SDK

  • 所以我们去官网下载SDK,大家都是聪明人

百度语音SDK获取网址

  • 怎样获取SDK部分就不做过多介绍了,进入官网按照介绍

  • 注册登录获取语音识别的SDK就好了,然后创建一个应用这样应用就创建成功了,这里要记住APPID,后面会用到!找到SDK下载一个语音识别的SDK

那接下来就是获取到语音识别SDK后的部分了!


🍓Android Studio端操作步骤

1.工程开始

老规矩,新建项目,修改名字和路径,准备开始!

然后新建一个module,起一个名字 File-new-new Module(下图)

在这里插入图片描述


2.接入Unity的classes.jar包

  • 把Unity的class接入,路径在安装Unity客户端的路径下

  • Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

  • 把Unity的jar包复制到AS的libs目录下,如下图:


3.接入讯飞语音的classess.jar包

  • 同样的方法,将百度语音的jar包也放进去

  • ar包位置就在我们在官网下载的SDK解压后的core->libs路径下

  • 直接也复制到AS的libs目录下就行!效果如下:


4.关联两个classes.jar包

  • 选中两个jar包,右键Add As Libray…

  • 等待编译完就好了

  • 也可以右键iflytevoice,Open Module Settings

  • 将.jar文件手动添加,添加完了记得点apply应用一下如果点击后这里显示已经有了这两个jar包,那说明就关联好了


5.添加libmsc.so

还是在我们下载的SDK目录下找到这个文件夹jniLibs

  • 然后把这个文件夹直接复制到AS的src->main目录下

如下图所示:


6.写SDK的接口

好了,到这一步才是写代码的阶段,前边做的几个步骤都是为了为最后的操作搭建一个"台子"

  • 我们接下来新建四个类,分别是CientBaiDuVoiceMainActivity、RecognHandler、RecognListener和GetActivity

  • 怎样新建就不说了,我这里还新建了两个文件夹Recogn和Util为了区分脚本类别,照着我这个做就行

直接看一下最终效果:然后直接上各个脚本的代码,直接放进去就行「CientBaiDuVoiceMainActivity:」

package com.example.baidu;


import android.content.Context;
import android.os.Bundle;
import android.util.Log;

import com.example.baidu.Recogn.RecognHandler;
import com.example.baidu.Recogn.RecognListener;
import com.unity3d.player.UnityPlayerActivity;

public class CientBaiDuVoiceMainActivity   {

    public static CientBaiDuVoiceMainActivity _instance;

    public static CientBaiDuVoiceMainActivity getInstance() {
        if (_instance == null) {
            _instance = new CientBaiDuVoiceMainActivity();
        }
        return _instance;
    }
    //语音识别
    RecognHandler mRecognHandler;

    //语音识别初始化
    public void InitRecogn(Context context) {
        Log.i("@@@", "安卓端开始初始化语音识别了 ");
        RecognListener listener=new RecognListener();
        mRecognHandler=new RecognHandler(context,listener);
    }
    //开始语音识别
    public void StartRecogn() {
        mRecognHandler.Start();
    }
    //停止语音识别
    public void StopRecogn() {
        mRecognHandler.Stop();
    }
    //释放语音识别实例
    public void ReleaseRecogn() {
        mRecognHandler.Release();
        mRecognHandler=null;
    }


}

 

「RecognHandler:」

package com.example.baidu.Recogn;//自己的包名

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;

import com.baidu.speech.EventListener;
import com.baidu.speech.EventManager;
import com.baidu.speech.EventManagerFactory;
import com.baidu.speech.asr.SpeechConstant;

import org.json.JSONObject;

import java.util.LinkedHashMap;
import java.util.Map;
import static com.example.baidu.Util.GetActivity.getActivityByContext;

public class RecognHandler {

    private boolean mIsInit = false;
    private EventManager asr;
    private EventListener mEventLisener;

    public RecognHandler(Context context, EventListener listener) {
        if (mIsInit) {
            listener=null;
            return;
        }
        mIsInit = true;
        mEventLisener = listener;
        //动态申请权限
        initPermission(context);
        asr = EventManagerFactory.create(context, "asr");
        asr.registerListener(listener);
    }
    //开始识别
    public void Start() {
        Log.i("@@@", "点击开始语音识别了 ");
        Map<String, Object> params = new LinkedHashMap<String, Object>();
        // 基于SDK集成2.1 设置识别参数
        params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, true);
        params.put(SpeechConstant.DISABLE_PUNCTUATION, false);
        params.put(SpeechConstant.ACCEPT_AUDIO_DATA, false);
        params.put(SpeechConstant.PID, 1537); // 中文输入法模型,有逗号
        String json = null; // 可以替换成自己的json
        json = new JSONObject(params).toString(); // 这里可以替换成你需要测试的json
        asr.send(SpeechConstant.ASR_START, json, null, 0, 0);
    }
    //停止识别
    public void Stop() {
        asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0);
    }
    //释放实例
    public void Release() {
        asr.unregisterListener(mEventLisener);
        mIsInit = false;
        asr=null;
    }

    /**
     * android 6.0 以上需要动态申请权限
     */
    private void initPermission(Context context) {
        String permissions[] = {Manifest.permission.RECORD_AUDIO,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.INTERNET,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };

        PackageManager pm = getActivityByContext(context).getPackageManager();
        boolean permission_readStorage = (PackageManager.PERMISSION_GRANTED ==
                pm.checkPermission("android.permission.RECORD_AUDIO", "com.cientx.tianguo"));
        boolean permission_network_state = (PackageManager.PERMISSION_GRANTED ==
                pm.checkPermission("android.permission.ACCESS_NETWORK_STATE", "com.cientx.tianguo"));
        boolean permission_internet = (PackageManager.PERMISSION_GRANTED ==
                pm.checkPermission("android.permission.INTERNET", "com.cientx.tianguo"));
        boolean permission_writeStorage = (PackageManager.PERMISSION_GRANTED ==
                pm.checkPermission("android.permission.WRITE_EXTERNAL_STORAGE", "com.cientx.tianguo"));

        if (!(permission_readStorage && permission_writeStorage && permission_network_state && permission_internet)) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                getActivityByContext(context).requestPermissions(permissions, 0x01);
            }
        }

    }

}

「RecognListener:」

package com.example.baidu.Recogn;//填写自己的包名

import android.util.Log;

import com.baidu.speech.EventListener;
import com.baidu.speech.asr.SpeechConstant;
import com.unity3d.player.UnityPlayer;

public class RecognListener implements EventListener {


    @Override
    public void onEvent(String name, String params, byte[] data, int i, int i1) {
        if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)) {
            Log.i("@@@", "进入开始语音识别的方法了 ");
            // 识别相关的结果都在这里
            if (params == null || params.isEmpty()) {
                return;
            }
            if (params.contains("\"partial_result\"")) {
                UnityPlayer.UnitySendMessage("NetLogic", "RecognResult", name + "&" + params);
                // 一句话的临时识别结果
            } else if (params.contains("\"final_result\"")) {
                UnityPlayer.UnitySendMessage("NetLogic", "RecognResult", name + "&" + params);
                // 一句话的最终识别结果
            } else {
                // 一般这里不会运行
                if (data != null) {
                }
            }
        } else {
            // 识别开始,结束,音量,音频数据回调
            if (params != null && !params.isEmpty()) {
            }
            if (data != null) {
            }
        }
    }
};


 

「GetActivity:」

package com.example.baidu.Util;//自己的包名

        import android.app.Activity;
        import android.content.Context;
        import android.content.ContextWrapper;

public class GetActivity {


    public static Activity getActivityByContext(Context context){
        while(context instanceof ContextWrapper){
            if(context instanceof Activity){
                return (Activity) context;
            }
            context = ((ContextWrapper) context).getBaseContext();
        }
        return null;
    }
}

 

这四个脚本就是核心类,语音识别就是AS端这几个脚本实现的!下面来看一下AndroidManifest怎样修改吧!


7.修改AndroidManifest文件

直接把我这个代码复制到自己的AndroidManifest中就好了

  • 这里要注意两个问题

  • package要填写正确,填写自己的!

  • 下面的「APPID」「API_KEY」「SECRET_KEY」都要填写自己在百度语音识别平台上创建的那个应用的

  • 如果忘记了就往上翻看一下哦,这个要在百度语音平台看一下自己的!每个人的都不同~

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.xxx.xxx">   <!-- 填写自己的包名 -->
    <!-- 通用权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
    <!-- 语音识别权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 
    <!-- 语音合成权限 -->
 
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
 
    <application android:allowBackup="true">
        <activity android:name=".Wakeup.WakeUpResult"></activity>
        <activity android:name=".Wakeup.WakeupHandler" />
        
        <activity
            android:name=".CientBaiDuVoiceMainActivity"
            android:launchMode="singleTask" />
 <!-- 请填写真实的APP_ID API_KEY SECRET_KEY -->
        <meta-data
            android:name="com.baidu.speech.APP_ID"
            android:value="xxxxx" />
        <meta-data
            android:name="com.baidu.speech.API_KEY"
            android:value="xxxxx" />
        <meta-data
            android:name="com.baidu.speech.SECRET_KEY"
            android:value="xxxxx" />
 
        <service
            android:name="com.baidu.speech.VoiceRecognitionService"
            android:exported="false" />
    </application>
 
</manifest>


8.打包aar

  • 好了,如果确定上面一步里的包名、ID和KEY等都填写正确了

  • 那在AS端的操作也就算完成了,接下来就是打包成aar给Unity使用就好了!

  • 按照下图所示,先选中baidu这个文件夹,然后Build - > Make Module "baidu"

  • 开始这三布之前先点击右边那个小按钮编译一下最好!

  • 然后就会看到「baidu」这个文件夹下多了一个「Build」文件夹!

  • 我们把下图中这个「aar」文件复制出来就好了,准备下一步中放到Unity中使用!!


🍑Unity端操作步骤

1.新建一个Unity工程

打开UnityHub新建一个Unity工程,我这里使用的Unity版本是2018.4.32


2.导入aar包

  • 「Unity」「Assets文件夹」下新建一个文件夹 「Plugins->Android」

  • 别问为什么,照做就好啦~

  • 然后将我们在「AS」端打包的「aar」文件放到「Unity」中,就如下图所示:


3.简单搭建一个UI用做测试

新建一个画布,里面放两个Button按钮和一个Text文本就好了!

3.新建脚本写代码!

  • 这里我们新建一个空游戏对象,名字改为「NetLogic」

  • 名字一定要是这个,因为我们这次AS给Unity交互采用的是发消息机制「UnityPlayer.UnitySendMessage」

  • 是通过名字来找到这个对象的!(因为我写的讯飞语音中使用的是代理模式Proxy,所以这里换个方法体验一下!)

  • 然后新建一个脚本「BD」,代码如下,将两个「Button」「Text」文本拖到脚本上即可!

如下图:

using LitJson;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BD : MonoBehaviour
{
    AndroidJavaObject m_AndroidPluginObj;
    AndroidJavaClass _androidJC;
    AndroidJavaObject m_Android;
    public Text mRecognRes;
    public Button startASR_Btn;
    public Button stopASR_Btn;

    void Start()
    {
        AndroidJavaClass _androidJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        if (_androidJC == null)
        {
            Debug.Log("JNI initialization failure.");
            return;
        }
        m_AndroidPluginObj = _androidJC.GetStatic<AndroidJavaObject>("currentActivity");
        startASR_Btn.onClick.AddListener(StartRecogn);
        stopASR_Btn.onClick.AddListener(StopRecogn);

        Invoke("InitAsr", 3);
    }

    public void InitAsr()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.example.baidu.CientBaiDuVoiceMainActivity");//包名加类名
        AndroidJavaObject m_Android = jc.CallStatic<AndroidJavaObject>("getInstance");
        if (m_Android != null)
        {
            m_Android.Call("InitRecogn", m_AndroidPluginObj);
        }
        else
            Debug.Log("AndroidPlugin is Null");
    }
    public void StartRecogn()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.example.baidu.CientBaiDuVoiceMainActivity");
        AndroidJavaObject m_Android = jc.CallStatic<AndroidJavaObject>("getInstance");
        if (m_Android != null)
        {
            m_Android.Call("StartRecogn");
        }
        else
            Debug.Log("AndroidPlugin is Null");
    }
    public void StopRecogn()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.example.baidu.CientBaiDuVoiceMainActivity");
        AndroidJavaObject m_Android = jc.CallStatic<AndroidJavaObject>("getInstance");
        if (m_Android != null)
        {
            m_Android.Call("StopRecogn");
        }
        else
            Debug.Log("AndroidPlugin is Null");
    }

    /// <summary>
    /// 百度语音识别结果反馈
    /// </summary>
    /// <param name="res"></param>
    void RecognResult(string res)
    {
        string[] ress = res.Split('&');
        JsonData jsonData = JsonMapper.ToObject(ress[1]);
        string resStr = "";
        if (jsonData["result_type"].ToString() == "partial_result")
        {
            resStr = "临时识别结果:";
        }
        else
        {
            resStr = "最终识别结果:";
        }

        resStr += jsonData["best_result"].ToString();
        mRecognRes.text = resStr;
    }
}

 

  • 脚本中定义了两个「Button」点击事件和四个方法

  • 分别是「语音识别初始化」「开始语音识别」「停止语音识别」「语音识别内容接收」

  • 这里值得一提的是,接收语音识别内容的方法,得到的是「Json」字符

  • 我们需要解析完才能看到我们想要的内容

  • 那这里就需要导入一个解析Json的dll文件——「LitJSON」

  • 还要把它放到「Plugins」目录下

  • 那我这里也是在网上下载了然后放到这里使用了!

  • 然后代码中还要引用一下命名空间,上述脚本代码中也添加了,这里只是简单说一下!

using LitJson;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity接入 百度语音识别 SDK 的相关文章

随机推荐

  • Linux 环境下编译 freeRDP

    RDP xff1a 远程桌面协议 xff08 Remote Desktop Protocol xff09 xff0c 是一个多通道的协议 xff0c 可以让客户端或称 本地电脑 连上提供微软终端机服务的电脑 xff08 服务器端或称 远程电
  • 第十一节:元组 Tuple3

    创建元组 span class hljs title scala span gt val t 61 span class hljs number 1 span span class hljs string 34 hello 34 span
  • window下rust的安装

    删除rustup重装 环境变量配置 xff1a 通过RUST HOME指定rustup的安装目录 通过CARGO HOME指定cargo的安装过目录 再次运行rustup init文件 观察到安装界面的rustup路径和和cargo已经发生
  • Vue中如何使用websocket

    1新建文件夹 socket js 目录自己看着办 可以放lib或者utils import Vue from 39 vue 39 const ReconnectingWebSocket 61 require 39 64 api webSoc
  • Unity 场景鼠标移动、旋转

    using System Collections using System Collections Generic using UnityEngine public class CameraMove MonoBehaviour privat
  • unity 相机鼠标控制移动旋转缩放

    using System using System Collections using System Collections Generic using UnityEngine public class CameraCtrl02 MonoB
  • vr全景图如何制作?vr制作用什么软件?(详细教程)

    一 vr制作用什么软件 xff1f 1 图片处理软件 Photoshop xff08 PS xff09 全称叫Adobe Photoshop Photoshop主要处理以像素所构成的数字图像 使用其众多的编修与绘图工具 xff0c 能够有效
  • OpenGL 实现大眼和瘦脸

    借鉴博客 xff1a iOS原生框架Vision实现瘦脸大眼特效 仿抖音特效相机之大眼瘦脸 本文达成效果如下图 xff1a 效果图 106个特征点如下图 特征点 原理解析 主要是以下3点 xff0c 具体请前往参考博客和原理解析 1 圆内放
  • Unity c#脚本更换物体材质球

    using UnityEngine public class TestMaterial MonoBehaviour public Material test M public Material test B void Update if I
  • 史上最全的 Java 高质量博客与网站推荐(国内篇)

    阅读文本大概需要 6 66 分钟 前言 我最近在系统整理一些 Java 后台方面的面试题和参考答案 xff0c 有找工作需求的童鞋 xff0c 欢迎关注我的 Github 仓库 xff0c 如果觉得不错可以点个 star 关注 xff1a
  • unity 打包webGL本地打不开,就算配置了iis设置了浏览器还是打不开的解决方法。

    我打包了unity的webgl但是浏览器打不开 xff0c 于是下载了火狐根据网上的相关教程 xff0c 这里有一篇比较好的 xff1a 火狐浏览器Firefox在本地打开Unity3D开发的webGL的项目 知乎 zhihu com xf
  • Unity WebGL打包后怎么运行(火狐配置)

    打包后出现以下 xff1a 其中两个文件夹都是项目资源 xff0c 只有index html才是打开Web运行的页面 使用火狐浏览器 Firefox浏览器 Firefox的用户请在浏览器的地址栏输入 about config xff0c 回
  • 720全景图在线下载

    简单的下载全景图的网站 全景管家 第一步 需要打开全景管家 xff1a https krpano scenegram cn 把合适的全景项目的链接复制到输入框中 xff0c 点击箭头进行搜索 第二步 点击 解析全景图 按钮进行解析 xff0
  • Unity3D物体点击事件实现方式

    此篇博客将通过两种方式实现场景中物体的点击事件 准备工作 xff1a 1 给场景添加EventSystem xff1a 选择Hierarchy窗口 Create UI Event System 2 给摄像机添加Physics Raycast
  • Unity 实战【360VR 看房】

    360全景VR看房 xff0c 可以实现不同角度切换视角 xff0c 下面为运行效果 07d5f29d50af8b633083920e6cde0619 gif 360 全景的逻辑其实很简单 xff0c 主要的思路是采用一个球体模型 xff0
  • vr全景图如何制作?vr制作用什么软件?(详细教程)

    很多刚接触到vr全景的朋友都一定都好奇vr全景图如何制作的 xff1f 下面就来一起看看vr全景图的制作流程吧 当然 xff0c 首先我们要知道vr制作用什么软件 vr全景图如何制作 xff1f vr制作用什么软件 xff1f xff08
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu

    错误 xff1a CIL library CIL module error LNK2005 DllMain 64 12 already defined in mfcs120u lib dllmodul obj 这个错误和要生成的DLL类型有
  • Git删除已经存的tag

    git tag d tag name 删除本地tag git push origin refs tags tagname 删除远程tag 注意 xff1a refs 之间没有空格
  • EGL在PC和移动端上的支持共享上下文环境情况

    PC端 xff1a 不支持共享上下文 移动端 xff1a 支持共享上下文
  • Unity接入 百度语音识别 SDK

    接入百度语音识别 跟之前文章写过的接入讯飞语音识别一样 xff0c 都要去官网下载对应的SDK 所以我们去官网下载SDK xff0c 大家都是聪明人 百度语音SDK获取网址 怎样获取SDK部分就不做过多介绍了 xff0c 进入官网按照介绍