您好,欢迎访问一九零五行业门户网

小程序实现语音识别经验分享

之前写了个工具型微信小程序(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、wavwx.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: <view bindtouchstart='starthandel' bindtouchend='endhandle' class="tapview">     <text>{{text}}</text> </view>
音频转换
我这边后端使用php的开源框架thinkphp,当然node、java、python等后端语言都可以,你根据自己的喜好和能力来。想做好音频转码我们就要借助音视频转码工具ffmpeg、avconv,它们都依赖于gcc。安装过程大家可以自行百度,或者关注底部的文章链接。
<?php namespace api\controller; use think\controller; class indexcontroller extends controller { //音频上传编解码 public function wxupload(){ $upload_res=$_files['viceo']; $tempfile = file_get_contents($upload_res['tmp_name']); $wavname = substr($upload_res['name'],0,strripos($upload_res['name'],".")).".wav"; $arr = explode(",", $tempfile); $path = 'aduio/'.$upload_res['name']; if ($arr && !empty(strstr($tempfile,'base64'))){ //微信模拟器录制的音频文件可以直接存储返回 file_put_contents($path, base64_decode($arr[1])); $data['path'] = $path; apiresponse("success","转码成功!",$data); }else{ //手机录音文件 $path = 'aduio/'.$upload_res['name']; $newpath = 'aduio/'.$wavname; file_put_contents($path, $tempfile); chmod($path, 0777); $exec1 = "avconv -i /home/wwwroot/mapxcx.kanziqiang.top/$path -vn -f wav /home/wwwroot/mapxcx.kanziqiang.top/$newpath"; exec($exec1,$info,$status); chmod($newpath, 0777); if ( !empty($tempfile) && $status == 0 ) { $data['path'] = $newpath; apiresponse("success","转码成功!",$data); } } apiresponse("error","发生未知错误!"); } //json数据返回方法封装 function apiresponse($flag = 'error', $message = '',$data = array()){ $result = array('flag'=>$flag,'message'=>$message,'data'=>$data);         print json_encode($result);exit;     } }
调用识别接口
当我们把文件准备好之后,接下来我们就可以将base64编码之后的音频文件通过api接口请求传输过去。期间我们要注意严格按照文档中所说的规范传输,否则将造成不可知的结果。
<?php namespace api\controller; use think\controller; class indexcontroller extends controller { public function _initialize(){ } //封装数据请求方法 public function httpsrequest($url,$data = null,$xparam){ $curl = curl_init(); curl_setopt($curl, curlopt_url, $url); curl_setopt($curl, curlopt_ssl_verifypeer, false); curl_setopt($curl, curlopt_ssl_verifyhost, false); curl_setopt($curl, curlopt_header, 0); $appid = "";//开放平台的appid $appkey = "";//开放平台的appkey $curtime = time(); $checksum = md5($appkey.$curtime.$xparam.$data); $headers = array( 'x-appid:'.$appid, 'x-curtime:'.$curtime, 'x-checksum:'.$checksum, 'x-param:'.$xparam, 'content-type:'.'application/x-www-form-urlencoded; charset=utf-8' ); curl_setopt($curl, curlopt_httpheader, $headers); if (!empty($data)){ curl_setopt($curl, curlopt_post, 1); curl_setopt($curl, curlopt_postfields, $data); } curl_setopt($curl, curlopt_returntransfer, 1); $output = curl_exec($curl); curl_close($curl); return $output; } //请求接口数据处理 public function getvoice($path){ $d = base64_encode($path); $url = "https://api.xfyun.cn/v1/aiui/v1/voice_semantic"; $xparam = base64_encode( json_encode(array('scene' => '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)。
想看实际案例的可以微信扫码
-
相关推荐:
.net开发微信公众平台之语音识别代码解析
关于微信公众平台语音识别结果的调用
html5语音识别标签写法附图_html5教程技巧
以上就是小程序实现语音识别经验分享的详细内容。
其它类似信息

推荐信息