Uniapp移动端要进行websoket语音转文字,但是用AudioContext会报错Cannot read property 'AudioContext' of undefined"

Uniapp移动端要进行websoket语音转文字,但是用AudioContext会报错Cannot read property 'AudioContext' of undefined",是不是Uniapp不能使用AudioContext函数,不能的话=怎么把Uniapp的录音实时转化为Blob类型发送呢?急求!

该回答引用ChatGPT

Uniapp 支持使用 AudioContext 函数,但需要注意几点:

需要在页面的 script 标签中导入 webAudio.js ,然后在方法中调用。

需要在 manifest.json 文件中声明需要使用录音权限:


{
  "app-plus": {
    "permissions": {
      "record": {
        "desc": "用于录制音频"
      }
    }
  }
}

对于将录音实时转换为 Blob 类型发送的问题,可以将录音数据进行分段处理,每一段处理后合并成一个 Blob 对象,然后发送给后端进行语音转文字处理。具体实现可参考以下代码:


function startRecord() {
  uni.getRecorderManager().start({
    format: 'mp3',
    sampleRate: 16000,
    numberOfChannels: 1,
    encodeBitRate: 16000,
    frameSize: 2048
  })
  this.recording = true

  // 开始录音时初始化录音数据和 AudioContext 对象
  this.recorderData = []
  this.audioContext = new (window.AudioContext || window.webkitAudioContext)()

  // 获取麦克风输入流
  navigator.mediaDevices.getUserMedia({ audio: true }).then(stream => {
    this.audioInput = this.audioContext.createMediaStreamSource(stream)
    this.recorder = this.audioContext.createScriptProcessor(2048, 1, 1)

    // 处理录音数据并合并为 Blob 对象
    this.recorder.onaudioprocess = e => {
      if (!this.recording) return

      const buffer = e.inputBuffer.getChannelData(0)
      this.recorderData.push(new Float32Array(buffer))

      if (this.recorderData.length === 10) {
        const audioBlob = new Blob(this.recorderData, { type: 'audio/mp3' })
        this.recorderData = []

        // 发送语音数据到后端进行语音转文字处理
        this.sendAudioData(audioBlob)
      }
    }

    // 连接 AudioContext 对象
    this.audioInput.connect(this.recorder)
    this.recorder.connect(this.audioContext.destination)
  })
}

function stopRecord() {
  this.recording = false
  uni.getRecorderManager().stop()
}

以上代码中,startRecord 方法在开始录音时初始化录音数据和 AudioContext 对象,然后获取麦克风输入流,并将录音数据分段处理后合并成 Blob 对象发送给后端。stopRecord 方法则停止录音,并结束语音数据的处理。