Unity 接讯飞语音SDK

在上班时间一边接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);

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值