当前位置:   article > 正文

微信小程序调用科大讯飞语音文字转换无服务器代理解决方案_科大讯飞语音转文字 微信小程序

科大讯飞语音转文字 微信小程序

在使用小程序开发中有需求要用到科大讯飞的语音文字转换功能 在寻求过很多解决办法后没有找到较为合适的办法最终只能自行研究解决以下附上解决流程。

首先我们需要注册一个微信小程序开发者身份打开这个 首页 | 微信开放社区 网址,使用现有的微信扫码登录即可完成注册,然后通过这个网址微信开发者工具(开发版 Nightly Build)下载地址与更新日志 | 微信开放文档 进行工具下载

等待安装完成后打开小程序开发工具进行小程序的创建

 选择第一个模板来进行项目创建

删除自带所有代码后在主页添加按钮进行音频录制

wxml文件内容如下

  1. <view>
  2. <button
  3. class="tui-menu-list"
  4. bindtouchstart="startRecordMp3" //按下按钮事件
  5. bindtouchend="stopRecord" //抬起按钮事件
  6. type="primary">长按录音开始</button>
  7. </view>

wxss文件内容如下

  1. .tui-menu-list{
  2. position: absolute;
  3. left: 0;
  4. right: 0;
  5. bottom: 10px;
  6. margin: auto;
  7. }

效果图如下

