通过接入百度语音sdk实现语音唤醒功能
上次研究语音唤醒已经不知道是什么时候了,在这里感谢互联网,让基本对安卓完全没基础的小白做到了这个功能 具体的代码实现在下面的这个帖子里可以说是很完整了(大佬可能是忘了还是懒得看,甚至appid啥的忘了打码)
https://blog.csdn.net/weixin_43271060/article/details/108381456
就是这个帖子,把从百度开账号到安卓代码,打aar包,配置文件里面的依赖和unity如何调用都写的一清二楚明明白白 小弟就是单纯的依葫芦画瓢,站在巨人的肩膀上而已,orz.只能说大佬们真的太强了 这里我会说下自己在跟着帖子做的时候的心路历程和过程遇到问题是如何解决的
第一步
在百度智能云里开通账号,在语音技术里创建应用 Tips在创建的时候记得勾选包名 Android以及写上自己的包名 如果你不需要用到语音唤醒那么可以不用加包名,如果要用到的话一定要有包名,这个在上图的右边有写上原因 在实际的操作中我遇到的一个问题就是语音识别没问题,但是语音唤醒死活整不出来,看日志上面显示的是百度的错误码11002,查看官方文档是没有授权文件 也就是上图说的包名是一定要正确的.也就是在百度里设置的包名安卓里aar项目里的包名unity里真机打包出来时设置的包名 只有这三个的包名都是一致的情况下,sdk才会在联网的时候去申请授权文件,唤醒的功能才能算是正式激活 这是个巨坑,我卡在这个地方大概有一个多小时,全靠百度看大佬们的帖子才发现的这个问题,不过大佬们都没有提及到的就是unity里playersetting的包名也是要和百度里设置的一样的,不然就会有问题.为啥我会联想到unity的包名就是因为大佬们的帖子里都在说安卓和百度的包名一致,说明他们的环境不包括unity,但是我的项目就是unity的,所以才会想起来unity里也是需要保持包名一致的 至于为啥上面提供的帖子里没有特别注明,现在想想是因为帖子里有一个关于签名的方法和aar打包的方法,这两个东东大佬是引用了另一个帖子来解决的,在那个帖子里我记得是有说明安卓和unity的包名必须一致的.所以可能大佬那个时候已经是在包名一致的情况下去做的这个项目,所以没有遇到这个问题,也才没有特别提出.
其实第一步已经把我自己在实际操作中遇到的最难的问题解决了,所以这后面的我没啥好说太多的
第二步
新建一个as项目,这里大佬也没有特别说明,我就用了之前自己新建的模式去建了,没啥问题 这是新建的项目里的结构 因为我们最终是从as 里打包出一个aar包到unity里,所以我们还需要在这个项目里面新建一个module 这个有一点安卓基础的应该都不难 然后选Android library就可以了 这里新建了module之后的结构
第三步
解压下载的压缩包到任意目录下,然后把里面的一个jar包引入到刚才建的module中,记得添加引用(大佬的帖子里都有说,我就不多说了)就这个包 哦这个提一嘴,如果是新项目的话,还需要在这里面添加一个和unity关联的jar包,因为需要给unity发送消息需要用到这个包里的方法 所以一共我们需要用的包是两个
unity的这个包百度一下会有很多告诉你在哪里拿这个包的,不过还得注意一下,不同的unity版本,这个包在所在的位置是不同的喔,记得留心 我用的是2019的,在前面我写的安卓unity相互跳转的帖子里有说道具体的路径位置 嘛,不过这个unity的jar包最后打包出来的时候是需要删掉的,不然在unity打包成最终的apk的时候会失败,因为unity自己就有这个jar包了,你又在这个aar里重复用,unity在打包项目上的时候会不知道到底用谁导致报错,无法打包
第四步
敲java代码,这里我完全是cv大法完成的,过程没有加入自己的一点灵魂 照着帖子做就可以了,遇到引用报红的时候先不急,把所有代码都写进入之后再引用就可以了 这里也有一个小地方需要注意的 帖子里说的 这里编写的是新建的module里的这个文件,不是一开始新建项目自带的app里的同名文件 然后可能有三个类的引用会有红波浪线,那个可以忽略它, 在实际的应用中是没有影响的
第五步
打aar包 这个因为小弟之前打过好几次了,所以这个就相对比较熟练 找到module里的bulid.gradle,然后添加右面的那个代码,sync一下 然后在右边点gradle会弹出下图的框,找到你的module名称,点击里面的other,然后找到刚才代码里敲的方法名,我这里写的和帖子大佬里写的一样,双击右边的那个方法就可以开始打包了 可能是之前打包过,所以没有遇到什么问题,如果在打包过程中遇到问题的话可以参考帖子大佬最后发的那个链接,里面有很多解决打包遇到的问题的方法
第六步
找到这个路径里-release后缀的aar包,这个就是我们需要的了 注意前面说了需要删掉aar包里的unity-classesjar包,不然后面unity打包回报错 怎么删很简单,先把这个包后缀改成zip,然后双击打开,找到libs,然后把里面的这个unity的jar包删掉,再把后缀改回aar就可以了
#@ 第七步 导入unity的路径,需要放置在下图的路径里,如果是新项目就自己创建文件夹就好了
第八步
unity这里的代码我也是直接cv大法大佬的基本没有改过 可能需要自己在类里声明一个AndroidJavaObject这个类其他的没啥 不过确实有可以优化的地方.嘛这个问题不大 不过这里帖子大佬没有说的一个就是这个类不是单纯的挂载到场景中的对象就可以了 还需要在start或者awake里去调用唤醒的方法 并且,如果前面安卓代码和我一样是直接复制粘贴没有注意看代码的话,等你在打包的时候一定是会出问题的,你会发现死活接受不到安卓回传的信息 这里大佬是没有特别说要注意的 我也是在自己之前和安卓工程师对接的时候知道的,就是as在代码里通过unity代码向我们发送消息的时候,是需要场景中某一个对象作为载体的,通过名称去找到这个载体,然后找到载体上挂载的方法去回传信息给unity 像这里,大佬写的对象就是叫NetLogic,然后调用的方法名叫WakeupResult 所以在unity里你的场景里也必须要有这个对象名才可以实现消息的互通 嘛,这个仔细想想的话自己在做安卓和unity消息互通的时候已经试过了,只是当时一次就成功了就没多留意
到这里基本就结束了我在实现语音唤醒功能中的流程了 希望能对大家有所帮助
感谢以下帖子 虽然没有实际解决我的问题,但给我的灵感和启发都是至关重要的
https://blog.csdn.net/qq_45137584/article/details/115443437
https://www.jianshu.com/p/a9ae5d3333d2
|