Unity调用讯飞做语音听写(Android Studio版)

莫问天涯路几重,轻衫侧帽且从容。这篇文章主要讲述Unity调用讯飞做语音听写(Android Studio版)相关的知识,希望能为你提供帮助。
以前做过一年android开发,一直用的是Eclipse,但是AS是主流了,顺手学一波AS,然后发现很多都不会操作了。整理一下昨天一天的工作成果,也算是抛砖引玉。
先去讯飞开放平台注册帐号,然后去控制台创建应用,添加需要的服务,然后把SDK下载。这个流程一句话带过,应该看这篇文章的没人不会。
说一说怎么在AS里面使用讯飞和打包成AAR吧。
1.创建一个项目 

Unity调用讯飞做语音听写(Android Studio版)

文章图片

Unity调用讯飞做语音听写(Android Studio版)

文章图片

Unity调用讯飞做语音听写(Android Studio版)

文章图片

*因为用不到布局文件,所以没必要生成。
 
2.添加一个库
Unity调用讯飞做语音听写(Android Studio版)

文章图片

Unity调用讯飞做语音听写(Android Studio版)

文章图片

Unity调用讯飞做语音听写(Android Studio版)

文章图片

Unity调用讯飞做语音听写(Android Studio版)

文章图片

3.添加相关的库文件
Unity调用讯飞做语音听写(Android Studio版)

文章图片

在这个位置找到Unity的Classes.jar,注意绿框里的信息,如果你的Unity使用的是MONO框架就用这个,如果是IL2CPP的话,就是下图
Unity调用讯飞做语音听写(Android Studio版)

文章图片

 
然后找到刚才下载的SDK,找libs下的这两个文件
Unity调用讯飞做语音听写(Android Studio版)

文章图片

*rmeabi-v7a是根据安装的机器来做适配的,你可以自行使用libs下的其它库
Unity调用讯飞做语音听写(Android Studio版)

文章图片

将以上三个文件Copy到flytek4unity/libs下
Unity调用讯飞做语音听写(Android Studio版)

文章图片

Unity调用讯飞做语音听写(Android Studio版)

文章图片

 
给MSC.jar和classes.jar以库文件的形式添加到新增的模块,非app。如果右键菜单不显示这个项,我们可以在flytek4unity右键
Unity调用讯飞做语音听写(Android Studio版)

文章图片

 
Unity调用讯飞做语音听写(Android Studio版)

文章图片

Unity调用讯飞做语音听写(Android Studio版)

文章图片

选择未能添加的库依赖。
 
  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压缩包找找
Unity调用讯飞做语音听写(Android Studio版)

文章图片

*注意看红框的路径
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
Unity调用讯飞做语音听写(Android Studio版)

文章图片

 
Make一下Module,aar就生成了
Unity调用讯飞做语音听写(Android Studio版)

文章图片

将这个aar和这个模块下的androidmanifest.xml导入Unity,记住,一定是刚刚修改的这个模块下的androidmanifest,不是app的
Unity调用讯飞做语音听写(Android Studio版)

文章图片

 
Unity中的结构图。
6.Unity中的编码
Unity调用讯飞做语音听写(Android Studio版)

文章图片

创建一个iFlyTek的空物体,和MainActivity中的
Unity调用讯飞做语音听写(Android Studio版)

文章图片
相对应。
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() { StartButton.GetComponentInChildren< Text> ().text = "已结束,点击聆听"; StartButton.interactable = true; }public void OnBeginOfSpeech() { StartButton.GetComponentInChildren< Text> ().text = "聆听ing"; StartButton.interactable = false; } }

创建一个脚本,挂在iFlyTek下,里面很多方法是作为callback存在的,具体看MainActivity
然后在场景创建一个Button和Text,用来触发听写和接收听写结果。
 
7.发布
Unity调用讯飞做语音听写(Android Studio版)

文章图片

 
这些都要能匹配的上,Unity的包名和导入的manifest文件报名一致,最小API支持等级得一致,classes.jar用mono还是IL2CPP得和Script Backend一致
 
  大功告成。不发真机截图了,麻烦。
【Unity调用讯飞做语音听写(Android Studio版)】 

    推荐阅读