js文件代码如下

  1. onLoad:function (options) {
  2. const that = this
  3. this.recorderManager = wx.getRecorderManager();
  4. this.options = {
  5. duration: 60000, // 指定录音的时常,单位ms
  6. sampleRate: 8000, // 采样率
  7. numberOfChannels: 1, // 录音通道数
  8. encodeBitRate: 48000, // 编码码率
  9. format: 'PCM', // 音频格式
  10. frameSize: 5, // 指定帧大小,单位KB
  11. }
  12. this.recorderManager.onError(function () {
  13. that.tip("录音失败!")
  14. })
  15. this.recorderManager.onStop(function (res) {
  16. src = res.tempFilePath;
  17. console.log(res.tempFilePath)
  18. that.tip(res.tempFilePath)
  19. })
  20. this.recorderManager.onFrameRecorded((res) => {
  21. const { frameBuffer } = res
  22. var int16Arr = new Int8Array(res.frameBuffer);
  23. const base64 = wx.arrayBufferToBase64(int16Arr)
  24. switch (status) {
  25. case 0:
  26. status = 1;
  27. var sendsty = '{"common":{"app_id":"讯飞的appid"},"business":{"language":"zh_cn","domain":"iat","accent":"mandarin","dwa":"wpgs","vad_eos":1000},"data":{"status":0,"format":"audio/L16;rate=8000","encoding":"raw","audio":"' + base64 + '"}}'
  28. wxst.send({
  29. data: sendsty
  30. })
  31. break;
  32. case 1:
  33. var sendsty = '{"data":{"status":1,"format":"audio/L16;rate=8000","encoding":"raw","audio":"' + base64 + '"}}'
  34. wxst.send({
  35. data: sendsty
  36. })
  37. break;
  38. default:
  39. console.log("default");
  40. }
  41. })
  42. this.innerAudioContext = wx.createInnerAudioContext()
  43. this.innerAudioContext.onError((res) =>{
  44. that.tip(res)
  45. })
  46. },

 按钮事件如下(包含录音权限获取)

  1. //录制mp3
  2. startRecordMp3: function (e) { //开始录音按钮
  3. var that = this;
  4. wx.getSetting({//查看用户有没有开启语音权限
  5. success(res) {
  6. if (res.authSetting['scope.record']) {
  7. wx.authorize({
  8. scope: 'scope.record',
  9. success() {
  10. that.stodd();
  11. },
  12. fail() {
  13. wx.showModal({
  14. title: '微信授权',
  15. content: '您当前未开启语音权限,请在右上角设置(···)中开启“录音功能”',
  16. showCancel: false,
  17. success(res) {
  18. if (res.confirm) {
  19. console.log('用户点击确定')
  20. }
  21. }
  22. })
  23. }
  24. })
  25. }else{
  26. var t = this;
  27. wx.authorize({
  28. scope: 'scope.record',
  29. success (res){
  30. console.log("录音授权成功",res);
  31. //app.globalData.audioplay = true
  32. // 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问
  33. // wx.startRecord();
  34. t.recorderManager = uni.getRecorderManager();
  35. t.innerAudioContext = uni.createInnerAudioContext();
  36. // 为了防止苹果手机静音无法播放
  37. uni.setInnerAudioOption({
  38. obeyMuteSwitch: false
  39. })
  40. t.innerAudioContext.autoplay = true;
  41. console.log("uni.getRecorderManager()",uni.getRecorderManager())
  42. t.recorderManager.onStop(function (res) {
  43. console.log('recorder stop' + JSON.stringify(res));
  44. t.voicePath = res.tempFilePath;
  45. });
  46. },
  47. fail(){
  48. console.log("第一次录音授权失败");
  49. wx.showModal({
  50. title: '提示',
  51. content: '您未授权录音,功能将无法使用',
  52. showCancel: true,
  53. confirmText: "授权",
  54. confirmColor: "#AF1F25",
  55. success(res){
  56. if (res.confirm){
  57. //确认则打开设置页面(自动切到设置页)
  58. wx.openSetting({
  59. success: (res) => {
  60. console.log(res.authSetting);
  61. if (!res.authSetting['scope.record']) {
  62. //未设置录音授权
  63. console.log("未设置录音授权");
  64. wx.showModal({
  65. title: '提示',
  66. content: '您未授权录音,功能将无法使用', // 可以自己编辑
  67. showCancel: false,
  68. success: function (res) {
  69. console.log("不知道打印的啥?")
  70. },
  71. })
  72. } else {
  73. //第二次才成功授权
  74. console.log("设置录音授权成功");
  75. //app.globalData.audioplay = true;
  76. t.recorderManager = uni.getRecorderManager();
  77. t.innerAudioContext = uni.createInnerAudioContext();
  78. // 为了防止苹果手机静音无法播放
  79. uni.setInnerAudioOption({
  80. obeyMuteSwitch: false
  81. })
  82. t.innerAudioContext.autoplay = true;
  83. console.log("uni.getRecorderManager()",uni.getRecorderManager())
  84. t.recorderManager.onStop(function (res) {
  85. console.log('recorder stop' + JSON.stringify(res));
  86. t.voicePath = res.tempFilePath;
  87. });
  88. }
  89. },
  90. fail: function () {
  91. console.log("授权设置录音失败");
  92. }
  93. })
  94. } else if (res.cancel){
  95. console.log("cancel");
  96. }
  97. } ,
  98. fail (){
  99. console.log("openfail");
  100. }
  101. })
  102. }
  103. })
  104. }
  105. }
  106. })
  107. },
  108. //停止录音
  109. stopRecord:function () { //结束录音按钮
  110. var that = this;
  111. const recorderManager = wx.getRecorderManager();
  112. recorderManager.stop();
  113. that.setData({//关闭遮罩层
  114. shows: false,
  115. })
  116. },

在录制语音开始时会触发科大讯飞鉴权事件鉴权代码如下

  1. const CryptoJS = require('crypto-js');
  2. const Base64 = require('base64js').Base64;
  3. var url = 'wss://iat-api.xfyun.cn/v2/iat'
  4. var host = 'iat-api.xfyun.cn'
  5. var apiKey = 科大讯飞官网获取'
  6. var apiSecret = '科大讯飞官网获取'
  7. var timedate = new Date().toString();
  8. var strarr = timedate.split("+");
  9. var timestr = strarr[0].toString();
  10. var timearr = timestr.split(' ');
  11. var date = timearr[0] + ", " + timearr[2] + " " + timearr[1] + " " + timearr[3] + " " + timearr[4] + " " + timearr[5];
  12. console.log(date);
  13. var algorithm = 'hmac-sha256'
  14. var headers = 'host date request-line'
  15. var signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v2/iat HTTP/1.1`
  16. var signatureSha = CryptoJS.HmacSHA256(signatureOrigin, apiSecret)
  17. var signature = CryptoJS.enc.Base64.stringify(signatureSha)
  18. var authorizationOrigin = `api_key="${apiKey}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`
  19. var authorization =Base64.encode(authorizationOrigin)
  20. console.log(authorization)
  21. url = `${url}?authorization=${authorization}&date=${encodeURIComponent(date)}&host=${host}`
  22. const hosturl = url

