⼩程序实现语⾳识别转⽂字功能及遇到的坑
最近为⼩程序增加语⾳识别转⽂字的功能,坑路不断,特此记录。
开发者⼯具
开发者⼯具上的录⾳⽂件与移动端格式不同,暂时只可在⼯具上进⾏播放调试,⽆法直接播放或者在客户端上播放
其实做个兼容也不难,每次提⽰⼀⾏⽂字,很丑。
采样率与编码码率限制
⼀开始没有留意,导致录⾳不成功。
试过⼏次后,采⽤这样的配置,感觉录⾳识别率和体积之间⽐较好平衡:
文件格式转换app
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
oracle取字符串长度
int deltaSleep = getSleepDelta(len, sampleRate);
Thread.sleep(deltaSleep);
也少了对sampleRate的设置。
阿⾥云asr token过期
因为⽤的是免费版asr,没有给福报⼚充值,因此token⼀天失效,导致联调的时候突然报错。
最后实在受不了,写了个定时任务每⼩时更新token。
这,就是beggar VIP
递归函数cwx.uploadFile返回值
封装了⼀个接⼝parseResponse,统⼀解析查询结果(⽂本、语⾳)。发现奇怪的问题:
⽤⽂本查询的,可以正常解析结果⽤语⾳查询的,明明已经返回了结果,却解析不了!
只能console.log()打印出来对⽐
第⼀⾏是wx.request()发起⽂本查询。
第⼆⾏是wx.uploadFile()上传语⾳⽂件后直接语⾳转⽂字,并且查询。
支付宝缴费一直显示数据加载中wx.uploadFile返回值是“字符串”!
truncate的读音
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。
总结
小苏打和碱有什么区别吗?
以上所述是⼩编给⼤家介绍的⼩程序实现语⾳识别转⽂字功能及遇到的坑,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
如果你觉得本⽂对你有帮助,欢迎转载,烦请注明出处,谢谢!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。