Unity調用訊飛做聽寫(Android Studio版)

來源:互聯網
上載者:User

標籤:import   abi   hang   res   todo   top   apk   esc   json   

以前做過一年Android開發,一直用的是Eclipse,但是AS是主流了,順手學一波AS,然後發現很多都不會操作了。整理一下昨天一天的工作成果,也算是拋磚引玉。

先去訊飛開放平台註冊帳號,然後去控制台建立應用,添加需要的服務,然後把SDK下載。這個流程一句話帶過,應該看這篇文章的沒人不會。

說一說怎麼在AS裡面使用訊飛和打包成AAR吧。

1.建立一個項目 

*因為用不到布局檔案,所以沒必要產生。

 

2.添加一個庫

3.添加相關的庫檔案

在這個位置找到Unity的Classes.jar,注意綠框裡的資訊,如果你的Unity使用的是MONO架構就用這個,如果是IL2CPP的話,就是

 

然後找到剛才下載的SDK,找libs下的這兩個檔案

*rmeabi-v7a是根據安裝的機器來做適配的,你可以自行使用libs下的其它庫

將以上三個檔案Copy到flytek4unity/libs下

 

給MSC.jar和classes.jar以庫檔案的形式添加到新增的模組,非app。如果右鍵菜單不顯示這個項,我們可以在flytek4unity右鍵

 

選擇未能添加的庫依賴。

 

 3.編碼

package cn.egstudio.flytek4unity;import com.iflytek.cloud.InitListener;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 android.app.Activity;import android.os.Bundle;import android.speech.RecognitionListener;import android.view.Menu;import android.view.MenuItem;public class MainActivity extends UnityPlayerActivity {    SpeechRecognizer mIAT;    String voiceResult = "";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        SpeechUtility.createUtility(this, SpeechConstant.APPID + "=59eea647");        mIAT = SpeechRecognizer.createRecognizer(this, mInitListener);    }        public void StartListening() {        mIAT.setParameter(SpeechConstant.DOMAIN,"iat");        mIAT.setParameter(SpeechConstant.LANGUAGE,"en_us");        mIAT.setParameter(SpeechConstant.KEY_SPEECH_TIMEOUT,"4000");        mIAT.setParameter(SpeechConstant.VAD_EOS,"2000");        mIAT.setParameter(SpeechConstant.ASR_PTT,"0");        int ret = mIAT.startListening(recognizerListener);        UnityPlayer.UnitySendMessage("iFlyTek", "OnStartListening", String.valueOf(ret));    }         private InitListener mInitListener = new InitListener() {                @Override        public void onInit(int arg0) {            UnityPlayer.UnitySendMessage("iFlyTek", "OnStartListening", String.valueOf(arg0));        }    };          private RecognizerListener recognizerListener = new RecognizerListener() {                @Override        public void onVolumeChanged(int arg0, byte[] arg1) {            // TODO Auto-generated method stub                    }                @Override        public void onResult(RecognizerResult arg0, boolean arg1) {            voiceResult += JsonParser.parseIatResult(arg0.getResultString());            if(arg1){                UnityPlayer.UnitySendMessage("iFlyTek", "OnResult", voiceResult);                voiceResult = "";                mIAT.stopListening();            }        }                @Override        public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {            // TODO Auto-generated method stub                    }                @Override        public void onError(SpeechError arg0) {            UnityPlayer.UnitySendMessage("iFlyTek", "OnError", arg0.getErrorDescription());        }                @Override        public void onEndOfSpeech() {            UnityPlayer.UnitySendMessage("iFlyTek", "OnEndOfSpeech","");        }                @Override        public void onBeginOfSpeech() {            UnityPlayer.UnitySendMessage("iFlyTek", "OnBeginOfSpeech","");        }    };}

在src/main/java下建立一個java類,寫上如上代碼,重點是APPID,後面的字串填上訊飛開放平台你申請的應用ID,然後就是StartListening方法中系列參數,這個歡迎去訊飛官網找資料,不詳細講。

 然後你會遇到JsonParser沒有的問題,這個請在下載訊飛SDK壓縮包找找

*注意看紅框的路徑

4.修改Manifest

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="cn.egstudio.flytek4unity"    android:versionCode="1"    android:versionName="1.0" >    <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-sdk        android:minSdkVersion="19"        android:targetSdkVersion="23" />    <application        android:allowBackup="true"        android:label="@string/app_name">        <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>

*添加許可權,修改啟動Activity(這個需不需要我沒測試,之前在Eclipse的時候,因為匯出jar和AS匯出AAR不一樣,直接導了之前的資訊清單檔)

5.產生AAR

 

Make一下Module,aar就產生了

將這個aar和這個模組下的androidmanifest.xml匯入Unity,記住,一定是剛剛修改的這個模組下的androidmanifest,不是app的

 

Unity中的結構圖。

6.Unity中的編碼

建立一個iFlyTek的空物體,和MainActivity中的相對應。

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class iFlyTek : MonoBehaviour {    private AndroidJavaClass ajc;    private AndroidJavaObject ajo;    public Button StartButton;    public Text ResultText;    private void Start() {        ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");        ajo = ajc.GetStatic<AndroidJavaObject>("currentActivity");        if (StartButton) {            StartButton.onClick.AddListener(() => { StartListening(); });        }    }    public void StartListening() {        ajo.Call("StartListening");    }    public void OnStartListening(string ret) {        int result = int.Parse(ret);        StartButton.interactable = result == 0;    }    public void OnResult(string result) {        ResultText.text = result;    }    public void OnError(string errorMessage) {        ResultText.text = errorMessage;    }    public void OnEndOfSpeech(string empty) {        StartButton.GetComponentInChildren<Text>().text = "已結束,點擊聆聽";        StartButton.interactable = true;    }    public void OnBeginOfSpeech(string empty) {        StartButton.GetComponentInChildren<Text>().text = "聆聽ing";        StartButton.interactable = false;    }}

建立一個指令碼,掛在iFlyTek下,裡面很多方法是作為callback存在的,具體看MainActivity

然後在情境建立一個Button和Text,用來觸發聽寫和接收聽寫結果。

 

7.發布

 

這些都要能匹配的上,Unity的包名和匯入的manifest檔案報名一致,最小API支援等級得一致,classes.jar用mono還是IL2CPP得和Script Backend一致

 

 大功告成。不發真機了,麻煩。

 

Unity調用訊飛做聽寫(Android Studio版)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.