设置录音格式并且沟通科大讯飞鉴权

  1. stodd:function () {
  2. const options = {
  3. duration: 60000, // 指定录音的时常,单位ms
  4. sampleRate: 8000, // 采样率
  5. numberOfChannels: 1, // 录音通道数
  6. encodeBitRate: 48000, // 编码码率
  7. format: 'pcm', // 音频格式
  8. frameSize: 5, // 指定帧大小,单位KB
  9. }
  10. const recorderManager = wx.getRecorderManager();
  11. const app = getApp();
  12. const hosturl = app.globalData.hosturl;
  13. var xfurl = hosturl;
  14. console.log(xfurl);
  15. wxst = wx.connectSocket({ // 开启websocket连接
  16. url: xfurl,
  17. method: 'GET',
  18. success: function (res) {
  19. recorderManager.start(options);//开始录音
  20. }
  21. });
  22. },

录制完成后提交数据

  1. webSocketSend:function(audioData) {
  2. console.log('开始发送数据',audioData)
  3. let that = this
  4. let audioDataUp = audioData.splice(0, 1)
  5. var params = {
  6. common: {
  7. app_id:"科大讯飞官网控制台获取",
  8. },
  9. business: {
  10. language:'zh_cn',
  11. domain:'iat',
  12. accent:'mandarin',
  13. },
  14. data: {
  15. status: 0,
  16. encoding: 'raw',
  17. format: 'audio/L16;rate=8000',
  18. data: that.toBase64(audioDataUp[0]),
  19. },
  20. }
  21. console.log(JSON.stringify(params))
  22. socketTask.send({data: JSON.stringify(params)})
  23. handlerInterval = setInterval(() => {
  24. // websocket未连接
  25. if (!socketTask) {
  26. clearInterval(handlerInterval)
  27. return
  28. }
  29. // 最后一帧
  30. if (audioData.length === 0) {
  31. console.log('数据发送完毕')
  32. socketTask.send(
  33. {data:
  34. JSON.stringify({
  35. business: {
  36. "language":"zh_cn",
  37. "domain":"iat",
  38. "accent":"mandarin"
  39. },
  40. data: {
  41. status: 2,
  42. encoding: 'raw',
  43. format: 'audio/L16;rate=8000',
  44. data: '',
  45. },
  46. })}
  47. )
  48. audioData = []
  49. clearInterval(handlerInterval)
  50. return false
  51. }
  52. audioDataUp = audioData.splice(0, 1)
  53. // 中间帧
  54. console.log('audioDataUp:',audioDataUp[0])
  55. socketTask.send(
  56. {
  57. data:
  58. JSON.stringify({
  59. business: {
  60. "language":"zh_cn",
  61. "domain":"iat",
  62. "accent":"mandarin"
  63. },
  64. data: {
  65. status: 0,
  66. encoding: 'raw',
  67. format: 'audio/L16;rate=8000',
  68. data: that.toBase64(audioDataUp[0]),
  69. },
  70. })}
  71. )
  72. }, 40)
  73. },
  74. result(resultData) {
  75. // 识别结束
  76. let jsonData = JSON.parse(resultData)
  77. }

剩下的就是数据处理以及展示了。

本次内容也就告一段落了,后面等我页面数据处理完成并做完本地化后继续更新 喜欢的可以点赞关注下谢谢大家了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/77593
推荐阅读
相关标签
  

闽ICP备14008679号