E企盈营销工具技术服务商 热线:4006-838-530

【小程序】语音识别(无需转码、无需后台)

E企盈直播平台营销卖货系统

微信小程序目前录音仅能生成 mp3和acc两种格式,而百度语音识别,讯飞语音识别都不支持mp3和acc的;最后发现腾讯云和阿里云支持mp3,反正用的是腾讯的小程序,将就着用腾讯的接口咯不想解说了,直接说流程+代码+注释吧准备:1.小程序账号(appid)2.腾讯云控制后台申请语音识别服务(获取SecretId 和SecretKey),对应代码中的马赛克,自行替换 不建议直接搬代码就用,所以多少看下接口文档吧小程序录音接口 和 腾讯云语音识别接口主要流程:一、小程序录音及临时路径获取二、根据临时读取录音文件并转换成base64编码三、调用语音识别接口(submit())参数获取加密并获取签名(需要用到hmac_sha1加密,找了挺久才找到的,在最下面)发送请求const app = getApp();const recorder = wx.getRecorderManager();const player = wx.createInnerAudioContext();const file = wx.getFileSystemManager();var that;Page({  /**   * 页面的初始数据   */  data: {    apikey: ‘马赛克’,    secret_id:’马赛克’,    token:””,    recording: false,    cancel_record:false,    start_y: ”,    fileBase64: ”, //base64的文件    rate: 8000,    filePath: ”,//录音文件    fileLen:0,//录音长度  },  /**   * 生命周期函数–监听页面加载   */  onLoad: function (options) {    that = this;    //先定好停止录音后要干嘛    recorder.onStop(function suc(e) {      //保存录音文件的临时路径      that.setData({        filePath: e.tempFilePath,      })      wx.setStorageSync(‘filePath’, e.tempFilePath);      //友好的菊花加载      wx.showLoading({        title: ‘文件读取中…’      })      //读取录音文件,并转为base64编码      file.readFile({        filePath: e.tempFilePath,        encoding: ‘base64’,        success: function (e) {          that.setData({            fileBase64: e.data          })          console.log(e);        },        complete() {          wx.hideLoading();        },      })    })  },  //语音识别  submit(){        let apikey = that.data.apikey;    let param = {      Action: ‘SentenceRecognition’,      Version: ‘2018-05-22’,      ProjectId: ‘0’,//腾讯云项目ID      SubServiceType: 2, //一句话识别,没得选      EngSerViceType: ‘8k’,//引擎类型 8k(电话) 或 16k,没说明白      SourceType: 1,//0 url  1数据      VoiceFormat: ‘mp3’,//格式 MP3 或 wav      UsrAudioKey: new Date().getTime(),//唯一识别?直接用时间戳吧珂珂      Data: that.data.fileBase64,      DataLen: app.base64_decode(that.data.fileBase64).length,//未进行base64编码时的数据长度      // Url :”,你懂的      Timestamp: parseInt(new Date().getTime()/1000),      Nonce: parseInt(new Date().getTime() / 1000),      SecretId: that.data.secret_id,          };        //把参数按键值大小排序并拼接成字符串    let data = ksort(param);    let arr = [];    for (var x in data) {      data[x] = encodeURI(data[x]);      arr.push(x + ‘=’ + data[x]);    }    let str = arr.join(‘&’);    //签名生成    let sign = ‘POSTaai.tencentcloudapi.com/?’ + str;    sign = b64_hmac_sha1(apikey,sign);    data[‘Signature’] = sign;    //友好的菊花提示    wx.showLoading({      title: ‘发送中…’,    })    wx.request({      url: ‘https://aai.tencentcloudapi.com/’,      data:data,      header:{        ‘content-type’:’application/x-www-form-urlencoded’      },      method:’post’,      success:function(e){console.log(e.data.Response)},      complete(){wx.hideLoading();}    })  },  //手指按下  clickDown(e){    console.log(‘start’);    that.setData({      recording: true,      start_y: e.touches[0].clientY,      cancel_record: false,    })        //开始录音    recorder.start({      duration: 60000,//最大时长      sampleRate: that.data.rate,//采样率      numberOfChannels: 1,//录音通道数      encodeBitRate: 24000,//编码码率,有效值见下表格      format: ‘mp3’,//音频格式      // frameSize: 2000,//指定大小 kb    })  },  //手指移动  clickMove(e){    if (e.touches[0].clientY – that.data.start_y = -50) {      that.setData({        cancel_record: true,      })    } else {      that.setData({        cancel_record: false,      })    }    return false;  },  //手指松开  clickUp(e){    console.log(‘end’);    if (that.data.cancel_record) {      wx.showModal({        title: ‘提示’,        content: ‘您选择了取消发送,确定吗?’,        confirmText: ‘继续发送’,        cancelText: ‘取消重录’,        success: res = {          if (res.confirm) {            wx.showToast({              title: ‘发送成功’,            })          } else {            wx.showToast({              title: ‘您选择了取消’,            })          }          that.setData({            recording: false          })        }      })    } else {      wx.showToast({        title: ‘发送成功’,      })      that.setData({        recording: false      })    }    recorder.stop();    return false;      },  //播放  play(){    player.src = that.data.filePath;    player.play();  },})//对象按键值排序方法function ksort(obj){    let temp = ‘Action’;    let k_arr = [];    for(var x in obj){      k_arr.push(x);    }    k_arr.sort();    let res = {};    for(let i = 0;ik_arr.length;i++){      let k = k_arr[i];      res[k] = obj[k];    }    return res;}//这个是找了很久的加密函数function b64_hmac_sha1(k, d, _p, _z) {  // heavily optimized and compressed version of http://pajhome.org.uk/crypt/md5/sha1.js  // _p = b64pad, _z = character size; not used here but I left them available just in case  if (!_p) { _p = ‘=’; } if (!_z) { _z = 8; } function _f(t, b, c, d) { if (t 20) { return (b & c) | ((~b) & d); } if (t 40) { return b ^ c ^ d; } if (t 60) { return (b & c) | (b & d) | (c & d); } return b ^ c ^ d; } function _k(t) { return (t 20) ? 1518500249 : (t 40) ? 1859775393 : (t 60) ? -1894007588 : -899497514; } function _s(x, y) { var l = (x & 0xFFFF) + (y & 0xFFFF), m = (x 16) + (y 16) + (l 16); return (m 16) | (l & 0xFFFF); } function _r(n, c) { return (n c) | (n (32 – c)); } function _c(x, l) { x[l 5] |= 0x80 (24 – l % 32); x[((l + 64 9) 4) + 15] = l; var w = [80], a = 1732584193, b = -271733879, c = -1732584194, d = 271733878, e = -1009589776; for (var i = 0; i x.length; i += 16) { var o = a, p = b, q = c, r = d, s = e; for (var j = 0; j 80; j++) { if (j 16) { w[j] = x[i + j]; } else { w[j] = _r(w[j – 3] ^ w[j – 8] ^ w[j – 14] ^ w[j – 16], 1); } var t = _s(_s(_r(a, 5), _f(j, b, c, d)), _s(_s(e, w[j]), _k(j))); e = d; d = c; c = _r(b, 30); b = a; a = t; } a = _s(a, o); b = _s(b, p); c = _s(c, q); d = _s(d, r); e = _s(e, s); } return [a, b, c, d, e]; } function _b(s) { var b = [], m = (1 _z) – 1; for (var i = 0; i s.length * _z; i += _z) { b[i 5] |= (s.charCodeAt(i / 8) & m) (32 – _z – i % 32); } return b; } function _h(k, d) { var b = _b(k); if (b.length 16) { b = _c(b, k.length * _z); } var p = [16], o = [16]; for (var i = 0; i 16; i++) { p[i] = b[i] ^ 0x36363636; o[i] = b[i] ^ 0x5C5C5C5C; } var h = _c(p.concat(_b(d)), 512 + d.length * _z); return _c(o.concat(h), 512 + 160); } function _n(b) { var t = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”, s = ”; for (var i = 0; i b.length * 4; i += 3) { var r = (((b[i 2] 8 * (3 – i % 4)) & 0xFF) 16) | (((b[i + 1 2] 8 * (3 – (i + 1) % 4)) & 0xFF) 8) | ((b[i + 2 2] 8 * (3 – (i + 2) % 4)) & 0xFF); for (var j = 0; j 4; j++) { if (i * 8 + j * 6 b.length * 32) { s += _p; } else { s += t.charAt((r 6 * (3 – j)) & 0x3F); } } } return s; } function _x(k, d) { return _n(_h(k, d)); } return _x(k, d);}页面view class=”main”  button bindtap=’play’播放录音/button  button bindtap=’submit’上传/button    button bindtouchstart=”clickDown” bind:touchend=”clickUp”  touchcancel=”clickUp” bindtouchmove=”clickMove” class=”record_btn”  span wx:if=”{{recording}}”{{cancel_record?’松开取消’:’松开发送’}}/span  span wx:else按下录音/span  /button/view样式.record_btn{  position:absolute;  bottom: 0;  width: 100%;  height:110rpx;}简洁的页面录音=上传=然后去看控制台日志哈

赞(0) 打赏
未经允许不得转载:E企盈小程序开发-热线:4006-838-530 » 【小程序】语音识别(无需转码、无需后台)
分享到: 更多 (0)
E企盈小程序直播营销卖货系统
E企盈直播平台营销卖货系统

评论 抢沙发

E企盈小程序开发

联系我们联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