Unity 实战项目 ☀️| 接入科大讯飞语音SDK在Unity端该如何操作! 系列共两万多字超级新手教程!

Posted 呆呆敲代码的小Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 实战项目 ☀️| 接入科大讯飞语音SDK在Unity端该如何操作! 系列共两万多字超级新手教程!相关的知识,希望对你有一定的参考价值。

  • 📢博客主页:https://blog.csdn.net/zhangay1998
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉
  • 📢未来很长,值得我们全力奔赴更美好的生活✨


📢前言

🍓Unity端

🏳️‍🌈创建Unity新项目

打开UnityHub新建一个项目,修改名字和路径(随意)
点击创建项目,等等创建完成!


🏳️‍🌈创建文件夹Plugins

在Unity的Assets内新建Plugins/android文件夹
将aar和AndroidManifest文件放入进去即可。如下所示


🏳️‍🌈搭建一个简单的UI进行测试

示例如下。一个Text组件用于显示语音识别出来的内容,一个Button组件用于点击就开始进行语音识别
下面的连通测试是为了确认aar包在Unity中正常连通了,之前在AS里写了方法就是为了留给点击这个按钮后调用的


🏳️‍🌈上代码

首先创建一个脚本:GetAndroidPort
该脚本用于与AS端进行交互使用!!!
此代码使用的Proxy代理方式与AS进行交互,如果这一块还不是很熟悉
就来看一下这个交互文章:Unity与安卓交互方法详解

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GetAndroidPort : MonoBehaviour
{
    [HideInInspector]
    public string asrMsg;

    private Text TestProxy;
    private Text initTex;

    private AndroidJavaObject jo;
    private AndroidJavaClass toast;
    private AndroidJavaObject context;

    public static GetAndroidPort _instance;
    private AsrEventCallback asrEventCallback;

    private void Awake()
    {
        if (_instance == null)
        {
            _instance = this;
        }
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

        toast = new AndroidJavaClass("android.widget.Toast");
        context = jo.Call<AndroidJavaObject>("getApplicationContext");

        TestProxy = GameObject.Find("Canvas/Panel/Unity->AS").GetComponent<Text>();
        initTex = GameObject.Find("Canvas/Panel/AS->Unity").GetComponent<Text>();

    }
    void Start()
    {
        asrEventCallback = new AsrEventCallback();
        // 设置语音识别回调函数接口
        jo.Call("setUnityasrEventCallback", asrEventCallback);
    }

    /// <summary>
    /// AS端向Unity通讯的测试方法,AS端程序一开始就调用
    /// </summary>
    /// <param name="initMsg"></param>
    public void InitCallBack(string initMsg)
    {
        initTex.text = initMsg;
    }

    /// <summary>
    /// Unity端向AS通讯测试方法,Unity端执行调用
    /// </summary>
    public void TryProxy()
    {
        jo.Call("unityProxyDemo");
        jo.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        {
            toast.CallStatic<AndroidJavaObject>("makeText", context, "开始代理测试", toast.GetStatic<int>("LENGTH_SHORT")).Call("show");
        }));
    }
    /// <summary>
    /// 开始语音识别
    /// </summary>
    public void startASRListening()
    {
        jo.Call("unityStartSpeech");
    }



    #region  语音识别代理回调
    public class AsrEventCallback : AndroidJavaProxy
    {
        public AsrEventCallback() : base("com.example.iflytek.UnityasrEventCallback") { }
        public void Speechcontent(string content) { _instance.asrMsg = content; }
        public void Test1(string msg) { GetAndroidPort._instance.TestProxy.text = msg; }
    }

    #endregion

}


}


然后在创建一个脚本SpeechManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SpeechManager : MonoBehaviour
{
    private Text ASRmsg;//语音识别的内容
    private Button TryBtn;//测试交互按钮
    private Button ASR_Btn;//开始语音识别按钮

    public static SpeechManager _instance;

    private void Awake()
    {
        if (_instance == null)
        {
            _instance = this;
        }
        ASRmsg = GameObject.Find("Canvas/Panel/Demo").GetComponent<Text>();
        ASR_Btn = GameObject.Find("Canvas/Panel/Start_Btn").GetComponent<Button>();
        TryBtn = GameObject.Find("Canvas/Panel/Test_Btn").GetComponent<Button>();
    }

    void Start()
    {
        ASR_Btn.onClick.AddListener(() => {

            GetAndroidPort._instance.startASRListening();

        });
        TryBtn.onClick.AddListener(() => {

            GetAndroidPort._instance.TryProxy();
        });
    }

    private void Update()
    {
        ASRmsg.text = "语音识别的内容:"+GetAndroidPort._instance.asrMsg;
    }
}



在场景中新建一个游戏对象改名为:iFlytekASRController
将这两个脚本挂载到iFlytekASRController游戏对象上

这是因为在AS端定义了下面这个发送消息的方法:

Unity端的接收方法:


🏳️‍🌈开始语音识别

在Unity端执行这个方法:

AS端所执行的方法:

在Unity端需要执行语音识别的时候调用这个startASRListening即可
我这个Demo中就是在点击Button的时候调用!

🏳️‍🌈修改Unity中的 PlayerSetting

这里一定要与aar外的AndroidManifest中的pakeage名字一样才能调用aar包中写的方法
然后打包到真机测试即可!

亲测打包后是可以进行语音识别的,如果还有问题直接评论区或者私聊告诉我即可!!!


🏳️‍🌈语音识别Unity源码工程


💬总结

  • 本次实战系列接入讯飞语音识别的文章就到了尾声了
  • 在该系列文章的第一篇中也说过,之前写过一个怎样接入讯飞SDK的文章了
  • 但是由于当时写的不够熟练而且有些地方介绍的不够详细,导致很多小伙伴看完了还是学不会。
  • 所以此次特意拿出时间总结了三篇详细介绍怎样接入科大讯飞的语音识别SDK
  • 并且交互方式换成了Proxy代理模式,比之前更加好用了!


以上是关于Unity 实战项目 ☀️| 接入科大讯飞语音SDK在Unity端该如何操作! 系列共两万多字超级新手教程!的主要内容,如果未能解决你的问题,请参考以下文章

Unity 实战项目 ☀️| 接入科大讯飞语音SDK在Android Studio该如何操作! 系列共两万多字超级新手教程!

Unity 实战项目 ☀️| Unity接入 百度语音识别 SDK!一篇文章搞定在Unity中实现语音识别!(万字完整教程)

uniapp - 接入科大讯飞语音评测

uniapp - 接入科大讯飞语音评测

uniapp - 接入科大讯飞语音评测

uniapp - 接入科大讯飞语音评测