接入百度和轻语的AI智能接口实现语音识别和语音播放
- 语音识别
- 思路
- 代码
- 语音合成
- 思路
- 总结
语音识别
思路
先在百度和轻语申请接口,获得appkey和secretkey(这是为了获得鉴权,也就是token)
这个简单的说相当于身份的认证,服务器要知道是申请了这个接口的人在调用这个接口,才能通过,才能进行逻辑处理并返回数据
然后是在unity里用它自带的访问外网的类去访问即可,如www/UnityWebRequest,这两个都是可以访问到外网的类(亲测有效)
两个都可以get请求网post请求,post需要在URL后面加上你需要传入的参数即可
下面是www的请求方式
WWWForm getTForm = new WWWForm();
getTForm.AddField("tok", baiDuStoken);
getTForm.AddField("cuid", "abcdxxx");
getTForm.AddField("ctp", "1");
getTForm.AddField("lan", "zh");
getTForm.AddField("tex", word);
WWW getTW = new WWW(baiduVoiceComposeUrl, getTForm);
请求的时候最好在IEnumerator方法里,因为里面有yield return www. 可以让程序在请求的过程中等待返回数据再进行后面的程序
下面是UnityWebRequest的请求方式
UnityWebRequest webRequest = UnityWebRequest.Get("你的请求网址以及需要的参数(如applykey等)" + question);
然后就是根据请求返回的数据对数据进行处理和识别
获得响应的数据的方法
www是www.text()这个是获得string数据
www.bytes()这个是获得字节流,这个方法在语音合成的时候有用,因为需要通过这个将字节流数据转换成音频,然后播放
UnityWebRequest是UnityWebRequest.downloadHandler.text这个获得string数据
然后需要加载第三方的插件litjson对string进行数据的分析
这里因为我是一开始用litjson老是报错,赶进度我就直接在响应数据里对数据进行判断自己拿数据了
目前对litjson里的方法掌握的还不是很熟练
代码
代码的精髓都在上面了,我就不重新贴了
语音合成
思路
将语音识别的数据变成byte字节流,然后通过第三方的类对其进行转换,变成wav/mp3格式。然后再用AudioSource.clip里的play()方法对音频进行播放就可以了
上面已经说明了如何获得byte字节流,这里就不多赘述
在这里我的主要难点有几个,首先是不知道我获得的byte字节流是不是就是我需要的音频数据,因此卡在这里了很久,后面通过将数据保存到本地后播放的方式确定了这个数据就是我需要的音频
音频的储存这里也不多描述了,百度大法有详细的教程
确定好这个数据是我要的音频后,就只需要专心的去想如何播放这个音频了,首先这里我用的是第三方的插件NAudio.dll,用他的方法直接将字节流转换成了音频文件(里面还有歌诗的选择,转成mp3或者wav都可以)
需要的大佬可以私聊(我试试可不可以在下面放链接)
直接用里面的fromWAVData方法把响应回来的数据全部放进去就行了,然后他会处理返回一个clip类,这个里面就保存了合成后的音频,然后进行play()就可以实现语音的播放了
总结
看这个帖子写的内容不多但是这个几乎花了我半天的时间研究,可能是因为这是对接外面的,所以很多报错的时候不知道从哪里开始入手,也不知道到底是哪里出了问题,只能一个一个百度,一个一个尝试,过程中发现我出现的问题基本搜不到,还烦了好一会儿,现在回想起来,可能是因为这个实现的过程其实很简单,大家基本 没有遇到太大的问题(还是太菜了)
先写到这里吧~
2021.3.22更新
上面这个只适用于window系统,之前没有测试过在安卓的情况,在安卓上发现naudioplayer这个库里的某些功能只能在windows系统下被识别,在安卓是识别不了的,更不用说ios了,至于解决办法,网上有一些,不过目前还没有成功的,明天再试试
今天主要是发现了如何给3d模型添加点击事件
这两个功能结合在一起就能实现目前项目里最需要的一个功能,就是和模型能进行互动
这里有一个小问题,就是上面大佬的代码只适用于cube也就是unity自带的GameObject组件,从别的地方导入的模型他是不识别的,这里有一个小技巧,就是给模型创建一个透明的cube组件,将这个组件设为模型的父类,通过控制组件来控制模型即可