您的位置:首页 > 移动开发 > Unity3D

Unity 中使用百度语音识别发布Android程序(二)

2018-01-29 22:02 309 查看
http://blog.csdn.net/z3465875/article/details/78527269

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

/**
* 开始录音方法
* @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);
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

保存,然后导出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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

修改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 () {

}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

在场景中的Canvas下添加两个按钮,分别调用Test脚本中的StartVoice方法和StopVoice方法。发布安卓apk,在手机中进行测试。

点击识别按钮,然后说出hello,然后点击停止,出现如下图片所示,表明调用成功。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: