美文网首页
vue中使用短语音识别和文本在线合成,音频转文字以及文字转音频

vue中使用短语音识别和文本在线合成,音频转文字以及文字转音频

作者: 我写的代码绝对没有问题 | 来源:发表于2023-10-16 17:05 被阅读0次

今天介绍百度云的两种技术:短语音识别和文本在线合成。语音识别,新注册的的用户可以免费领取三个月的使用。


image.png

1. 业务场景是,在查询的输入框加了一个录音按钮,点击录音按钮弹出弹框,点击进行录音,点击结束录音,把录音音频使用百度智能云的短语音识别成文字(音频转文字),然后进行查询搜索。

html部分:

<svg-icon
 slot="suffix"
 icon-class="icon-recorder"
 class="icon-recorder"
 style="color: #333333"
 @click="startRecorder"
/>

data部分:

   // 录音
      recorderDialogVisible: false,
      rec: null,
      recordBase64: '',
      flag: false, // false 代表还没开始录音
      audioUrl: ''

js部分:

 created() {
    this.flag = false
  },

methods: {
 // 录音
    startRecorder() {
      // 创建录音对象
      this.rec = Recorder({
        type: 'wav', // 录音格式,可以换成wav等其他格式
        sampleRate: 16000, // 阿里采样率16000 录音的采样率,越大细节越丰富越细腻
        bitRate: 16, // 录音的比特率,越大音质越好
        onProcess: (
          buffers,
          powerLevel,
          bufferDuration,
          bufferSampleRate,
          newBufferIdx,
          asyncEnd
        ) => {
          // 录音实时回调,大约1秒调用12次本回调
          // 可实时绘制波形,实时上传(发送)数据
          if (this.wave) {
            this.wave.input(buffers[buffers.length - 1], powerLevel, bufferSampleRate)
          }
        }
      })

      // 打开录音,获得权限
      this.rec.open(
        () => {
          console.log('录音已打开')
          if (this.$refs.recwave) {
            // 创建音频可视化图形绘制对象
            this.wave = Recorder.WaveView({ elem: this.$refs.recwave })
          }
        },
        (msg, isUserNotAllow) => {
          // 用户拒绝了录音权限,或者浏览器不支持录音
          console.log((isUserNotAllow ? 'UserNotAllow,' : '') + '无法录音:' + msg)
          // isUserNotAllow代表用户拒绝授权或浏览器不支持录音
          if (isUserNotAllow) {
            this.msgError('无法录音:' + msg)
          } else {
            // 设备不支持
            this.msgError('无法录音:' + '设备不支持')
          }
        }
      )
      // 权限请求被忽略
      window.waitDialogClick = () => {
        this.msgError('麦克风权限请求被忽略')
      }
      this.recorderDialogVisible = true
    },
    // 开始录音
    recStart() {
      this.flag = true
      if (!this.rec) {
        console.error('未打开录音')
        return
      }
      this.rec.start()
      console.log('已开始录音')
    },
    // 结束录音
    recStop() {
      if (!this.rec) {
        console.error('未打开录音')
        return
      }
      this.rec.stop(
        (blob, duration) => {
          // blob就是我们要的录音文件对象,可以上传,或者本地播放
          this.recBlob = blob
          // 简单利用URL生成本地文件地址,此地址只能本地使用,比如赋值给audio.src进行播放,赋值给a.href然后a.click()进行下载(a需提供download="xxx.mp3"属性)
          var localUrl = (window.URL || webkitURL).createObjectURL(blob)
          console.log('录音成功', blob, localUrl, '时长:' + duration + 'ms')
          this.size = blob.size // 文件字节大小
          this.upload(blob) // 把blob文件上传到服务器
          this.rec.close() // 关闭录音,释放录音资源,当然可以不释放,后面可以连续调用start
          this.rec = null
        },
        err => {
          console.error('结束录音出错:' + err)
          this.rec.close() // 关闭录音,释放录音资源,当然可以不释放,后面可以连续调用start
          this.rec = null
        }
      )
    },
    // blob流转换为base64
    blobToDataURI(blob, callback) {
      var reader = new FileReader()
      reader.readAsDataURL(blob)
      reader.onload = e => {
        callback(reader.result)
      }
    },

    upload(blob) {
      // blob格式再转换为base64格式 并且去头部
      this.blobToDataURI(blob, result => {
        var base64String = result
        this.recordBase64 = base64String.replace(/^data:audio\/\w+;base64,/, '') // 去掉base64位头部
      })

      this.main()
    },
    async main() {
      axios({
        url: 'https://vop.baidu.com/server_api',
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          Accept: 'application/json'
        },
        data: {
          format: 'wav',
          rate: 16000,
          channel: 1,
          cuid: '', // KpvVkGmfdIohVMVI3awvua79
          token: await this.getAccessToken(),
          speech: this.recordBase64,
          len: this.size
        }
      })
        .then(res => {
          this.recordBase64 = ''
          this.params.searchText = res.data.result[0]
          this.recorderDialogVisible = false
          this.handleQuery()
          this.wave = null
          this.flag = false
        })
        .catch(error => {
          console.log('错误提示', error)
          this.recordBase64 = ''
          this.params.searchText = ''
          this.recorderDialogVisible = false
          this.wave = null
          this.flag = false
        })
    },

    /**
     * 使用 AK,SK 生成鉴权签名(Access Token)
     * @return string 鉴权签名信息(Access Token)
     */
    getAccessToken() {
      const request = require('request')
      const AK = '' // 百度云申请的
      const SK = '' // 百度云申请的
      const options = {
        method: 'POST',
        url:
          'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' +
          AK +
          '&client_secret=' +
          SK
      }
      return new Promise((resolve, reject) => {
        request(options, (error, response) => {
          if (error) {
            reject(error)
          } else {
            resolve(JSON.parse(response.body).access_token)
          }
        })
      })
    },
    onClose() {
      // 结束录音后关闭弹框把内容传到input框
      // 如果点了录音没有结束直接点击关闭弹框
      if (this.recordBase64 === '') {
        this.rec.close() // 关闭录音
        this.rec = null
        this.wave = null
        this.recorderDialogVisible = false
        this.flag = false
        return
      }
      if (!this.rec) {
        console.error('未打开录音')
      } else {
        this.rec.stop(
          (blob, duration) => {
            // blob就是我们要的录音文件对象,可以上传,或者本地播放
            this.recBlob = blob
            // 简单利用URL生成本地文件地址,此地址只能本地使用,比如赋值给audio.src进行播放,赋值给a.href然后a.click()进行下载(a需提供download="xxx.mp3"属性)
            var localUrl = (window.URL || webkitURL).createObjectURL(blob)
            this.size = blob.size
            this.rec.close() // 关闭录音,释放录音资源,当然可以不释放,后面可以连续调用start
            this.rec = null
          },
          err => {
            console.error('结束录音出错:' + err)
            this.rec.close() // 关闭录音,释放录音资源,当然可以不释放,后面可以连续调用start
            this.rec = null
          }
        )
      }
      this.wave = null
      this.recorderDialogVisible = false
      this.flag = false
    },
}

