完成效果
小程序:
- 支持键盘输入和语音输入,ai接受到用户输入后返回答案和回答时间,有参考文献会附带文献链接,支持跳转到相关文献页面或评论区。
- 页面效果完善,已考虑输入输出状态相关交互效果,用户与ai输入区分,语音支持输出语音和转文字,页面自动滑动顶格
- 回答速度已优化,60s的问题能在10s内给出回答
实现思路
聊天框内容维护
维护对象数组,如:
const chatMsg = [{origin:client,txt:"你是谁?"},{origin:server,txt:"我是...."}]
在页面便利该数组进行渲染,实现聊天框的效果,用户输入和ai回答时进行push,聊天框就会新增内容啦~ 其他的页面效果,自动定位到最新内容啥的用wx的api可以进行元素定位滚轮位置,跟据origin写动态类区分用户与ai输出...
语音功能
一、获取权限
我们做的ai助手其实是双端的,pc端去做这个可以直接用浏览器支持的recordManager接口,可以揽括权限获取、语音录制、存储、播放、停止播放等等功能,使用较为简单,使用小程序就踩了比较多坑~ 之前没做过小程序,最近做了几个需求,真的搞到十分麻烦,除了hbuilder和微信开发者工具使用十分不便,还有让人头疼的缓存问题,各种权限、上线发版还需要提审各种问题,总之让人十分难受。
c小程序的话,首先代码部分较为简单,使用wx的api去打开设置,配置scoped,用户就可以打开麦克风了,十分简单。
wx.getSetting({
success (res) {
console.log(res.authSetting)
// res.authSetting = {
// "scope.userInfo": true,
// "scope.userLocation": true
// }
}
})
然后我就出现问题了,打开的设置里,没有麦克风权限! 我一开始以为是个人手机没打开权限,后来查了一下又以为是在manifest文件里没有赋值权限scoped,后来发现都不是,手机权限没有限制,麦克风权限无需配置scoped,摸不着头脑,和组长研究半天,最后在wx社区文档发现更新,说现在小程序麦克风权限也需要在微信公众号平台去申请审批了,怪就怪我不了解小程序开发流程和细节吧~┭┮﹏┭┮
二、实现语音功能
技术选择的话,选择浏览器的recordAudioManager/小程序的api接口去做,基本实现要求语音的开始录制、停止录制、取消录制、语音发送、语音播放和转文字的功能,这边前几个实现基本使用接口可以轻松实现,转文字的话需要后端去用一些第三方的接口去做音频的转文字,像是阿里、百度都有提供这些接口,前端上次音频到后端拿到后端响应数据后push到聊天框的内容里,就可以实现基本的功能。
技术实现还有些许不足之处,就是语音功能一次就用到了3个接口,如果哪天用户基群很大服务器压力将会很大,现状是:后端接收音频文件上传到oss返回音频oss地址接口=>前端拿到oss接口请求转文字内容接口=>使用转文字内容请求ai问答接口获得回答,目前考虑的优化是将前两个接口请求合为一个接口处理,但貌似后端那边有些问题具体我也不是特别了解,还有一个优化之处就是在后端转文字时前后端协调做个流式输出,可以保证页面响应及时用户体验感更好,但是需要消耗一定的性能,目前优化还没具体落实,估计会放在后面的迭代去做吧~