- 📢博客主頁:https://blog.csdn.net/zhangay1998
- 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
- 📢本文由 呆呆敲代碼的小Y 原創,首發于 CSDN🙉
- 📢未來很長,值得我們全力奔赴更美好的生活?
目錄
- 📢前言
- 🍉接入百度語音識別
- 🍓Android Studio端操作步驟
- 1.工程開始
- 2.接入Unity的classes.jar包
- 3.接入訊飛語音的classess.jar包
- 4.關聯兩個classes.jar包
- 5.添加libmsc.so
- 6.寫SDK的介面
- 7.修改AndroidManifest檔案
- 8.打包aar
- 🍑Unity端操作步驟
- 1.新建一個Unity工程
- 2.匯入aar包
- 3.簡單搭建一個UI用做測驗
- 3.新建腳本寫代碼!
- 4.打包成apk真機測驗
- 🥭原始碼工程下載
- 💬總結

📢前言
- 最近有小伙伴在我之前寫過的一篇怎樣接入訊飛語音識別的文章下面留言
- 說這篇文章有許多地方細節不到位,導致自己看不明白
- 所以我就寫了三篇系列文章從一個新手角度寫了一篇接入訊飛語音的教程!在本文最后也有鏈接介紹!
注意:本文教程使用的Unity版本是2018.4.32,其他版本可能有出入,一般問題不大
🍉接入百度語音識別
- 跟之前文章寫過的接入訊飛語音識別一樣,都要去官網下載對應的SDK
- 所以我們去官網下載SDK,大家都是聰明人
百度語音SDK獲取網址
- 怎樣獲取SDK部分就不做過多介紹了,進入官網按照介紹
- 注冊登錄獲取語音識別的SDK就好了,然后創建一個應用


這樣應用就創建成功了,這里要記住APPID,后面會用到!

找到SDK下載一個語音識別的SDK

那接下來就是獲取到語音識別SDK后的部分了!
🍓Android Studio端操作步驟
1.工程開始
老規矩,新建專案,修改名字和路徑,準備開始!


然后新建一個module,起一個名字
File-new-new Module(下圖)



2.接入Unity的classes.jar包
- 把Unity的class接入,路徑在安裝Unity客戶端的路徑下
- Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
- 把Unity的jar包復制到AS的libs目錄下,如下圖:

3.接入訊飛語音的classess.jar包
- 同樣的方法,將百度語音的jar包也放進去
- ar包位置就在我們在官網下載的SDK解壓后的core->libs路徑下
- 直接也復制到AS的libs目錄下就行!

效果如下:

4.關聯兩個classes.jar包
- 選中兩個jar包,右鍵Add As Libray…
- 等待編譯完就好了

- 也可以右鍵iflytevoice,Open Module Settings
- 將.jar檔案手動添加,添加完了記得點apply應用一下

如果點擊后這里顯示已經有了這兩個jar包,那說明就關聯好了

5.添加libmsc.so
還是在我們下載的SDK目錄下找到這個檔案夾jniLibs

- 然后把這個檔案夾直接復制到AS的src->main目錄下
如下圖所示:

6.寫SDK的介面
好了,到這一步才是寫代碼的階段,前邊做的幾個步驟都是為了為最后的操作搭建一個"臺子"
- 我們接下來新建四個類,分別是CientBaiDuVoiceMainActivity、RecognHandler、RecognListener和GetActivity
- 怎樣新建就不說了,我這里還新建了兩個檔案夾Recogn和Util為了區分腳本類別,照著我這個做就行
直接看一下最終效果:

然后直接上各個腳本的代碼,直接放進去就行
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怎樣修改吧!
7.修改AndroidManifest檔案
直接把我這個代碼復制到自己的AndroidManifest中就好了
- 這里要注意兩個問題
- package要填寫正確,填寫自己的!
- 下面的APPID、API_KEY和SECRET_KEY都要填寫自己在百度語音識別平臺上創建的那個應用的
- 如果忘記了就往上翻看一下哦,這個要在百度語音平臺看一下自己的!每個人的都不同~
<?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>
8.打包aar
- 好了,如果確定上面一步里的包名、ID和KEY等都填寫正確了
- 那在AS端的操作也就算完成了,接下來就是打包成aar給Unity使用就好了!
- 按照下圖所示,先選中baidu這個檔案夾,然后Build - > Make Module “baidu”
- 開始這三布之前先點擊右邊那個小按鈕編譯一下最好!

- 然后就會看到baidu這個檔案夾下多了一個Build檔案夾!
- 我們把下圖中這個aar檔案復制出來就好了,準備下一步中放到Unity中使用!!

🍑Unity端操作步驟
1.新建一個Unity工程
打開UnityHub新建一個Unity工程,我這里使用的Unity版本是2018.4.32

2.匯入aar包
- 在Unity的Assets檔案夾下新建一個檔案夾 Plugins->Android
- 別問為什么,照做就好啦~
- 然后將我們在AS端打包的aar檔案放到Unity中,就如下圖所示:

3.簡單搭建一個UI用做測驗
新建一個畫布,里面放兩個Button按鈕和一個Text文本就好了!

3.新建腳本寫代碼!
- 這里我們新建一個空游戲物件,名字改為NetLogic!
- 名字一定要是這個,因為我們這次AS給Unity互動采用的是發訊息機制UnityPlayer.UnitySendMessage
- 是通過名字來找到這個物件的!(因為我寫的訊飛語音中使用的是代理模式Proxy,所以這里換個方法體驗一下!)

- 然后新建一個腳本BD,代碼如下,將兩個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");
}
/// <summary>
/// 百度語音識別結果反饋
/// </summary>
/// <param name="res"></param>
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;
4.打包成apk真機測驗
- 這里只需要將產品名改成AndroidManifest中的Package包名即可
- 就比如我這里的包名就改為baidu就可以了,然后Build打包就行
- 我自己真機測驗過了,是可以識別到的!

🥭原始碼工程下載
- 本文教程原始碼工程下載鏈接在這
- 可以直接下載打開使用
Unity接入百度語音原始碼工程下載
💬總結
- 那到這里就結束了,本文對百度語音接入做了一個教程
相比前面三篇接入訊飛語音的要寫的少,因為整理程序是有些相似的!
- 在實際操作程序中,會出現一些問題是肯定的
- 包括我在做這個百度語音識別的時候也遇到了困難
- 因為我之前做過訊飛的語音識別,所以感覺百度的應該也很簡單,道理應該差不多
- 但是我實際操作起來,包括自己寫代碼和寫文章總結發現,這兩者差別還是挺大的!
- 反正遇到困難就解決就好了,多嘗試幾次找一下哪里出現問題
- 這個程序就是程式員必備的,也是最腦殼痛的問題,加油!
之前也寫過三篇很詳細的教程介紹怎樣接入科大訊飛的語音識別SDK,感興趣的小伙伴也可以倆看一下!
Unity 實戰專案 ??| 接入科大訊飛語音SDK(一)如何在科大訊飛平臺搞到SDK!系列共兩萬多字超級新手教程!
Unity 實戰專案 ??| 接入科大訊飛語音SDK(二)在Android Studio該如何操作! 系列共兩萬多字超級新手教程!
Unity 實戰專案 ??| 接入科大訊飛語音SDK(三)在Unity端該如何操作! 系列共兩萬多字超級新手教程!

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/290477.html
標籤:其他
