当前位置:首页 > VUE

vue实现发送语音功能

2026-01-20 22:16:42VUE

实现语音录制功能

使用浏览器提供的MediaRecorder API进行语音录制。在Vue组件的data中定义相关变量:

data() {
  return {
    mediaRecorder: null,
    audioChunks: [],
    isRecording: false,
    audioBlob: null
  }
}

创建开始录制方法:

startRecording() {
  navigator.mediaDevices.getUserMedia({ audio: true })
    .then(stream => {
      this.mediaRecorder = new MediaRecorder(stream)
      this.mediaRecorder.start()
      this.isRecording = true

      this.mediaRecorder.ondataavailable = event => {
        this.audioChunks.push(event.data)
      }
    })
}

实现语音停止与保存

添加停止录制方法:

vue实现发送语音功能

stopRecording() {
  this.mediaRecorder.stop()
  this.isRecording = false

  this.mediaRecorder.onstop = () => {
    this.audioBlob = new Blob(this.audioChunks, { type: 'audio/wav' })
    this.audioChunks = []
  }
}

实现语音播放功能

创建播放录音的方法:

playRecording() {
  const audioURL = URL.createObjectURL(this.audioBlob)
  const audio = new Audio(audioURL)
  audio.play()
}

实现语音上传

添加上传到服务器的方法:

vue实现发送语音功能

uploadRecording() {
  const formData = new FormData()
  formData.append('audio', this.audioBlob, 'recording.wav')

  axios.post('/api/upload-audio', formData, {
    headers: { 'Content-Type': 'multipart/form-data' }
  }).then(response => {
    console.log('上传成功', response)
  })
}

组件模板示例

<template>
  <div>
    <button @click="startRecording" :disabled="isRecording">开始录音</button>
    <button @click="stopRecording" :disabled="!isRecording">停止录音</button>
    <button @click="playRecording" :disabled="!audioBlob">播放</button>
    <button @click="uploadRecording" :disabled="!audioBlob">上传</button>
  </div>
</template>

添加录音可视化

使用AudioContext实现简单的波形可视化:

setupVisualizer() {
  const audioContext = new AudioContext()
  const analyser = audioContext.createAnalyser()
  const canvas = this.$refs.visualizer
  const canvasCtx = canvas.getContext('2d')

  navigator.mediaDevices.getUserMedia({ audio: true })
    .then(stream => {
      const source = audioContext.createMediaStreamSource(stream)
      source.connect(analyser)
      this.visualize(analyser, canvas, canvasCtx)
    })
}

visualize(analyser, canvas, canvasCtx) {
  const WIDTH = canvas.width
  const HEIGHT = canvas.height
  analyser.fftSize = 2048

  const draw = () => {
    requestAnimationFrame(draw)
    const bufferLength = analyser.frequencyBinCount
    const dataArray = new Uint8Array(bufferLength)
    analyser.getByteTimeDomainData(dataArray)

    canvasCtx.fillStyle = 'rgb(200, 200, 200)'
    canvasCtx.fillRect(0, 0, WIDTH, HEIGHT)
    canvasCtx.lineWidth = 2
    canvasCtx.strokeStyle = 'rgb(0, 0, 0)'
    canvasCtx.beginPath()

    const sliceWidth = WIDTH * 1.0 / bufferLength
    let x = 0

    for(let i = 0; i < bufferLength; i++) {
      const v = dataArray[i] / 128.0
      const y = v * HEIGHT/2

      if(i === 0) {
        canvasCtx.moveTo(x, y)
      } else {
        canvasCtx.lineTo(x, y)
      }

      x += sliceWidth
    }

    canvasCtx.lineTo(canvas.width, canvas.height/2)
    canvasCtx.stroke()
  }

  draw()
}

添加录音时长限制

在开始录音时设置自动停止:

startRecording() {
  // ...之前的代码...

  // 设置60秒后自动停止
  this.recordingTimer = setTimeout(() => {
    this.stopRecording()
  }, 60000)
}

stopRecording() {
  clearTimeout(this.recordingTimer)
  // ...之前的代码...
}

标签: 语音功能
分享给朋友:

相关文章

vue实现ping功能

vue实现ping功能

实现Ping功能的思路 在Vue中实现Ping功能通常需要借助浏览器API或后端服务。由于浏览器环境限制,无法直接发送ICMP请求(传统Ping协议),但可通过以下两种方式模拟: HTTP请求模拟P…

vue实现倍速播放功能

vue实现倍速播放功能

实现倍速播放功能的方法 在Vue中实现倍速播放功能通常涉及HTML5的<video>元素或第三方播放器库(如video.js)的API调用。以下是具体实现方式: 使用原生HTML5 vi…

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 使用window.print()方法 Vue中可以直接调用浏览器的window.print()方法实现打印功能。这种方法简单快捷,适用于打印整个页面或特定区域。 meth…

vue实现tab功能

vue实现tab功能

Vue实现Tab功能的方法 使用动态组件和v-for指令 在Vue中实现Tab功能可以通过动态组件和v-for指令结合完成。定义一个包含tab标题和对应内容的数组,使用v-for渲染tab标题,并通过…

vue实现语音搜索

vue实现语音搜索

Vue 实现语音搜索的方法 在 Vue 中实现语音搜索功能可以通过浏览器的 Web Speech API 来完成。以下是一个完整的实现方案: 初始化语音识别对象 创建 Vue 组件时初始化语音识别对…

php实现回复功能

php实现回复功能

实现回复功能的基本步骤 在PHP中实现回复功能通常涉及数据库操作、表单处理和前后端交互。以下是实现回复功能的关键步骤: 数据库设计 创建包含回复数据的表结构,例如: CREATE TABLE re…