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

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

浏览量:3136 时间: 来源:影TXX

微信小程序目前录音仅能生成 mp3和acc两种格式,而百度语音识别,讯飞语音识别都不支持mp3和acc的;

最后发现腾讯云和阿里云支持mp3,反正用的是腾讯的小程序,将就着用腾讯的接口咯

不想解说了,直接说流程+代码+注释吧

准备:

1.小程序账号(appid)

2.腾讯云控制后台申请语音识别服务(获取SecretId 和SecretKey),对应代码中的马赛克,自行替换

 

不建议直接搬代码就用,所以多少看下接口文档吧

小程序录音接口 和 腾讯云语音识别接口

主要流程:

一、小程序录音及临时路径获取

二、根据临时读取录音文件并转换成base64编码

三、调用语音识别接口(submit())

  1. 参数获取

  2. 加密并获取签名(需要用到hmac_sha1加密,找了挺久才找到的,在最下面)

  3. 发送请求

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;}

简洁的页面

录音=上传=然后去看控制台日志哈

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