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.点控制台进入后台应用

    unity接入原生讯飞听写sdk

    3.首先创建一个Android的应用,提交


    unity接入原生讯飞听写sdk


    记下appid,后面会用到

    

    在下面添加新服务(我这里添加的是语音听写服务)


    下载sdk并解压

    unity接入原生讯飞听写sdk


四、官方语音听写demo导入Android Studio 中


    1.打开Android studio新建一个新Android项目并增加一个Empty Activity。

    2.导入解压包里面的官方案例(以导入一个Module的方式导入)注释:这里导入官方的demo主要是方便后面的开发与展示。

    unity接入原生讯飞听写sdk

    3.导入之后,项目改成Project模式,找到build.grade打开,如果报错可以把buildToolsVersion '25.0.2'删除

unity接入原生讯飞听写sdk


4.用真机连接到电脑上,用Android studio打包到手机上(如果Android studio上连接不到手机的话,可能是你的电脑上没有安装Google的usb驱动),打包到手机上后官方的demo可以正常识别语音。

unity接入原生讯飞听写sdk


五、语音听写sdk接入到Android Studio中

    1.在上个项目里面新建一个Module

unity接入原生讯飞听写sdk


选择Android Library


2.把unity中的Android库文件拿过来放到新建的libs文件夹下,并增加为库文件


unity下的文件在unity接入原生讯飞听写sdk


把上面的文件复制粘贴到下面这个位置并右键增加为库文件

unity接入原生讯飞听写sdk



3.把下载的语音听写的Msc.jar包拿过来同样放在Android里面的libs文件夹下面

    并右键增加作为库文件


unity接入原生讯飞听写sdk


unity接入原生讯飞听写sdk



4.新建一个文件夹,在这个文件夹下面放入sdk里面的.so文件


unity接入原生讯飞听写sdk


需要把下面两个文件放入jniLibs文件中


unity接入原生讯飞听写sdk



5.为这个新建的Android Library新建一个空的Activity


unity接入原生讯飞听写sdk



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 后面改为UnityPlayerActivityunity接入原生讯飞听写sdk






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;
    }
}