微信小程序实现语音识别转文字功能及遇到的坑


Posted in Javascript onAugust 02, 2019

最近为小程序增加语音识别转文字的功能,坑路不断,特此记录。

微信开发者工具

开发者工具上的录音文件与移动端格式不同,暂时只可在工具上进行播放调试,无法直接播放或者在客户端上播放

debug的时候发现,工具上录音的路径是http://tmp/xxx.mp3,客户端上录音是wxfile://xxx.mp3。 忽悠呢,不是格式不同,是映射路径不同。

其实做个兼容也不难,每次提示一行文字,很丑。

采样率与编码码率限制

每种采样率有对应的编码码率范围有效值,设置不合法的采样率或编码码率会导致录音失败。详细看这个
https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.start.html

一开始没有留意,导致录音不成功。

试过几次后,采用这样的配置,感觉录音识别率和体积之间比较好平衡:

sampleRate: 16000, //采样率
numberOfChannels: 1, //录音通道数
encodeBitRate: 96000, //编码码率

单通道基本是必选的。因为asr只支持单通道。frameSize也是可以的,但是要考虑截断对识别的影响。暂时没有用上。

录音优化

因为可能误按,于是对小于500ms的录音直接忽略。
另外,松开录音按键后,再延迟一点时间才真正stop录音。

录音文件格式

微信录音文件支持mp3和aac。这2种格式文件都比较小,aac文件体积更小。这对上传来说是件好事情,速度更快。
但是对语音识别转文字就不友好了。因为百度、阿里云ASR、讯飞的语音转文字接口都不支持aac和mp3,通常要求是pcm或者wav格式。

如果微信录音能提供wav格式,那么就不用服务器做格式转换了,但是wav格式体积是mp3、aac的5到10倍,至少短期是没戏了,这也是很多人吐槽的地方。

服务器转换录音文件格式

可以用java第三方库转换,也可以用Process调用ffmpeg转换。要注意的是,根据识别API的要求来做转换。比如阿里云asr的要求是:

支持音频编码格式:pcm(无压缩的pcm文件或wav文件)、opus,16bit采样位数的单声道(mono);
支持音频采样率:8000Hz、16000Hz;

java ProcessBuilder要使用数组传参

转换音视频,习惯用ffmpeg。安装完ffmpeg之后,用java新建进程调用。

Process = new ProcessBuilder("ffmpeg -i in.mp3 out.wav").start();

一直提示CreateProcess error。 后来看文档才发现,要以数组的形式传入参数。

Process = new ProcessBuilder("ffmpeg", "-y", "-i", "in.mp3", "out.wav").start();

这样就启动成功了。

关于java启动进程,不是本文重点,以后再写篇文章总结。

阿里云asr sdk使用问题

这个问题困扰了一天时间,回想起来真是吐血。
问题表现是微信录制的语音很多都识别不了。
最初是直接把录音mp3文件转换为pcm文件,本地能播放,但是用阿里云asr sdk却识别不了。 一开始以为是文件编码问题。特意查了asr支持的文件格式,用ffprobe检查,potplayer看属性,都没有看出问题。
甚至把启动ffmpeg进程转换也改了,用了java的库去做,还是不行。
后来为了方便测试问题,用asr的restful接口测试录音文件,都能识别! 似乎是sdk的问题。于是打开官方文档例子对比。发现用的是sdk 2.x,老铁啊你复制粘贴过来的代码竟然少了!欲哭无泪。

// TODO 重要提示:这里是用读取本地文件的形式模拟实时获取语音流并发送的,因为read很快,所以这里需要sleep
// TODO 如果是真正的实时获取语音,则无需sleep, 如果是8k采样率语音,第二个参数改为8000
int deltaSleep = getSleepDelta(len, sampleRate);
Thread.sleep(deltaSleep);

也少了对sampleRate的设置。

阿里云asr token过期

因为用的是免费版asr,没有给福报厂充值,因此token一天失效,导致联调的时候突然报错。
最后实在受不了,写了个定时任务每小时更新token。
这,就是beggar VIP?

wx.uploadFile返回值

封装了一个接口parseResponse,统一解析查询结果(文本、语音)。发现奇怪的问题:

用文本查询的,可以正常解析结果用语音查询的,明明已经返回了结果,却解析不了!

只能console.log()打印出来对比

微信小程序实现语音识别转文字功能及遇到的坑

第一行是wx.request()发起文本查询。
第二行是wx.uploadFile()上传语音文件后直接语音转文字,并且查询。

wx.request返回值是json对象。
wx.uploadFile返回值是“字符串”!
wx.uploadFile返回值是“字符串”!
wx.uploadFile返回值是“字符串”!
重要的事情要说3遍。尽管Content-Type: "application/json; charset=utf8",但是微信根本不做转换!非常坑爹!

解决:对wx.uploadFile返回值进行JSON.parse(res.data),得到json对象。

更换appid和secret

因为正式小程序项目账号一直拖着没有申请,所以这段时间用的是我个人的appid和secret进行开发。
等正式账号准备好了,更新了小程序项目的appid,并且发出内部体验包。

此时已经深夜1点半,头脑有点发懵。只更新了小程序appid,竟然忘了更新服务器的appid和secret。。。
于是乎反复报错登录失败。
过了一会才反映过来,更新服务器的appi的secret,但是还是用户。才想起忘了还有storage缓存没有清除?,里面放着自定义的session。这下真机体验没问题了。
但是微信开发者工具又是登录失败。反复摸索后发现:更换小程序appid后,清除所有数据,关闭开发者工具,重新打开,这就正常了。应该是微信开发者工具的bug。

https://ycwu314.github.io/p/miniapp-speech-to-text-experience/

总结

以上所述是小编给大家介绍的微信小程序实现语音识别转文字功能及遇到的坑,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Javascript call和apply区别及使用方法
Nov 14 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
Jun 05 Javascript
jquery序列化表单以及回调函数的使用示例
Jul 02 Javascript
javascript实现滑动解锁功能
Dec 31 Javascript
JS绘制生成花瓣效果的方法
Aug 05 Javascript
javascript实现不同颜色Tab标签切换效果
Apr 27 Javascript
jQuery实现鼠标滑过图片移动特效
Dec 08 Javascript
Sequelize中用group by进行分组聚合查询
Dec 12 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
Jul 15 Javascript
Vue实现表格中对数据进行转换、处理的方法
Sep 06 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
Apr 25 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
Sep 03 jQuery
jQuery pager.js 插件动态分页功能实例分析
Aug 02 #jQuery
vue单页应用的内存泄露定位和修复问题小结
Aug 02 #Javascript
vue回到顶部监听滚动事件详解
Aug 02 #Javascript
微信小程序npm引入vant-weapp的踩坑记录
Aug 01 #Javascript
vue3.0中的双向数据绑定方法及优缺点
Aug 01 #Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
Aug 01 #Javascript
微信小程序使用Vant Weapp组件库的方法步骤
Aug 01 #Javascript
You might like
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
PHP判断变量是否为0的方法
2014/02/08 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
2015/03/02 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
Vue插件之滑动验证码
2019/09/21 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
python抓取百度首页的方法
2015/05/19 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
python 连续不等式语法糖实例
2020/04/15 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
经贸日语毕业生自荐信
2013/11/03 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
小学感恩节活动策划方案
2014/10/06 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技
keepalived + nginx 实现高可用方案
2022/12/24 Servers