最近小程序增加了语音识别文字的功能,坑多路多,特此记录。
微信开发者工具
开发者工具上的记录文件的格式与移动终端上的不同。暂时只能在工具上播放调试,不能直接播放或在客户端播放
调试的时候发现工具上的录制路径是http://tmp/xxx.mp3,客户端上的录制路径是wxfile ://XXX . MP3 follow,不是格式不同,而是映射路径不同。
其实兼容并不难。一次提示一行很难看。
采样率和编码速率限制
每个采样率在码率范围内都有有效值,设置非法采样率或码率会导致录制失败。详细看看这个https://developers . weixin . QQ.com/mini program/dev/API/media/recorder/recorder manager . start . html
一开始没注意,导致录制不成功。
经过几次尝试,有了这个配置,我觉得录音识别率和音量之间有很好的平衡:
SampleRate: 16000,//通道的采样率数: 1,//录制通道数encodeBitRate: 96000,//编码速率基本要求单通道。因为asr只支持单通道。FrameSize也是可以的,但是要考虑截断对识别的影响。暂时不用。
录制优化
因为可能误按,直接忽略500ms以内的录音。另外,释放录音按钮后,在真正停止录音之前,请延迟一点时间。
录制文件格式
微信录音文件支持mp3和aac。这两种格式的文件较小,aac文件较小。这对于上传来说是一件好事,而且速度更快。但对语音识别不友好。因为百度、阿里巴巴云ASR、讯飞的语音转文字接口不支持aac、mp3,通常需要pcm或wav格式。
如果微信录音可以提供wav格式,服务器不需要做格式转换,但是wav格式是mp3和aac的5到10倍,至少短期内会丢失,这是很多人吐槽的地方。
服务器转换记录文件格式
可以使用java第三方库进行转换,也可以使用Process调用ffmpeg转换。需要注意的是,转换是根据标识API的要求进行的。例如,阿里巴巴云asr的要求是:
支持音频编码格式:pcm(未压缩的pcm文件或wav文件)、opus、mono);具有16位采样位;支持音频采样率:8000Hz,16000Hz;
Java ProcessBuilder使用数组传递参数
转换音频和视频,习惯ffmpeg。安装ffmpeg后,用java创建一个新的进程调用。
process=new ProcessBuilder(' ffmpeg-I in . MP3 out . wav ')。start();始终提示CreateProcess错误。后来看了文档,发现必须以数组的形式传入参数。
process=new process builder(' ffmpeg ','-y ','-i ',' in.mp3 ',' out.wav ')。start();于是就成功开始了。
java启动过程不是本文的重点,所以我以后会写一个总结。
阿里巴巴云asr sdk使用问题
这个问题困扰了我一整天,回想起来真的是吐血。问题是微信录的很多声音都认不出来。原本mp3文件直接转换成pcm文件,可以在本地播放,但阿里巴巴Cloud asr sdk无法识别。一开始我以为是文件编码问题。我特意查了asr支持的文件格式,用ffprobe查了一下,用potplayer看了一下属性,没发现什么问题。甚至开始ffmpeg过程的转换也改变了,用java库来做,但是还是不行。后来为了方便测试,用asr的restful接口对录音文件进行了测试,都能识别出来!似乎是sdk的问题。然后打开公文示例对比。发现用的是sdk 2.x,老铁。你复制粘贴的代码少了!欲哭无泪。
//TODO重要提示:实时语音流是模拟的,以读取本地文件的形式发送。因为读书快,你需要睡在这里。//TODO如果是真正的实时语音采集,就不用睡觉了。如果是8k采样率语音,第二个参数改为8000 int delta=getsleepdelta (len,采样率);thread . sleep(deltaSleep);采样速率也缺乏设置。
阿里巴巴云asr令牌到期
因为用的是免费版asr,富宝工厂没有充值,令牌过期一天,导致联合调试突然出错。最后,我受不了了。我写了一个每小时更新令牌的常规任务。这是乞丐贵宾
Wx.uploadFile返回值
封装一个接口parseResponse来统一解析查询结果(文本、语音)。发现奇怪的问题:
如果使用文本进行查询,可以正常解析结果。如果用语音查询,无法解析结果!
只能打印console.log()进行比较
第一行是由wx.request()发起的文本查询。第二行是wx.uploadFile()。上传语音文件后,直接将语音转换为文本和查询。
Wx.request返回一个json对象。Wx.uploadFile返回值为“字符串”!Wx.uploadFile返回值为“字符串”!Wx.uploadFile返回值为“字符串”!重要的事情要说三遍。即使内容类型为“:”的应用程序/JSON;Charset=utf8 ',但微信根本不转换!很坑人!
解决方案:对wx.uploadFile的返回值进行json.parse(res.data)来获取json对象。
替换appid和机密
因为官方小程序账号迟迟没有申请,我个人的appid和秘籍在此期间被用于开发。当官方账号准备好了,小程序项目的appid就更新了,内部体验包就发出来了。
这时已经是半夜一点半了,脑子有点发懵。只更新了小程序的appid,忘了更新服务器的appid和秘密。结果我反复报错,没能登录。过了一段时间,反映服务器appi的秘密更新了,但还是用户。我记得我忘记了存储缓存没有被清除,并且其中有一个用户定义的会话。真正的机器体验现在没问题了。但是微信开发者工具再次登录失败。反复摸索后发现,清除所有数据,关闭开发者工具,更换小程序appid后重新打开是正常的。应该是微信开发者工具的bug。
https://ycwu314.github.io/p/miniapp-speech-to-text-experience/
摘要
以上是边肖推出的微信小程序,实现对文字和遇到的坑进行语音识别的功能。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!如果你觉得这篇文章对你有帮助,请转载,请注明出处,谢谢!