小程序实现语音识别转文字,坑路历程

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

微信开发者工具

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

debug的时候发现,工具上录音的路径是http://tmp/xxx.mp3,客户端上录音是wxfile://xxx.mp3。 忽悠呢,不是格式不同,是映射路径不同。
其实做个兼容也不难,每次提示一行文字,很丑。

采样率与编码码率限制

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

一开始没有留意,导致录音不成功。
试过几次后,采用这样的配置,感觉录音识别率和体积之间比较好平衡:

123
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新建进程调用。

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

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

1
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,老铁啊你复制粘贴过来的代码竟然少了!欲哭无泪。

1234
// TODO  重要提示:这里是用读取本地文件的形式模拟实时获取语音流并发送的,因为read很快,所以这里需要sleep// TODO  如果是真正的实时获取语音,则无需sleep, 如果是8k采样率语音,第二个参数改为8000int 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。

结论:深夜不宜加班写bug??。

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

原文地址:https://www.cnblogs.com/ycwu314/p/11286849.html

时间: 2024-10-08 05:46:15

小程序实现语音识别转文字,坑路历程的相关文章

微信小程序初体验遇到的坑

今天,2017年1月9日凌晨,微信小程序如约上线.2007年1月9日,整整10年前的今天,苹果的iPhone手机正式问世! 经不起新技术的诱惑了,想试着开发一下看看.刚开始遇到很多坑,在这里记录一下,有遇到同样坑的可以参考 1.我用的是mac版本的开发工具,运行官方demo后报错 Failed to load resource: net::ERR_NAME_NOT_RESOLVEDhttp://1351598279.appservice.open.weixin.qq.com/appservice

开发第一个IOS小程序 - 点击按钮文字变色

1. 题目:实现点击按钮切换文字对应的颜色 2.分析大致的开发步骤是 •添加所需要的UI元素:3个按钮(UIButton).1个文本标签(UILabel) •监听3个按钮的点击事件 •改变文本标签的文字颜色 3.具体实现步骤 3.1 在storyboard文件中,拖拽相应控件器上,布局好以上显示页面效果 3.2 然后利用Xcode右端上的“圆圈”按钮,将代码区分割成 “Main.storyboard”与“viewController.m”文件,两个可以按住control键,不要放开,将以上元素拖

小程序cover-view踩过的坑

1.前段时间开发一个小程序,里边用到cover-view,发现cover-view其实很多都是不支持的,比如动画,如果你想要在cover-view上边加动画你会发现没有效果,虽然在模拟器里边可以显示动画,但是在真机测试的时候是没有效果的. 2.还有就是cover-view虽然可以设置overflow: scroll,但是不支持动态的去变换overflow的属性值. 3.还有就是cover-view它会有默认设置的样式:white-space: nowrap; line-height: 1.2; 

微信小程序之蓝牙 BLE 踩坑记录

前言 前段时间接手了一个微信小程序的开发,主要使用了小程序在今年 3 月开放的蓝牙 API ,此过程踩坑无数,特此记录一下跳坑过程.顺便开了另一个相关的小项目,欢迎 start 和 fork: BLE_MiniProgram API简介 微信小程序目前有蓝牙 API 共 18 个,其中操作蓝牙适配器的共有 4 个,分别是 wx.openBluetoothAdapter 初始化蓝牙适配器 wx.closeBluetoothAdapter 关闭蓝牙模块 wx.getBluetoothAdapterS

小程序项目之再填坑

简诉 是的,真的,你没有看错,我就是上次那个加薪的,但是现在问题来了,最近又搞了个小程序的需求,又填了不少坑,其中的辛酸就不说了,说多了都是泪,此处省略三千字 ---^--,说重点吧,反正最后就是差点这让老板叫走人了,你说优秀不优秀-. 前段时间网上一直说的"<你可以骂那些中年人,尤其是有车有房的-->",虽然我没有房.也没有车,但也坚决不做那个可以随便骂的中年人(人到中年不如狗??),不存在的啦,这个仇宝宝已经记下了,先分享一下最近遇到的几个坑吧. -- 我是首席填坑官-

微信小程序性能测试之jmeter踩坑秘籍(前言)

最近要做个微信小程序的性能压测,虽然之前只做过web端的,但想一想都是压后端的接口,所以果断答应了下来,之前对jmeter都是小打小闹,所以趁着这次机会好好摆弄摆弄. --------------------------------------------------------------------------------踩坑前总结哈理论,这篇写给自己的----------------------------------------------------------------------

小程序开发中的一些坑和技巧

前言 最近公司要开发一款电商小程序,匆忙看了一遍文档就开始干活了.整体开发体验个人感觉不太好,特别是如果之前习惯了Vue开发,突然去开发小程序,感觉很鸡肋.以下是我在开发中遇到的一些问题以及解决方法的总结,仅供参考 引入iconfont 在小程序中引入字体图标要比web麻烦一些,简单说需要三步: 下载iconfont,把iconfont.css复制到iconfont.wxss,在app.wxss中引入 查看iconfont在unicode模式下的在线链接,替换iconfont.wxss中的链接为

小程序跳转遇到的坑

新手跳坑.你写的路径路由是正确的,但是发现点击了,一点反应也没有,很可能是下下面几种原因: 1:你要跳转的是tabBar中的页面,需要用到专属的跳转方法switchtab 2:在app.js中没有配置该页面 3:页面层级是不是超过五层了.可以用销毁的跳转方式 wx.navigateTo(OBJECT) 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面. OBJECT 参数说明: 参数 类型 必填 说明 url String 是 需要跳转的应用内非 tabB

关于小程序支付功能的爬坑

代码大部分用的http://www.wxapp-union.com/article-2516-1.html提供的. 但是,此代码在使用org.apache.httpcomponents(4.3.5)里的HttpPost实例化时出错. 解决:maven中引入的httpclient和httpcore版本一致,如 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcl