博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小程序实现语音识别到底要填多少坑?
阅读量:6226 次
发布时间:2019-06-21

本文共 2307 字,大约阅读时间需要 7 分钟。

前不久写了个工具型微信小程序(Find周边),里面用到了语音识别技术。现将实现细节整理如下:

接口预览

通过阅读了解、以及对后端ThinkPhp框架的学习,我整理了如下开发步骤:

  • 注册科大讯飞账号(国人的骄傲,全球领先的语音识别技术)
  • 进入AIUI开放平台在应用管理创建应用并记录APPID和ApiKey
  • 进入应用配置,配置符合自己的情景模式、识别方式和技能
  • 进行小程序开发录制需要识别的音频(下有详述)
  • 后端转码录制的音频(科大讯飞支持pcm、wav),提交给识别接口(下有详述)
  • 小程序接到识别结果进行接下来业务

音频录制接口

  • wx.startRecord()和wx.stopRecord()
wx.startRecord()和wx.stopRecord()接口也可以满足需求,但从1.6.0 版本开始不再被微信团队维护。建议使用能力更强的 wx.getRecorderManager 接口。该接口获取到的音频格式为silk。
silk是webm格式通过base64编码后的结果,我们解码后需要将webm转换成pcm、wav
  • wx.getRecorderManager()
相对wx.startRecord()接口,该接口提供的能力更为强大( ),可以暂停录音也可以继续录音,根据自己需求设置编码码率,录音通道数,采样率。最让人开心的是可以指定音频格式,有效值 aac/mp3。不好的是wx.getRecorderManager()在1.6.0才开始被支持。当然如果你要兼容低端微信用户需要使用wx.startRecord()做兼容处理。
  • 事件监听细节
// wxjs:const recorderManager = wx.getRecorderManager()recorderManager.onStart(() => {    //开始录制的回调方法})//录音停止函数recorderManager.onStop((res) => {  const { tempFilePath } = res;  //上传录制的音频  wx.uploadFile({    url: app.d.hostUrl + '/Api/Index/wxupload', //仅为示例,非真实的接口地址    filePath: tempFilePath,    name: 'viceo',    success: function (res) {        console.log(res);    }  })})Page({    //按下按钮--录音  startHandel: function () {    console.log("开始")    recorderManager.start({      duration: 10000    })  },  //松开按钮  endHandle: function () {    console.log("结束")    //触发录音停止    recorderManager.stop()  }})//wxml:
{
{text}}

音频转换

我这边后端使用php的开源框架,当然node、java、python等后端语言都可以,你根据自己的喜好和能力来。想做好音频转码我们就要借助音视频转码工具ffmpeg、avconv,它们都依赖于gcc。安装过程大家可以自行百度,或者关注底部的文章链接。

$flag,'message'=>$message,'data'=>$data); print json_encode($result);exit; }}

调用识别接口

当我们把文件准备好之后,接下来我们就可以将base64编码之后的音频文件通过api接口请求传输过去。期间我们要注意严格按照文档中所说的规范传输,否则将造成不可知的结果。

'main','userid'=>'user_0001',"auf"=>"16k","aue"=>"raw","spx_fsize"=>"60" ))); $data = "data=".$d; $res = $this->httpsRequest($url,$data,$xparam); if(!empty($res) && $res['code'] == 00000){ apiResponse("success","识别成功!",$res); }else{ apiResponse("error","识别失败!"); } } //数据返回封装 function apiResponse($flag = 'error', $message = '',$data = array()){ $result = array('flag'=>$flag,'message'=>$message,'data'=>$data); print json_encode($result);exit; }}

到这里基本就完成了。以上代码是经过整理之后的,并不一定能够满足各位的实际开发需求。如果发现不当之处欢迎微信交流(xiaoqiang0672)。

想看实际案例的可以微信扫码

-
小程序码

关于gcc安装:

关于FFmpeg安装:
关于ffmpeg/avconv安装:

转载地址:http://asxna.baihongyu.com/

你可能感兴趣的文章
Java面试题复习笔记(Web方向)
查看>>
第二次冲刺站立会议(3)
查看>>
java中的object... args参数
查看>>
笔试之大整数相乘
查看>>
转载笔记
查看>>
学习笔记 UpdateXml() MYSQL显错注入
查看>>
lua封装的位运算
查看>>
linux:逐行合并两文件(paste命令)
查看>>
mjpg-stream 视频服务 (1)| 简介与配置树莓派使用
查看>>
makefile learning
查看>>
java语言的发展史
查看>>
homebrew安装nginx,mysql,redis,zookeeper
查看>>
bug报告-常用词汇中英对照表
查看>>
EPOCH, BATCH, INTERATION
查看>>
Linux下安装php环境并且配置Nginx支持php-fpm模块
查看>>
结合typedef更为直观的应用函数指针
查看>>
UVA 10410 Tree Reconstruction
查看>>
映射前和映射后的操作
查看>>
java内存区域与内存溢出异常(2)
查看>>
熟悉HBase基本操作
查看>>