在上一篇博客中我们成功在Unity发布的安卓apk中回调到了安卓插件的方法,因此在这篇章中,我们开始集成百度语音识别。
1、插件中引入百度语音识别
首先在百度AI网址下载安卓sdk,将app/libs 文件夹下的jar包放到之前创建的Library的libs目录下,并且将其添加到Dependencies中。
在BaiduVoice中添加如下代码:
package com.beefun.baiduvoice;
import android.app.Fragment;
import com.baidu.speech.EventListener;
import com.baidu.speech.EventManager;
import com.baidu.speech.EventManagerFactory;
import com.baidu.speech.asr.SpeechConstant;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
/**
* Created by User on 2017/11/8.
*/
public class BaiduVoice extends Fragment{
public static BaiduVoice instance;
//语音识别对象
public EventManager asr = null;
public static void start(){
instance = new BaiduVoice();
UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(instance, "BaiduVoice").commit();
}
/**
* 初始化监听类方法
*/
public void Init(){
asr = EventManagerFactory.create(UnityPlayer.currentActivity, "asr");
EventListener myEventListener = new EventListener() {
@Override
public void onEvent(String name, String params, byte[] bytes, int i, int i1) {
//解析数据并且传到unity中
String logTxt = "name: " + name;
//此回调表示可以开始识别
if(name.equals(SpeechConstant.CALLBACK_EVENT_ASR_READY)){
UnityPlayer.UnitySendMessage("Canvas", "SetText", "start");
}
//百度语音开始识别的回调
if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)){
logTxt += " ;params :" + params;
UnityPlayer.UnitySendMessage("Canvas", "SetText", logTxt);
}
//识别结束的回调
if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_FINISH)){
logTxt += " ;params :" + params;
UnityPlayer.UnitySendMessage("Canvas", "SetText", logTxt);
}
}
};
asr.registerListener(myEventListener);
}
/**
* 开始录音方法
* @param json
*/
public void start(String json){
asr.send(SpeechConstant.ASR_START, json, null, 0, 0);
}
/**
* 停止录音方法
*/
public void stop(){
asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0);
}
/**
*
* @param _obj Unity中场景中的对象名称
* @param _fun 回调的Unity方法
* @param _val
*/
public void CallBack(String _obj, String _fun, String _val){
UnityPlayer.UnitySendMessage(_obj, _fun, "Android Callback " + _val);
}
}
保存,然后导出jar包。
2、将jar包放入Unity中
打开 Unity工程,将导出的jar包替换之前的测试jar包,将百度语音安卓sdk中app\libs文件夹下的jar包,app\src\main下的assets文件夹放到Assets\Plugins\Android中。
在Unity的安装目录下的Editor\Data\PlaybackEngines\AndroidPlayer\Apk中将AndroidManifest.xml文件放到Assets\Plugins\Android中.
将安卓sdk中app\src\main\jniLibs下的armeabi-v7a文件夹放到Assets\Plugins\Android\libs文件夹中。
接下来,我们需要修改安卓的配置文件,代码如下:其中xxxxx处需要填写百度语音的真实id,key和secret_key。
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="preferExternal"
android:versionCode="1"
android:versionName="1.0">
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:theme="@style/UnityThemeSelector"
android:icon="@drawable/app_icon"
android:label="@string/app_name">
<!-- 请填写真实的APP_ID API_KEY SECRET_KEY-->
<meta-data android:name="com.baidu.speech.APP_ID"
android:value="xxxxxxx" />
<meta-data
android:name="com.baidu.speech.API_KEY"
android:value="xxxxxxx" />
<meta-data
android:name="com.baidu.speech.SECRET_KEY"
android:value="xxxxxxx" />
<service
android:name="com.baidu.speech.VoiceRecognitionService"
android:exported="false" />
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
/manifest>
修改Test脚本,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Text;
public class Test : MonoBehaviour {
public Text myText;
public StringBuilder stringBuilder = new StringBuilder();
public AndroidJavaClass ajc = null;
public AndroidJavaObject ajo = null;
public void SetText(string str){
this.stringBuilder.Append(str);
this.myText.text = stringBuilder.ToString();
}
// Use this for initialization
void Start () {
ajc = new AndroidJavaClass("com.beefun.baiduvoice.BaiduVoice");
ajc.CallStatic("start");
ajo = ajc.GetStatic<AndroidJavaObject>("instance");
ajo.Call("Init");
}
/// <summary>
/// 开始语音识别方法
/// </summary>
/// <param name="str">json参数</param>
public void StartVoice(string str){
//pid 为识别语言种类
str = "{\"accept-audio-data\":false,\"disable-punctuation\":false,\"accept-audio-volume\":true,\"pid\":1736}";
ajo.Call("start", str);
}
/// <summary>
/// 停止识别方法
/// </summary>
public void StopVoice(){
ajo.Call("stop");
}
// Update is called once per frame
void Update () {
}
}
在场景中的Canvas下添加两个按钮,分别调用Test脚本中的StartVoice方法和StopVoice方法。发布安卓apk,在手机中进行测试。
点击识别按钮,然后说出hello,然后点击停止,出现如下图片所示,表明调用成功。