Unity 接讯飞语音SDK

来源:互联网 发布:手机上c语言编程软件 编辑:程序博客网 时间:2024/05/16 00:31

在上班时间一边接sdk ,一边总结接入语音sdk中出现的一些问题。拿来和大家分享一下, 不会写得很详细。

官方的sdk例子值得了解,并可以解决很多问题。 

我在这里例举出几个自己犯下的错误 跟大家一起分享。 

1.报单例创建失败的问题,参考 http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=9688

2.AndoridJavaException: android.view.ViewRootImpl$CalledFromWrongThreadException :only the original thread that created a view hiearchy can touch its views.错误,

主要是在非UI层调用,如何解决。将内容写在 runOnUiThread 里可以解决问题,实际上的问题 :http://blog.csdn.net/vivianyouyi/article/details/51781141 ,我的问题是将Toast在Unity 调用的方法里直接调用。

3.导入jar包到Unity 里面的, build 之后运行发现报错说找不到引用,  要去看一下 讯飞的libs库是否导入到了Unity 的lib 库中(不能连文件夹一起拷,会有问题),讯飞Demo下有一个JsonParser 需要导入到Eclipse工程目录下,

4. 压缩问题, 因为讯飞支持的语音格式为wav 和pcm ,要支持语音发送的话得先压缩 ,我这里将pcm 格式转换为amr格式,你会发现还需要引用一个文件AmrInputStream,但是找不到这个文件,其实是有的,去sdk 目录全局搜索, 然后把文件找到了放到工程中 ,不能修改AmrInputStream的包名。

public byte[] pcm2amr()throws IOException   {InputStream inStream = new FileInputStream("/msc/mAudio.pcm");    AmrInputStream aStream = new AmrInputStream(inStream);    File file = new File("/msc/mAudio1"  + ".amr");    file.createNewFile();    OutputStream out = new FileOutputStream(file);     byte[] x = new byte[1024];     out.write(35);out.write(33);out.write(65);out.write(77);out.write(82);out.write(10);    int len;    while ((len = aStream.read(x)) > 0)    {    out.write(x, 0, len);    }    out.close();    aStream.close();        /*读取字节流*/    FileInputStream fis = new FileInputStream(file);    ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);    byte[] b = new byte[1024];    int n;    while((n = fis.read(b))!= -1){    bos.write(b,0,n);    }    fis.close();    bos.close();        byte[] buffer = bos.toByteArray();        return buffer;   }


Android向Unity发送信息: UnityPlayer.UnitySendMessage("场景中的物体名", "场景中的物体名上挂在的任意名称Script里面的方法名", "传递内容”);

Unity向Android发送消息:

private AndroidJavaObject _ajo;

#if UNITY_ANDROID && !UNITY_EDITOR
            AndroidJavaClass ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            if (ajc != null)
            {
                _ajo = ajc.GetStatic<AndroidJavaObject>("currentActivity");
            }
#endif

_ajo.Call<返回值>("方法名",params);

本文没有仔细检查或许还有很多问题, 大致犯的错误就这么多,仅供参考。后面再完善吧 。



0 0