JustinST 2023-02-20 19:05 采纳率: 0%
浏览 20

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

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

  • 写回答

1条回答 默认 最新

  • CodeBytes 2023-02-20 19:26
    关注

    该回答引用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 方法则停止录音,并结束语音数据的处理。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月20日

悬赏问题

  • ¥15 grbl为何无法移动到比复位坐标更小的坐标?
  • ¥60 怎样隐藏win7系统进程?
  • ¥15 CBF预处理数据归一化的时候报错了如下图
  • ¥15 qt 转 msvc 后 Opencv 始终打不开视频!
  • ¥15 yolo v5中labelimg的作用
  • ¥15 国赛c题2021,没有理解这一串代码的意思,这样报错该怎么解决(语言-matlab)
  • ¥15 一、执行完中断程序后如何继续运行,二、中断结束后如何跳过中断触发前的点位(LOW点不要继续运行,可以运行UP点)(关键词-程序运行)
  • ¥15 if为什么跳过if 直接执行else 中文
  • ¥200 解决登录微信老版本限制封号问题
  • ¥15 mysql中时间处理问题