当前位置:首页 > 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实现倒计时功能

vue实现倒计时功能

vue实现倒计时功能 在Vue中实现倒计时功能可以通过多种方式完成,以下是几种常见的方法: 方法一:使用setInterval和clearInterval 创建一个倒计时组件,利用setInter…

h5实现点击复制功能

h5实现点击复制功能

使用document.execCommand方法(兼容旧浏览器) 通过document.execCommand('copy')实现复制功能,需先选中文本内容。创建一个隐藏的textarea或input…

vue功能实现难点

vue功能实现难点

Vue 功能实现的常见难点 响应式系统深度监听 Vue 的响应式系统基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3),但对嵌套对象或数组的深层属性变化需要额外…

php购物车功能的实现

php购物车功能的实现

实现购物车功能的基本方法 使用PHP实现购物车功能可以通过会话(Session)或数据库存储购物车数据。以下是两种常见方法的详细说明。 使用Session存储购物车数据 PHP的$_SESSION可…

vue实现插件功能

vue实现插件功能

Vue 插件实现方法 安装与注册插件 在 Vue 项目中,插件通常以独立模块形式存在。通过 Vue.use() 方法注册插件,该方法会自动调用插件的 install 函数。 // 引入插件 imp…

vue 分页功能实现

vue 分页功能实现

分页功能实现方法 使用 Element UI 的分页组件 Element UI 提供了现成的分页组件 el-pagination,可以快速实现分页功能。 安装 Element UI: npm in…