- 博客主页:https://blog.csdn.net/zhangay1998
- 欢迎点赞 收藏 ⭐留言 如有错误敬请指正!
- 本文由 呆呆敲代码的小Y 原创,首发于 CSDN
- 未来很长,值得我们全力奔赴更美好的生活✨
注意:本文教程使用的Unity版本是2018.4.32,其他版本可能有出入,一般问题不大
百度语音SDK获取网址
那接下来就是获取到语音识别SDK后的部分了!
然后新建一个module,起一个名字
File-new-new Module(下图)
好了,到这一步才是写代码的阶段,前边做的几个步骤都是为了为最后的操作搭建一个"台子"
直接看一下最终效果:
然后直接上各个脚本的代码,直接放进去就行
CientBaiDuVoiceMainActivity:
package com.example.baidu;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import com.example.baidu.Recogn.RecognHandler;
import com.example.baidu.Recogn.RecognListener;
import com.unity3d.player.UnityPlayerActivity;
public class CientBaiDuVoiceMainActivity {
public static CientBaiDuVoiceMainActivity _instance;
public static CientBaiDuVoiceMainActivity getInstance() {
if (_instance == null) {
_instance = new CientBaiDuVoiceMainActivity();
}
return _instance;
}
//语音识别
RecognHandler mRecognHandler;
//语音识别初始化
public void InitRecogn(Context context) {
Log.i("@@@", "安卓端开始初始化语音识别了 ");
RecognListener listener=new RecognListener();
mRecognHandler=new RecognHandler(context,listener);
}
//开始语音识别
public void StartRecogn() {
mRecognHandler.Start();
}
//停止语音识别
public void StopRecogn() {
mRecognHandler.Stop();
}
//释放语音识别实例
public void ReleaseRecogn() {
mRecognHandler.Release();
mRecognHandler=null;
}
}
RecognHandler:
package com.example.baidu.Recogn;//自己的包名
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;
import com.baidu.speech.EventListener;
import com.baidu.speech.EventManager;
import com.baidu.speech.EventManagerFactory;
import com.baidu.speech.asr.SpeechConstant;
import org.json.JSONObject;
import java.util.LinkedHashMap;
import java.util.Map;
import static com.example.baidu.Util.GetActivity.getActivityByContext;
public class RecognHandler {
private boolean mIsInit = false;
private EventManager asr;
private EventListener mEventLisener;
public RecognHandler(Context context, EventListener listener) {
if (mIsInit) {
listener=null;
return;
}
mIsInit = true;
mEventLisener = listener;
//动态申请权限
initPermission(context);
asr = EventManagerFactory.create(context, "asr");
asr.registerListener(listener);
}
//开始识别
public void Start() {
Log.i("@@@", "点击开始语音识别了 ");
Map<String, Object> params = new LinkedHashMap<String, Object>();
// 基于SDK集成2.1 设置识别参数
params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, true);
params.put(SpeechConstant.DISABLE_PUNCTUATION, false);
params.put(SpeechConstant.ACCEPT_AUDIO_DATA, false);
params.put(SpeechConstant.PID, 1537); // 中文输入法模型,有逗号
String json = null; // 可以替换成自己的json
json = new JSONObject(params).toString(); // 这里可以替换成你需要测试的json
asr.send(SpeechConstant.ASR_START, json, null, 0, 0);
}
//停止识别
public void Stop() {
asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0);
}
//释放实例
public void Release() {
asr.unregisterListener(mEventLisener);
mIsInit = false;
asr=null;
}
/**
* android 6.0 以上需要动态申请权限
*/
private void initPermission(Context context) {
String permissions[] = {
Manifest.permission.RECORD_AUDIO,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.INTERNET,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
PackageManager pm = getActivityByContext(context).getPackageManager();
boolean permission_readStorage = (PackageManager.PERMISSION_GRANTED ==
pm.checkPermission("android.permission.RECORD_AUDIO", "com.cientx.tianguo"));
boolean permission_network_state = (PackageManager.PERMISSION_GRANTED ==
pm.checkPermission("android.permission.ACCESS_NETWORK_STATE", "com.cientx.tianguo"));
boolean permission_internet = (PackageManager.PERMISSION_GRANTED ==
pm.checkPermission("android.permission.INTERNET", "com.cientx.tianguo"));
boolean permission_writeStorage = (PackageManager.PERMISSION_GRANTED ==
pm.checkPermission("android.permission.WRITE_EXTERNAL_STORAGE", "com.cientx.tianguo"));
if (!(permission_readStorage && permission_writeStorage && permission_network_state && permission_internet)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getActivityByContext(context).requestPermissions(permissions, 0x01);
}
}
}
}
RecognListener:
package com.example.baidu.Recogn;//填写自己的包名
import android.util.Log;
import com.baidu.speech.EventListener;
import com.baidu.speech.asr.SpeechConstant;
import com.unity3d.player.UnityPlayer;
public class RecognListener implements EventListener {
@Override
public void onEvent(String name, String params, byte[] data, int i, int i1) {
if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)) {
Log.i("@@@", "进入开始语音识别的方法了 ");
// 识别相关的结果都在这里
if (params == null || params.isEmpty()) {
return;
}
if (params.contains("\"partial_result\"")) {
UnityPlayer.UnitySendMessage("NetLogic", "RecognResult", name + "&" + params);
// 一句话的临时识别结果
} else if (params.contains("\"final_result\"")) {
UnityPlayer.UnitySendMessage("NetLogic", "RecognResult", name + "&" + params);
// 一句话的最终识别结果
} else {
// 一般这里不会运行
if (data != null) {
}
}
} else {
// 识别开始,结束,音量,音频数据回调
if (params != null && !params.isEmpty()) {
}
if (data != null) {
}
}
}
};
GetActivity:
package com.example.baidu.Util;//自己的包名
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
public class GetActivity {
public static Activity getActivityByContext(Context context){
while(context instanceof ContextWrapper){
if(context instanceof Activity){
return (Activity) context;
}
context = ((ContextWrapper) context).getBaseContext();
}
return null;
}
}
这四个脚本就是核心类,语音识别就是AS端这几个脚本实现的!
下面来看一下AndroidManifest怎样修改吧!
直接把我这个代码复制到自己的AndroidManifest中就好了
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.xxx.xxx"> <!-- 填写自己的包名 -->
<!-- 通用权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 语音识别权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 语音合成权限 -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<application android:allowBackup="true">
<activity android:name=".Wakeup.WakeUpResult"></activity>
<activity android:name=".Wakeup.WakeupHandler" />
<activity
android:name=".CientBaiDuVoiceMainActivity"
android:launchMode="singleTask" />
<!-- 请填写真实的APP_ID API_KEY SECRET_KEY -->
<meta-data
android:name="com.baidu.speech.APP_ID"
android:value="xxxxx" />
<meta-data
android:name="com.baidu.speech.API_KEY"
android:value="xxxxx" />
<meta-data
android:name="com.baidu.speech.SECRET_KEY"
android:value="xxxxx" />
<service
android:name="com.baidu.speech.VoiceRecognitionService"
android:exported="false" />
</application>
</manifest>
打开UnityHub新建一个Unity工程,我这里使用的Unity版本是2018.4.32
新建一个画布,里面放两个Button按钮和一个Text文本就好了!
using LitJson;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BD : MonoBehaviour
{
AndroidJavaObject m_AndroidPluginObj;
AndroidJavaClass _androidJC;
AndroidJavaObject m_Android;
public Text mRecognRes;
public Button startASR_Btn;
public Button stopASR_Btn;
void Start()
{
AndroidJavaClass _androidJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
if (_androidJC == null)
{
Debug.Log("JNI initialization failure.");
return;
}
m_AndroidPluginObj = _androidJC.GetStatic<AndroidJavaObject>("currentActivity");
startASR_Btn.onClick.AddListener(StartRecogn);
stopASR_Btn.onClick.AddListener(StopRecogn);
Invoke("InitAsr", 3);
}
public void InitAsr()
{
AndroidJavaClass jc = new AndroidJavaClass("com.example.baidu.CientBaiDuVoiceMainActivity");//包名加类名
AndroidJavaObject m_Android = jc.CallStatic<AndroidJavaObject>("getInstance");
if (m_Android != null)
{
m_Android.Call("InitRecogn", m_AndroidPluginObj);
}
else
Debug.Log("AndroidPlugin is Null");
}
public void StartRecogn()
{
AndroidJavaClass jc = new AndroidJavaClass("com.example.baidu.CientBaiDuVoiceMainActivity");
AndroidJavaObject m_Android = jc.CallStatic<AndroidJavaObject>("getInstance");
if (m_Android != null)
{
m_Android.Call("StartRecogn");
}
else
Debug.Log("AndroidPlugin is Null");
}
public void StopRecogn()
{
AndroidJavaClass jc = new AndroidJavaClass("com.example.baidu.CientBaiDuVoiceMainActivity");
AndroidJavaObject m_Android = jc.CallStatic<AndroidJavaObject>("getInstance");
if (m_Android != null)
{
m_Android.Call("StopRecogn");
}
else
Debug.Log("AndroidPlugin is Null");
}
///
/// 百度语音识别结果反馈
///
///
void RecognResult(string res)
{
string[] ress = res.Split('&');
JsonData jsonData = JsonMapper.ToObject(ress[1]);
string resStr = "";
if (jsonData["result_type"].ToString() == "partial_result")
{
resStr = "临时识别结果:";
}
else
{
resStr = "最终识别结果:";
}
resStr += jsonData["best_result"].ToString();
mRecognRes.text = resStr;
}
}
脚本中定义了两个Button点击事件和四个方法
分别是语音识别初始化、开始语音识别、停止语音识别和语音识别内容接收!
这里值得一提的是,接收语音识别内容的方法,得到的是Json字符
我们需要解析完才能看到我们想要的内容
那这里就需要导入一个解析Json的dll文件——LitJSON
还要把它放到Plugins目录下
然后代码中还要引用一下命名空间,上述脚本代码中也添加了,这里只是简单说一下!
using LitJson;
Unity接入百度语音源码工程下载
相比前面三篇接入讯飞语音的要写的少,因为整理过程是有些相似的!
之前也写过三篇很详细的教程介绍怎样接入科大讯飞的语音识别SDK,感兴趣的小伙伴也可以俩看一下!
Unity 实战项目 ☀️| 接入科大讯飞语音SDK(一)如何在科大讯飞平台搞到SDK!系列共两万多字超级新手教程!
Unity 实战项目 ☀️| 接入科大讯飞语音SDK(二)在Android Studio该如何操作! 系列共两万多字超级新手教程!
Unity 实战项目 ☀️| 接入科大讯飞语音SDK(三)在Unity端该如何操作! 系列共两万多字超级新手教程!