帖子

【官网】unity工程中调用语音SDK

 关闭 [复制链接]

该用户从未签到

1651017 jlyan 发表于 2014-4-16 16:01:12 1#
本帖最后由 xugao2@iflytek. 于 2015-5-8 22:08 编辑

在unity中使用语音SDK,简要流程如下:1,在eclipse中创建android工程,编写activity;
2,将eclipse中的类发车jar包;
3,将jar包放入unity工程中,在unity中为摄像机编写关联脚本;
4,build工程。
笔者主要参考该博客的内容(http://www.xuanyusong.com/archives/667),另加上语音SDK,写成该demo。该demo使用的是android平台的语音SDK,版本是1048版本

该demo具体代码可见楼下。

1,在eclipse中创建android工程,编写activity:
在eclipse中创建新的android工程IflytekDemo,activity名称是UnityTestActivity;将讯飞官网上下载的SDK中的msc.jar和libmsc.so放入工程中;
将unity安装路径下的Unity\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar导入到工程中;
改写UnityTestActivit,改成如下
package com.xys;   

import android.content.Context;   
import android.content.Intent;   
import android.os.Bundle;   
import android.util.Log;
import android.widget.Toast;

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.SpeechListener;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.SpeechUtility;
import com.unity3d.player.UnityPlayerActivity;   

public class UnityTestActivity extends UnityPlayerActivity {   
    /** Called when the activity is first created. */   

    Context mContext = null;  
    public SpeechRecognizer mspeech;
    @Override   
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        mContext = this;   
//改成你自己的
        SpeechUtility.createUtility(this, "appid=xxxxxxxx");
    }   

    public void StartActivity0()   
    {   
            Log.d("jlyan", "createRecognizer");
            mspeech=SpeechRecognizer.createRecognizer(this, mInitListener);
        Toast.makeText(mContext, "createRecognizer", Toast.LENGTH_SHORT).show();
    }   

    public void StartActivity1()
    {   
            
            Log.d("jlyan", "start recog");
            mspeech.setParameter(SpeechConstant.DOMAIN, "iat");
            mspeech.setParameter(SpeechConstant.SAMPLE_RATE, "16000");
            mspeech.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
            int ret=mspeech.startListening(recognizerListener);
            Toast.makeText(mContext, "startListening ret:"+ret, Toast.LENGTH_SHORT).show();
    }   


    public RecognizerListener recognizerListener = new RecognizerListener(){

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

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

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


                @Override
                public void onResult(RecognizerResult arg0, boolean arg1) {
                        // TODO Auto-generated method stub
                        Log.d("jlyan", "result:"+arg0.getResultString());
                        Toast.makeText(mContext, "result:"+arg0.getResultString(), Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onVolumeChanged(int arg0) {
                        // TODO Auto-generated method stub
                        
                }

                @Override
                public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
                        // TODO Auto-generated method stub
                        
                }
            
    };

    private InitListener mInitListener = new InitListener() {

                @Override
                public void onInit(int code) {
                        if (code==0)
                        {
                                Log.d("jlyan", "login");
                                Toast.makeText(mContext, "login", Toast.LENGTH_SHORT).show();
                        }
                        else
                        {
                                Log.d("jlyan", "login error"+code);
                                Toast.makeText(mContext, "login error"+code, Toast.LENGTH_SHORT).show();
                        }
                }
        };

}

更改AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xys"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="14" />

    <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" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.xys.UnityTestActivity"
            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>





findsun@163.com 发表于 2015-3-18 17:41:28
推荐
有没有 不是安卓用的demo  直接PC用的unityDemo
使用道具 举报 回复
霜浅 发表于 2015-8-1 11:26:20
推荐
楼主请问一下~讯飞能不能做WEB端的Unity语音识别?如果可以的话,思路大致是怎么样的?谢谢楼主!
使用道具 举报 回复
 楼主| jlyan 发表于 2014-4-16 16:11:50
4#
2,将eclipse中的类打成jar包:
打开工程的目录,进入bin文件夹下面的classes文件夹,在命令行中运行jar -cvf class.jar *
unity1.png
使用道具 举报 回复
qschen 发表于 2014-4-16 16:22:05
5#
游戏开发者的福利来啦~
使用道具 举报 回复
longcheng 发表于 2014-4-16 17:07:58
6#
好人一生平安
使用道具 举报 回复
 楼主| jlyan 发表于 2014-4-16 17:18:20
7#
3,将jar包放入unity工程中,在unity中卫摄像机编写关联脚本:
在unity中创建一个新工程创建Plugiins、Android、bin、libs文件夹,将之前打好的class.jar放到bin文件夹下,将libmsc.so和msc.jar放入libs文件夹下,将eclipse工程中的res文件夹整个放到Android文件夹下,将AndroidManifest.xml放到Android文件夹下;
创建Test脚本,编写如下:
using UnityEngine;   
using System.Collections;   

public class Test : MonoBehaviour   
{   
       
        // Update is called once per frame   
        void Update ()   
        {   
                //当用户按下手机的返回键或home键退出游戏   
                if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home) )   
                {   
                        Application.Quit();   
                }   
        }   
       
        void OnGUI()   
        {   
                if(GUILayout.Button("login",GUILayout.Height(100)))   
                {   
                        //注释1   
                        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");   
                        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");   
                        jo.Call("StartActivity0");   
                }   
                if(GUILayout.Button("startRecognizer",GUILayout.Height(100)))   
                {   
                        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");   
                        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");   
                        jo.Call("StartActivity1");   
                }   
        }   
       
}  


unity2.png
并将这个脚本绑定到场景中的摄像机中。
使用道具 举报 回复
edzhu 发表于 2014-4-16 20:30:15
8#
你可以转开发了~~
使用道具 举报 回复
 楼主| jlyan 发表于 2014-4-17 15:13:43
9#
本帖最后由 jlyan 于 2014-11-4 17:09 编辑

4、在unity中build工程:
最后build工程很简单,在unity左上角点击file-》Build Settings,选择成android应用,然后点击Player Settings,将Identification更改成你eclipse中的工程一样的包名,然后点击Build,就可以产生apk文件了,然后直接安装在手机上测试一下吧!
运行结果通过logcat打印出来,运行截图见下图

demo工程已经上传到百度网盘
构建class.jar的工程:链接: http://pan.baidu.com/s/1hqmqIgs 密码: 6pj0
unity工程:链接: http://pan.baidu.com/s/1qWK6wDe 密码: 6da6 QQ截图20141****70922.png
unity3.png
使用道具 举报 回复
╰つ 不再年 发表于 2014-7-29 12:50:15
10#
C:\Users\Administrator\Desktop\QQ截图20140****25108
使用道具 举报 回复
╰つ 不再年 发表于 2014-7-29 12:50:49
11#
总是出错
QQ截图20140729125108.png
使用道具 举报 回复
 楼主| jlyan 发表于 2014-7-29 14:40:39
12#

这个是登录设置appid,之前版本的SDK,现在最新版本的使用SpeechUtility.createUtility()来设置appid,不使用SpeechUser.getUser().login()了。
使用道具 举报 回复