日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

      
          
      歡迎訪問 生活随笔!

      生活随笔

      當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

      综合教程

      【Unity】讯飞语音识别SDK

      發布時間:2024/6/21 综合教程 30 生活家
      生活随笔 收集整理的這篇文章主要介紹了 【Unity】讯飞语音识别SDK 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

      1、進入訊飛官網,注冊帳號,進入控制臺,創建新應用UnityXunfeiDemo,平臺選Android。在當前應用這點下載SDK,添加AI能力(添加新服務),選擇語音聽寫,即可下載安卓SDK(下稱訊飛安卓SDK)。

      2、打開Android Studio,新建一個項目(選Empty Activity即可),打開該項目,點擊菜單【File—New—Import Module】,導入的模塊路徑是剛才下載的安卓SDK包/sample/speechDemo>

      3、導入AS后會看到報錯如下,該模塊需要android-23的SDK,而我現在沒下(我有Android-26的SDK)。

      4、AS切到Project視圖下,打開speechDemo/build.gradle文件,修改compileSdkVersion為26,去掉buildToolsVersion這一行,最低平臺16,目標平臺26,最下面dependencies中的v4:23也改為v4:26。改完后點Gradle提示欄的Try Again重新同步一次即可。

      5、AS切換回Android視圖,選中speechDemo模塊,點擊菜單【Run—Run speechDemo】。選擇一個安卓真機,即可在手機上看到該Demo效果(即將要在Unity上實現的功能)。注意,用安卓模擬器(AVD)將無法運行該Demo,會報錯INSTALL_FAILED_NO_MATCHING_ABIS,原因是模擬器與真機的架構不同,該Demo需要一些本地庫是模擬器上沒有的,即該項目必須用真機運行。https://stackoverflow.com/questions/24572052/install-failed-no-matching-abis-when-install-apk

      6、 AS切換到Project視圖,新建模塊Android Library取名xunfeilibrary。復制訊飛安卓SDK/libs/Msc.jar到xunfeilibrary/libs/下,復制Unity的classes.jar(路徑形如D:Unity 2017.3.0f3EditorDataPlaybackEnginesAndroidPlayerVariationsmonoReleaseClassesclasses.jar)到xunfeilibrary/libs/下。右鍵Add as Library—Add to Module xunfeilibrary。為確保jar包已導入到模塊中,在Project Structure中查看引用,如下圖。

      7、在xunfeilibrary/src/main/下新建文件夾jniLibs,復制訊飛安卓SDK/libs/armeabi-v7a文件夾到該jniLibs下。(如果之后這個不行,就換復制別的arm開頭的文件夾進來)

      8、AS切換到Android視圖,在xunfeilibrary/java/包名/下新建一個Empty Activity。刪除隨之生成的布局文件xunfeilibrary/res/layout/activity_main.xml,修改MainActivity.java如下。

      9、復制app/manifests/AndroidManifest.xml清單中的< application >節點,替換掉xunfeilibrary//manifests/AndroidManifest.xml中的< application >節點內容,刪除報錯的行。修改android:label="XunfeiDemo"。加上meta-data。再把speech/manifests/AndroidManifest.xml清單最下面的所有權限拷貝過來。最后xunfeilibrary//manifests/AndroidManifest.xml清單的內容如下。

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="me.guxin.xunfeilibrary">
      
          <application
              android:allowBackup="true"
              android:label="XunfeiDemo"
              android:supportsRtl="true">
              <activity android:name=".MainActivity">
                  <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>
      
          <uses-permission android:name="android.permission.RECORD_AUDIO" />
          <uses-permission android:name="android.permission.INTERNET" />
          <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
          <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
          <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
          <uses-permission android:name="android.permission.READ_PHONE_STATE" />
          <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
          <uses-permission android:name="android.permission.READ_CONTACTS" />
          <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
          <uses-permission android:name="android.permission.WRITE_SETTINGS" />
          <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
          <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
          <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
      </manifest>

      10、參考speechDemo/java/com.iflytek/voicedemo/IatDemo.java,來編寫我們的MainActivity,內容如下。

      package me.guxin.xunfeilibrary;
      
      import android.os.Bundle;
      
      import com.iflytek.cloud.RecognizerListener;
      import com.iflytek.cloud.RecognizerResult;
      import com.iflytek.cloud.SpeechConstant;
      import com.iflytek.cloud.SpeechError;
      import com.iflytek.cloud.SpeechRecognizer;
      import com.iflytek.cloud.SpeechUtility;
      import com.unity3d.player.UnityPlayer;
      import com.unity3d.player.UnityPlayerActivity;
      
      import org.json.JSONException;
      import org.json.JSONObject;
      
      import java.util.HashMap;
      import java.util.LinkedHashMap;
      
      public class MainActivity extends UnityPlayerActivity {
          private SpeechRecognizer mIat;
          // 用HashMap存儲聽寫結果
          private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              // setContentView(R.layout.activity_main);
      
              // 初始化引擎,APPID在訊飛控制臺的應用那。
              SpeechUtility.createUtility(this, SpeechConstant.APPID + "=5adca626");
              // 創建語音識別對象(cloud包下的),Iat是訊飛語音聽寫的簡寫。第二參數是成功或失敗的監聽器,這里簡單傳空。
              mIat = SpeechRecognizer.createRecognizer(this, null);
              // 設置參數
              mIat.setParameter(SpeechConstant.DOMAIN, "iat");      // 服務類型,語音聽寫
              mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");  // 語言是中文
              mIat.setParameter(SpeechConstant.ACCENT, "mandarin"); // 口音是普通話
              mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); // 引擎類型,云端引擎
          }
      
          // 監聽器
          private RecognizerListener mRecognizer = new RecognizerListener() {
              @Override
              public void onVolumeChanged(int i, byte[] bytes) {
      
              }
      
              @Override
              public void onBeginOfSpeech() {
      
              }
      
              @Override
              public void onEndOfSpeech() {
      
              }
      
              @Override
              public void onResult(RecognizerResult recognizerResult, boolean b) {
                  printResult(recognizerResult);
              }
      
              @Override
              public void onError(SpeechError speechError) {
      
              }
      
              @Override
              public void onEvent(int i, int i1, int i2, Bundle bundle) {
      
              }
          };
      
          /**
           * 給Unity調用的,開始監聽。
           */
          public void startListen(){
              mIat.startListening(mRecognizer);
          }
      
          /**
           * 打印輸出結果。該方法從latDemo中復制的。
           * JsonParser工具類從speechDemo/java/com.iflytek/speech/util/JsonParser.java復制到xunfeilibrary/java/包名/下。
           * @param results
           */
          private void printResult(RecognizerResult results) {
              String text = JsonParser.parseIatResult(results.getResultString());
      
              String sn = null;
              // 讀取json結果中的sn字段
              try {
                  JSONObject resultJson = new JSONObject(results.getResultString());
                  sn = resultJson.optString("sn");
              } catch (JSONException e) {
                  e.printStackTrace();
              }
      
              mIatResults.put(sn, text);
      
              StringBuffer resultBuffer = new StringBuffer();
              for (String key : mIatResults.keySet()) {
                  resultBuffer.append(mIatResults.get(key));
              }
      
              /**
               * 把最終結果給Unity展示。安卓調用Unity
               * 參數一:Unity場景中的GameObject名。
               * 參數二:物體身上任一腳本中的指定方法。
               * 參數三:調用該方法的傳參。
               */
              UnityPlayer.UnitySendMessage("XunfeiManager", "OnResult", resultBuffer.toString());
          }
      }

      11、AS切換Project視圖,選中xunfeilibrary,菜單項Build—Make Modelu "xunfeilibrary",把xunfeilibrary/build/outputs/arr/xunfeilibrary-debug.arr包復制到桌面。從桌面打開aar包,把aar/classes.jar移動并同名替換aar/libs/classes.jar(被替換掉的是Unity導入的)。打開aar/AndroidManifest.xml清單,去掉android:label。再把xunfeilibrary/build/intermediates/manifests/full/debug/AndroidManifest.xml清單復制到桌面(這是項目的總的清單)。桌面打開清單,修改包名如package="me.guxin.xunfeidemo"(必須全部小寫)。這樣就準備好了給Unity用的aar包和清單文件。

      12、打開Unity,新建項目UnityXunfeiDemo,新建文件夾Plugins/Android,把上一步得到的aar包和安卓清單復制到該文件夾下。新建一個Text用于顯示語音輸入結果(取消Text的射線檢測Raycast Target),新建一個Button點擊開始語音輸入。新建一個GameObject取名XunfeiManager(名字要與安卓Java代碼中規定的一致),新建C#腳本XunfeiManager掛到物體XunfeiManager身上。項目結構如下圖。

      13、編寫XunfeiManager腳本如下。

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      using UnityEngine.UI;
      
      public class XunfeiManager : MonoBehaviour
      {
          public Text resultText;
          private AndroidJavaObject currentActivity;
      
          private void Start()
          {
              currentActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
          }
      
          /// <summary>
          /// 點擊按鈕,開始語音輸入
          /// </summary>
          public void OnClick()
          {
              currentActivity.Call("startListen");
          }
      
          /// <summary>
          /// 方法名要與安卓Java代碼中規定的一致
          /// </summary>
          public void OnResult(string s)
          {
              resultText.text = s;
          }
      }

      14、打開Unity的Build Settings,切換平臺為Android。打開Player Settings設置包名如me.guxin.xunfeidemo(跟桌面的安卓清單中的一致),設置自己的簽名密鑰。發布項目到桌面UnityXunfeiDemo.apk,安裝到真機上即可。


      學習資料:

      http://www.sikiedu.com/course/135

      總結

      以上是生活随笔為你收集整理的【Unity】讯飞语音识别SDK的全部內容,希望文章能夠幫你解決所遇到的問題。

      如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。