2. 业务场景是,把文字使用百度智能云的文本在线合成音频文件(文字转音频),进行播放。
js部分:

async playFullText() {
      // 合成参数
      const options = {
        per: 4, // 发音人,4代表度丫丫
        spd: 5, // 语速,取值0-9,默认为5中语速
        pit: 5, // 语调,取值0-9,默认为5中语调
        vol: 5 // 音量,取值0-15,默认为5中音量
      }
      const playAudio = audioUrl => {
        const audio = new Audio(audioUrl)
        audio.play()
      }
      axios({
        url: 'https://tsn.baidu.com/text2audio',
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          Accept: '*/*'
        },
        responseType: 'blob',
        params: {
          tex: '测试',
          tok: await this.getAccessToken(),
          cuid: '', // KpvVkGmfdIohVMVI3awvua79
          ctp: '1',
          lan: 'zh',
          spd: '5',
          pit: '5',
          vol: '5',
          per: '1',
          aue: '3'
        }
      })
        .then(res => {
          const audioData = res.data /* 二进制数据 */
          const blob = new Blob([audioData], { type: 'audio/mpeg' }) // 替换 'audio/mpeg' 为你的音频类型
          // 创建可供流式播放的 URL
          const audioUrl = URL.createObjectURL(blob)
          const audio = new Audio(audioUrl)
          audio.play()
        })
        .catch(error => {
          console.log('错误提示', error)
        })
    },
image.png image.png

相关文章

网友评论

      本文标题:vue中使用短语音识别和文本在线合成,音频转文字以及文字转音频

      本文链接:https://www.haomeiwen.com/subject/poaxidtx.html