unity接入原生讯飞听写sdk
unity接入讯飞语音听写sdk
一、开发使用的工具
1.Android Studio 3.0.1
2.unity2017.3.0f1
3.讯飞语音听写sdk
二、开发前准备
1.配置稍微高的电脑一台
2.讯飞开发者账号注册(http://www.xfyun.cn/)
3.下载讯飞的语音听写sdk
4.安装unity2017.3.0.f1(本次调试用的版本)
5.安装Android Studio3.0.1(本次调试用的版本)
6.JDK的安装与环境变量配置
7.Android sdk的安装与配置
三、在官网下载语音听写sdk
官网地址是:http://www.xfyun.cn/
1.进入官网,登陆自己的账号
2.点控制台进入后台应用
3.首先创建一个Android的应用,提交
记下appid,后面会用到
在下面添加新服务(我这里添加的是语音听写服务)
下载sdk并解压
四、官方语音听写demo导入Android Studio 中
1.打开Android studio新建一个新Android项目并增加一个Empty Activity。
2.导入解压包里面的官方案例(以导入一个Module的方式导入)注释:这里导入官方的demo主要是方便后面的开发与展示。
3.导入之后,项目改成Project模式,找到build.grade打开,如果报错可以把buildToolsVersion '25.0.2'删除
4.用真机连接到电脑上,用Android studio打包到手机上(如果Android studio上连接不到手机的话,可能是你的电脑上没有安装Google的usb驱动),打包到手机上后官方的demo可以正常识别语音。
五、语音听写sdk接入到Android Studio中
1.在上个项目里面新建一个Module
选择Android Library
2.把unity中的Android库文件拿过来放到新建的libs文件夹下,并增加为库文件
unity下的文件在
把上面的文件复制粘贴到下面这个位置并右键增加为库文件
3.把下载的语音听写的Msc.jar包拿过来同样放在Android里面的libs文件夹下面
并右键增加作为库文件
4.新建一个文件夹,在这个文件夹下面放入sdk里面的.so文件
需要把下面两个文件放入jniLibs文件中
5.为这个新建的Android Library新建一个空的Activity
6.下面修改AndroidManifest.xml
修改为
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.vtr.lidongtao.vtrdemo"> <application android:allowBackup="true" android:label="vtrdemo" 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> </activity> <meta-data android:name="unityplayer.UnityActivity" android:value="true"/> </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>
7.修改MainActivity,extends 后面改为UnityPlayerActivity
android里面的代码:
package com.vtr.lidongtao.vtrdemo; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechError; import com.iflytek.cloud.SpeechRecognizer; import com.iflytek.cloud.SpeechUtility; import com.iflytek.speech.RecognizerListener; import com.iflytek.speech.RecognizerResult; 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; private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SpeechUtility.createUtility(this, SpeechConstant.APPID+"=5ab4aa16"); 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); } public void startListener() { mIat.startListening(mRecoListener); } private com.iflytek.cloud.RecognizerListener mRecoListener=new com.iflytek.cloud.RecognizerListener() { @Override public void onVolumeChanged(int i, byte[] bytes) { } @Override public void onBeginOfSpeech() { } @Override public void onEndOfSpeech() { } @Override public void onResult(com.iflytek.cloud.RecognizerResult recognizerResult, boolean b) { printResult(recognizerResult); } @Override public void onError(SpeechError speechError) { } @Override public void onEvent(int i, int i1, int i2, Bundle bundle) { } }; private void printResult(com.iflytek.cloud.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)); } UnityPlayer.UnitySendMessage("Manager","Result",resultBuffer.toString()); } }
导出aar包放入unity中,修改包名
unity里面的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Manager : MonoBehaviour {
public Text t;
public Text t2;
private AndroidJavaObject jo;
void Start () {
jo = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
}
public void OnClick()
{
//jo = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("startListener");
t2.text += "2";
}
//android 向unity 发送消息
public void Result(string s)
{
t.text += s;
}
}