看到去年自己的一篇博客,很乱,觉得有必要整理一下啊(虽然内容没怎么变吧,之前的随便写写只显示了一小半,这次把所有的都给显示出来的,不对的地方欢迎指正)~~~去年公司要在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 导出安卓工程
这个时候我们会发现导出的工程里的lib文件夹下有一个unity-classes.jar 这就是我们需要的classes文件了。
2.创建安卓工程,配置jar包
在创建之前我们需要找到两个东西
(1)用eclipse打开讯飞语音demo中的SpeechDemo
我的是4.2.2.记下来,接下来
找到你的SDK安装的API版本,上面的是6.0,继续我们的创建
名字随便起,最好规范些,下面的按我们前面找到的设置,然后下一步,下一步,一直到
这个最好创建空的,一会儿我们好改,不是空的也可以
X:\Android_voice_1098_576a54ca\sample\SpeechDemo\src\com\iflytek\speech\util下有一个JsonParse的java文件复制到我们的src下的包中就像这样
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工程
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文件及注意事项
要特别注意图中的红色字提示。完了导出来就可以用了,unity脚本要是测试的话需要调用一下,我这边就不测试了,公司实际用了,我确实是调用成功了,纯属自己摸索出来的,由于不是做安卓的,有些步骤或许有些多余,欢迎指正