天天看点

Unity 中使用百度语音识别发布Android程序(二)1、插件中引入百度语音识别2、将jar包放入Unity中

在上一篇博客中我们成功在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, , );
    }

    /**
     * 停止录音方法
     */
    public void stop(){
        asr.send(SpeechConstant.ASR_STOP, null, null, , );
    }

    /**
     *
     * @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,然后点击停止,出现如下图片所示,表明调用成功。

Unity 中使用百度语音识别发布Android程序(二)1、插件中引入百度语音识别2、将jar包放入Unity中