小程序调用科大讯飞无服务器代理流程二

文章详细介绍了如何在小程序中使用科大讯飞的语音转文字功能,包括录音文件数据提取,数据转base64,通过WebSocket提交数据,以及接收和处理科大讯飞返回的结果,最后展示了内容的展示方式。强调了真机测试的重要性以确保数据的准确性和效率。
摘要由CSDN通过智能技术生成

上一篇介绍了小程序调用科大讯飞语音转文字功能服务器访问流程,这次继续上次内容介绍提交数据和数据解析功能。这里要着重强调下在做测试阶段一定要使用真机测试电脑端的数据格式可能有误差,为了保证数据的可靠性以及响应效率推荐使用手机测试。

第一步:录音文件数据提取,在使用小程序录制文件成功后我们需要用到onFrameRecorded这个方法将当前的语音数据转为buff存放数组中从而进行与科大讯飞服务器的提交。

onLoad:function (options) {
    const that = this
    this.recorderManager = wx.getRecorderManager();
    this.options = {
      duration: 60000, // 指定录音的时常,单位ms
      sampleRate: 8000, // 采样率
      numberOfChannels: 1, // 录音通道数
      encodeBitRate: 48000, // 编码码率
      format: 'PCM', // 音频格式
      frameSize: 5, // 指定帧大小,单位KB
    }
    this.recorderManager.onError(function () {
      that.tip("录音失败!")
    })
    this.recorderManager.onStop(function (res) {
      src = res.tempFilePath;
      console.log(res.tempFilePath)
      that.startUpRecord()
    })
//解析当前录制音频每一帧内容保存数组准备提交科大讯飞进行语音文字转换(audioData 为提交数据数组)
    this.recorderManager.onFrameRecorded((res) => {
      const { frameBuffer } = res
      let u8Arr = new Uint8Array(frameBuffer)
      audioData.push(u8Arr)
    })
    this.innerAudioContext = wx.createInnerAudioContext()
    this.innerAudioContext.onError((res) =>{
      that.tip(res)
    })
  },

第二步:数据提交,在提交数据时我们需要将上一步存放内容的数组中的数据转为base64的字符串用以提交。

 webSocketSend:function() {
    console.log('开始发送数据')
    let that = this
    let audioDataUp = audioData
    var params = {
      common: {
        app_id:"科大讯飞控制台获取",
      },
//设置提交格式
      business: {
        language:'zh_cn',
        domain:'iat',
        accent:'mandarin',
      },
//提交内容的处理
      data: {
        status: 0,
        encoding: 'raw',
        format: 'audio/L16;rate=8000',
        audio: that.uint8arrayToBase64(audioDataUp[0]),//将提交数据转为base64编码
      },
    }
    socketTask.send({data: JSON.stringify(params)})
    handlerInterval = setInterval(() => {
      // websocket未连接
      if (!socketTask) {
        clearInterval(handlerInterval)
        return
      }
      // 最后一帧
      if (audioData.length === 0) {
          console.log('数据发送完毕')
          socketTask.send(
            {data:
            JSON.stringify({
              business: {
                "language":"zh_cn",
                "domain":"iat",
                "accent":"mandarin"
              },
              data: {
                status: 2,
                encoding: 'raw',
                format: 'audio/L16;rate=8000',
                audio: '',
              },
            })}
          )
          audioData = []
          clearInterval(handlerInterval)
        
        return false
      }
      audioDataUp = audioData.splice(0, 1)
      // 中间帧
      console.log('audioDataUp:',audioDataUp[0])
      socketTask.send(
        {
          data:
        JSON.stringify({
          business: {
            "language":"zh_cn",
            "domain":"iat",
            "accent":"mandarin"
          },
          data: {
            status: 0,
            encoding: 'raw',
            format: 'audio/L16;rate=8000',
            audio: that.uint8arrayToBase64(audioDataUp[0]),
          },
        })}
      )
    }, 40)
  },
  result(resultData) {
    socketTask.close()
  },

将音频数据转为base64方法

先在小程序中引入base64.js文件

const Base64 = require('../../base64js').Base64;
uint8arrayToBase64 : function(u8Arr) {
  try{
         let CHUNK_SIZE = 0x8000; //arbitrary number
         let index = 0;
         let length = u8Arr.length;
         let result = '';
         let slice;
         while (index < length) {
             slice = u8Arr.subarray(index, Math.min(index + CHUNK_SIZE, length));
             result += String.fromCharCode.apply(null, slice);
             index += CHUNK_SIZE;
         }
         // web image base64图片格式: "data:image/png;base64," + b64encoded;
         // return  "data:image/png;base64," + btoa(result);
         return Base64.btoa(result);
     }
     catch(e) {
         throw e;
     }
},

第三步 科大讯飞返回数据的接收和使用

  startUpRecord:function(){
    let that = this
    const app = getApp();
    const hosturl = app.globalData.hosturl;
      let newURL = hosturl
      socketTask = wx.connectSocket({
        url: newURL,
      })
      socketTask.onOpen(()=>{
        console.log('打开了socket')
        that.webSocketSend()
      })
      socketTask.onMessage((e)=>{
        // result 内包含科大讯飞处理后的语音内容,由于是分段返回所以要进行内容的处理
        console.log(e)
        let jsonData = JSON.parse(e.data)
        let jsonArr = jsonData.data.result.ws
        for (let i = 0; i < jsonArr.length; i++) {
          const element = jsonArr[i];
          let str = element.cw[0].w
          this.resultStr = this.resultStr + str
         }
         console.log(this.resultStr)
         this.setData({
           text : this.resultStr//科大讯飞语音转换结果后的内容的文字
         })
      })
      socketTask.onError((err)=>{
        //结束录音
        console.log('socket 出错:',err)
      })
      socketTask.onClose(()=>{
        // 结束录音
        console.log('socket 关闭:')
      })
  },

内容的展示:展示页面添加text用来展示处理后的内容

wxml文件

<view>
  <text class="wenben">{{text}}</text>
<button 
  class="tui-menu-list"
  bindtouchstart="startRecordMp3" 
  bindtouchend="stopRecord"
  type="primary">长按录音开始</button>
</view>

wxss文件内容

.wenben{
  position: absolute;
  height: 60%;
  top: 30px;
  left: 10px;
  right: 10px;
  margin: auto;
}
.tui-menu-list{
  position: absolute;
  left: 0;
  right: 0;
  bottom: 30px;
  margin: auto;
}

效果图如下

起始内容如下

 

 

处理后返回内容后结果如下

 

到此小程序使用科大讯飞语音转文字功能已经介绍完毕 ,下一章节的内容为将当前的音频数据和转换后的内容保存到微信云服务中 并在记录列表中展示。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想你知道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值