当前位置:首页 > 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)
      }
    })
}

实现语音停止与保存

添加停止录制方法:

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()
}

实现语音上传

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

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()
}

添加录音时长限制

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

vue实现发送语音功能

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

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

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

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

相关文章

vue实现功能

vue实现功能

Vue 功能实现方法 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是实现常见功能的几种方法: 数据绑定与响应式更新 在 Vue 中,数据绑定通过 v-model…

vue实现功能

vue实现功能

Vue 实现功能的方法 Vue.js 是一个流行的前端框架,用于构建用户界面。以下是几种常见的功能实现方法: 数据绑定 Vue 提供了双向数据绑定,可以通过 v-model 指令实现表单输入和应用状…

vue实现语音播报

vue实现语音播报

使用 Web Speech API 实现语音播报 Vue 中可以通过 Web Speech API 的 SpeechSynthesis 接口实现语音播报功能。该 API 是现代浏览器原生支持的语音合成…

vue实现付费功能

vue实现付费功能

Vue 实现付费功能的方法 集成第三方支付平台 选择适合的第三方支付平台(如支付宝、微信支付、Stripe、PayPal等),并按照其文档进行集成。在 Vue 项目中,可以通过引入支付平台的 SDK…

vue实现语音导航

vue实现语音导航

实现语音导航的基本思路 在Vue中实现语音导航功能,主要依赖浏览器的Web Speech API。该API包含语音识别(SpeechRecognition)和语音合成(SpeechSynthesis)…

php 实现聊天功能

php 实现聊天功能

PHP 实现聊天功能的方法 使用 WebSocket 和 Ratchet 库 WebSocket 是实现实时聊天的理想选择。Ratchet 是一个 PHP 库,用于处理 WebSocket 连接。…