Unity5.0后(unity5.3.5)科大讯飞语音识别Unity-Android SDK 的开发

看到去年自己的一篇博客,很乱,觉得有必要整理一下啊(虽然内容没怎么变吧,之前的随便写写只显示了一小半,这次把所有的都给显示出来的,不对的地方欢迎指正)~~~去年公司要在unity5.3.5版本中做语音识别功能,但是我之前并没有过安卓开发经验,就在网上找教程,但是不尽人意,大多都是5.0之前版本的开发,走了不少的弯路。本着可以尽量让别人少走弯路的原则吧。直接开整:

1.找到classes.jar文件

unity安装目录下的D:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer,我们会发现并没有需要的classes可存储位置,Variations/mono和Variations/il2cpp文件夹下有classes文件,但是我们不能使用(虽然我也不知道为什么)。。。我们需要创建一个新的unity工程,勾选Google Android Project 导出安卓工程
Unity5.0后(unity5.3.5)科大讯飞语音识别Unity-Android SDK 的开发_第1张图片

这个时候我们会发现导出的工程里的lib文件夹下有一个unity-classes.jar 这就是我们需要的classes文件了。

2.创建安卓工程,配置jar包

在创建之前我们需要找到两个东西

(1)用eclipse打开讯飞语音demo中的SpeechDemo

这里写图片描述

我的是4.2.2.记下来,接下来

Unity5.0后(unity5.3.5)科大讯飞语音识别Unity-Android SDK 的开发_第2张图片

找到你的SDK安装的API版本,上面的是6.0,继续我们的创建

Unity5.0后(unity5.3.5)科大讯飞语音识别Unity-Android SDK 的开发_第3张图片

名字随便起,最好规范些,下面的按我们前面找到的设置,然后下一步,下一步,一直到

Unity5.0后(unity5.3.5)科大讯飞语音识别Unity-Android SDK 的开发_第4张图片

这个最好创建空的,一会儿我们好改,不是空的也可以
X:\Android_voice_1098_576a54ca\sample\SpeechDemo\src\com\iflytek\speech\util下有一个JsonParse的java文件复制到我们的src下的包中就像这样

Unity5.0后(unity5.3.5)科大讯飞语音识别Unity-Android SDK 的开发_第5张图片

libmsc.so和android-support-v.jar和msc,sunflower都可以在SpeechDemo中找到(在这里找安心方便。)lib下的文件夹命名以从你的unity导出的安卓工程包中的libs文件夹为主

3.Java代码部分

public MainActivity(){  

    instance=this;    

}  
public static MainActivity instance(){  
    if(instance==null){  
        instance=new MainActivity();  
    }  
    return instance;  
}  
public void setContext(Activity act){  
    this.activity=act;  
    if(this.activity!=null){  
        try{  
   //appid是你在讯飞申请的appId  
    SpeechUtility.createUtility(activity, "appid=XXXXXX");  
    mSpeech=SpeechRecognizer.createRecognizer(activity, mInitListener);  
        }  
    catch(Exception e){    
        UnityPlayer.UnitySendMessage("Manager", "Init", "StartActivity0"+e.getMessage());  
    }  
    }else{  

        UnityPlayer.UnitySendMessage("Manager", "Init", "setContext is null");  
    }     
}  

UnitySendMessage是java向unity发送消息的核心部分,Manager指代的是unity工程中必须有一个Manager物体并且物体上绑定的脚本中有Init方法unity才能接收到消息

public void StartActivity1(){  
    //进行语音识别  
    mSpeech.setParameter(SpeechConstant.DOMAIN, "iat");
    mSpeech.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
    mSpeech.setParameter(SpeechConstant.ACCENT, "mandarin");
    mSpeech.setParameter(SpeechConstant.KEY_SPEECH_TIMEOUT,"6000");
    mSpeech.setParameter(SpeechConstant.VAD_EOS,"3000");  
    mSpeech.setParameter(SpeechConstant.ASR_PTT,"0"); 
    mSpeech.startListening(recognizerListener); 
    if(voiceResult!=null||voiceResult!=""){
      voiceResult="";
    }

上面的setParameter()参数具体情况大家可以看一下讯飞给的API里的参数。需要的设置,不需要的删了就行(悠着点)

public RecognizerListener recognizerListener=new RecognizerListener(){  

    @Override  
    public void onBeginOfSpeech() {  
        // TODO Auto-generated method stub  
      Toast.makeText(activity, "start", Toast.LENGTH_SHORT).show();
    }  

    @Override  
    public void onEndOfSpeech() {  
        // TODO Auto-generated method stub  

    }  

    @Override  
    public void onError(SpeechError arg0) {  
        // TODO Auto-generated method stub  
        Log.d(TAG , "error"+arg0.getErrorCode());  
    }  

    @Override  
    public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {  
    }  
    @Override
    public void onResult(RecognizerResult results, boolean isLast)
    {
      Log.d(TAG, "result");
      voiceResult = voiceResult+JsonParser.parseIatResult(results.getResultString());
      if (isLast) 
      {
        //识别完之后,把识别后的结果发送给Unity
        UnityPlayer.UnitySendMessage("Manager", "Result", voiceResult);
      }
      Log.d(TAG,"result="+ JsonParser.parseIatResult(results.getResultString()));
    }
    @Override  
    public void onVolumeChanged(int arg0, byte[] arg1) {  
    }  
}; 
private InitListener mInitListener=new InitListener(){  

    @Override  
    public void onInit(int arg0) {  
        if(arg0==0){  
            Log.d("ss", "loin");  
        }else{  
            Log.d("ss","login error"+arg0);  
        }  

    }  


};  

Java代码到此结束
下面导包,导包前最好先清除一下,eclipse里的clear。

4.配置Unity工程

Unity5.0后(unity5.3.5)科大讯飞语音识别Unity-Android SDK 的开发_第6张图片

bin文件夹里放刚才导的jar包,libs文件夹下放安卓工程中的libs下的除了classes.jar的所有文件,把安卓工程中的res文件夹复制过来

5.C#代码部分

public class Voice : MonoBehaviour
{  
    private string showResult = "";
    private AndroidJavaObject testobj = null;
    private AndroidJavaObject playerActivityContext = null;
    void Start()
    {
        if (testobj == null)
        {
            using (var actClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
            {
            playerActivityContext = actClass.GetStatic("currentActivity");
            }

            using (var pluginClass = new AndroidJavaClass("com.petit.voice_voice.MainActivity"))
            {
                if (pluginClass != null && playerActivityContext != null)
                {
                    testobj = pluginClass.CallStatic("instance");
                    testobj.Call("setContext", playerActivityContext);
                }
            }
        }
    }
    void Update()
    {
        if (showResult == "看电影" || showResult == "看电影儿") 
        {
            SceneManager.LoadScene ("XXX");
        }
    }
    public void StartButton()
    {
        testobj.Call("StartActivity1");
    }
    public void Init(string result)
    {
    }
    public void Result(string result)
    {
        showResult = result;
    }
}

这是unity代码。每次识别时调用一次StartButton方法即可开始语音识别,需要看到结果打出showResult就好了。

6.导出apk文件及注意事项

Unity5.0后(unity5.3.5)科大讯飞语音识别Unity-Android SDK 的开发_第7张图片

要特别注意图中的红色字提示。完了导出来就可以用了,unity脚本要是测试的话需要调用一下,我这边就不测试了,公司实际用了,我确实是调用成功了,纯属自己摸索出来的,由于不是做安卓的,有些步骤或许有些多余,欢迎指正

你可能感兴趣的:(Unity3D-Android,Unity3D)