unity 接入讯飞语音听写的SDK

获取讯飞语音听写的APPID

讯飞开放平台的网址:https://www.xfyun.cn/
进入讯飞开放平台注册登录后,创建应用,取得所需的APPID
然后找到对应的语音听写的SDK进行下载,我下载后的文件夹名称是Android_iat1140_5e70aa24

测试下讯飞自带的SDK效果

我们先AndroidStudio创建一个新Empty Activity的工程。然后导入前面下载的SDK里面的speechDemo。
在这里插入图片描述
如果遇到这种情况我们可以修改为我们现有的平台即可。在Project视图下打开speechDemo->build.gradle

(1)把compileSdkVersion 23 修改为27(注:我有27的平台,根据自己的SDK平台修改)

(2)把buildToolsVersion ‘26.0.2’ 删除(好像也可以不删,不清楚)

(3)把minSdkVersion 9 修改为19(尽量要改成16以上)

(4)把targetSdkVersion 23 修改为自己的27

(5)把compile ’ com.android.support:support-v4:23.+'中的23改为27

(6)这些都修改完成之后点击Try Again

等编译完成后我们可以先Run->Run ‘speechDemo’ (手机要打开USB调试),先在手机上运行一下自带的Demo。
如果不能识别的话,也可以在Android Studio上创建AVD,就是手机的模拟器,也可以运行自带的Demo。
或者还可以在Android Studio上打包apk,然后自己通过qq或者其他方法将apk发送到手机进行安装运行。

创建供Unity使用的SDK库(Android Studio中的操作)

File->New->New Module…创建一个模块(名称随意),选择Android Library,我取名为xflibrary。

找到自己下载的SDK的Android_iat1140_5e70aa24\libs/Msc.jar和unity安装目录下的D:\unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes/classes.jar
按住ctrl将这两个资源复制进Android studio工程中的xflibrary/libs下,然后选中这两个文件,右键选择Add As Library…,等待编译,可以选中xflibrary,右键点击Open Module Settings,点击Dependencies看看是否将这两个文件添加上了,如果没有添加上或者只添加了一个,那么我们可以点击加号选择Jar Dependency,将所需要的添加上去。

然后在xflibrary/src/main下新建一个文件夹,取名为jniLibs,然后将Android_iat1140_5e70aa24\libs下的armeabi-v7a文件拷贝到刚刚新建的文件夹下。

然后回到Android,在xflibrary/java/com.guanhui.xiaolin.xflibrary下右键New–>Activity–>Empty Activity,然后点击Finish。将xflibrary/res/layout下的.xml文件删除掉,然后将打开的
MainActivity.java下的setContentView(R.layout.activity_main);删掉,将AppCompatActivity改为UnityPlayerActivity,将import android.support.v7.app.AppCompatActivity;也删掉。

接下来就是修改xflibrary下的manifests下的AndroidManifest.xml,将app/mainfests/AndroidManifest.xml的<application和</ application>包裹的内容复制到刚刚要修改的AndroidManifest.xml里,也就是将那个标签里的内容替换掉,替换之后,将爆红的内容删掉,然后在下面加一句<meta-data

android:name=“unityplayer.UnityActivity” android:value=“true” />,将

speechDemo/mainfests/AndroidManifest.xml里的前面的<uses-permission的内容都复制到

xflibrary//mainfests/AndroidManifest.xml的相同位置。到了这里就配置完成了。

回到MainActivity.java,在里面添加代码,如下:

package com.guanhui.xiaolin.xflibrary;

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 {

    // 用HashMap存储听写结果
    private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
    private SpeechRecognizer mIat;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SpeechUtility.createUtility(this,SpeechConstant.APPID+"=APPID");
        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 RecoListener=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) {

        }
    };

    public void startListen()//这个方法供unity调用
    {
        mIat.startListening(RecoListener);
    }

    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中名为XfManager的物体身上的OnResult方法,resultBuffer是解析出来的最终返回的结果
UnityPlayer.UnitySendMessage("XfManager","OnResult",resultBuffer.toString());
    }
}

需要注意的是,上面代码中 SpeechUtility.createUtility(this,SpeechConstant.APPID+"=APPID");将APPID改为你自己的APPID,注意双引号里面的=不要删

需要将speechDemo/java/com.iflytek/speech/util下的jsonParser文件复制到
xflibrary/java/com.guanhui.xiaolin.xflibrary目录下,也就是和MainActivity的相同目录下。然后选中xflibrary,点击菜单栏的Build–>Make Module’xflibrary’,make完成后,在Project下,
xflibrary/build/outputs/aar点击show in Explorer,将xflibrary-debug.aar复制到桌面上。

【旧版的unity要这样做,应该是2017以下的版本吧,没测试过】
(用压缩软件打开这个aar包,将libs里面的classes.jar删除,然后返回上一级,将classes.jar拖到桌面,再将它拖进libs的目录下,再返回上一级,将classes.jar删除。整个过程就相当于将外面的classes.jar替换掉libs里面的classes.jar文件。)

【我用的2018的版本,较新版本一点的这样做】
(用压缩软件打开这个aar包,将libs里面的classes.jar删除)

回到android studio的Project下,
xflibrary/intermediates/merged_manifests/debug/processDebugManifest/AndroidManifest.xml目录下,将AndroidManifest.xml复制到桌面,那么现在桌面就有AndroidManifest.xml和xflibrary-debug.aar了。

打开AndroidManifest.xml,将package="com.guanhui.xiaolin.xflibrary"中的xflibrary改为xftest,名字随便起,但是发布的时候unity的包名也跟着一样。

Unity中的操作(完成语音识别SDK接入)

在unity中新建目录Plugins/Android

将桌面的AndroidManifest.xml和xflibrary-debug.aar拖入到Plugins/Android中

在unity中设置好Android平台,新建一个Text和Button,放到合适的位置,点击Button后,语音识别的内容显示在Text中的,新建一个空物体,名为XfManager,再新建一个同名脚本挂载上去。

打开XfManager.cs,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class XfManager : MonoBehaviour
{
    public Text resultText;
    private AndroidJavaObject currentActivity;
    void Start()
    {
        currentActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
    }

    public void OnClick()
    {
        currentActivity.Call("startListen");
    }

    public void OnResult(string s)
    {
        resultText.text = s;
    }
}

在unity中指定好resultText,还有绑定好Button的事件OnClick()

设置好包名之后就可以打包了,打包完成之后可以在手机上使用语音听写功能了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值