概述
上章我们讲了在AndroidStudio里跑讯飞原生的demo。
这章我们来将这个在Unity中跑起来。
因为我们跑的是离线命令词识别功能所以这些脚本都是其他功能使用的,不用管他,直接删掉就行了。
大家看清楚这段代码,这段代码的意思是将你讯飞平台上的appid注册到应用中去。就是上一张我同样涂红的那部分。这里的代码可以复制过来。在unity中初始化离线命令词识别的时候可以用。
注释掉后面的继承,这里继承是为了安卓端能够点击,在Unity里没用。
同样的create方法在也是安卓的生命周期,我们在Unity里跑也不需要。可以不管他或者注释掉这部分代码。
同理下面的initlayout 和onclick这两个方法我们也可以不管或者注释掉。
我们将showTip方法体注释掉,在Unity中我们不用Toast显示,我们使用Unity的Text来显示。
剩下还有好多地方需要注释的我就不一一来讲了。我在文章的最后会放上工程的链接地址。大家直接看我的代码就行了,毕竟大家都是程序员,这么简单的代码看看应该没啥问题。
我接下来来讲新增的代码,也就是我自己添加的代码。
这段代码是拿来获取Unity的Activity的,这个获取到了后面还有作用。
这个方法上面的那部分是将appid注入到当前的识别引擎中去的,下面的话也是同样的道理,将配置文件注入进当前的activity中。
/**
* Toast显示unity发送过来的内容
* @param content 消息的内容
* @return 调用是否成功
*/
public boolean showToast(String content){
Toast.makeText(getActivity(),content,Toast.LENGTH_SHORT).show();
//这里是主动调用Unity中的方法,该方法之后unity部分会讲到
callUnity("Main Camera","FromAndroid", "hello unity i'm android");
return true;
}
/**
* 调用Unity的方法
* @param gameObjectName 调用的GameObject的名称
* @param functionName 方法名
* @param args 参数
* @return 调用是否成功
*/
boolean callUnity(String gameObjectName, String functionName, String args){
try {
Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class);
method.invoke(classtype,gameObjectName,functionName,args);
return true;
} catch (ClassNotFoundException e) {
} catch (NoSuchMethodException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
return false;
}
应该很简单吧。我就不多讲了。
红色这行是为了在Unity中能够看见我们的识别结果。
修改一下AndroidManifest.xml文件,我们没必要留一些acitvity文件,我们这个只是个aar的包。
打aar包的话我就不多讲了,我之前的文章也讲过。
打aar包优化教程.大家可以自己去看下。
接下来我们来讲Unity部分代码
using UnityEngine;
using UnityEngine.UI;
public class Main : MonoBehaviour
{
/// <summary>
/// 场景上的文本框用来显示android发送过来的内容
/// </summary>
public Text text;
/// <summary>
/// android原生代码对象
/// </summary>
AndroidJavaObject _ajc;
void Start()
{
//通过该API来实例化导入的arr中对应的类
_ajc = new AndroidJavaObject("com.iflytek.mscv5plusdemo.AsrDemo");
}
void Update()
{
}
/// <summary>
/// 场景上按点击时触发该方法
/// </summary>
public void OnBtnClick()
{
//通过API来调用原生代码的方法
bool success = _ajc.Call<bool>("InitAsr");
if (true == success)
{
//请求成功
}
}
public void OnBtnClick2()
{
//通过API来调用原生代码的方法
bool success = _ajc.Call<bool>("Buildsyntax");
if (true == success)
{
//请求成功
}
}
public void OnBtnClick3()
{
//通过API来调用原生代码的方法
bool success = _ajc.Call<bool>("StartRecognize");
if (true == success)
{
//请求成功
}
}
/// <summary>
/// 原生层通过该方法传回信息
/// </summary>
/// <param name="content"></param>
public void FromAndroid(string content)
{
text.text = content;
}
}
三个方法分别调用了安卓的初始化,构建语法,开始识别三个功能
_ajc = new AndroidJavaObject(“com.iflytek.mscv5plusdemo.AsrDemo”);
尤其要注意的是这行,不能获取错了类名,否则会报错没办法运行
将打出来的aar包放在Asset/plugin/Android下,之后将该脚本悬挂至Camera上然后在场景中创建三个button来分别调用这个方法。
像上图这样。
然后就打包成apk运行在手机上就行了。
注意事项
我接下来会给出我的项目仓库地址,但是由于讯飞的注册体验时间是三个月,你们拿到之后假如要体验我的项目的话,将我Android工程中的appid和资源
更换为你们自己的。
仓库地址
如果有错误的地方请大家指出来,在下方评论即可。我隔一段时间会上一次
最后
以上就是活力金鱼为你收集整理的Unity端接入讯飞语音识别的离线命令词识别(二)的全部内容,希望文章能够帮你解决Unity端接入讯飞语音识别的离线命令词识别(二)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复