当前位置:首页 > VUE

vue 实现语音播报

2026-01-18 23:47:03VUE

实现语音播报的基本方法

在Vue中实现语音播报可以通过Web Speech API完成,该API提供了语音合成(SpeechSynthesis)功能。以下是具体实现步骤:

创建语音播报组件

新建一个Vue组件(如VoiceSpeaker.vue),核心代码如下:

vue 实现语音播报

<template>
  <button @click="speak">播放语音</button>
</template>

<script>
export default {
  methods: {
    speak() {
      const utterance = new SpeechSynthesisUtterance();
      utterance.text = '这是要播报的内容';
      utterance.lang = 'zh-CN'; // 设置中文语音
      utterance.rate = 1; // 语速 (0.1-10)
      utterance.pitch = 1; // 音高 (0-2)

      window.speechSynthesis.speak(utterance);
    }
  }
}
</script>

浏览器兼容性处理

不同浏览器对Web Speech API的支持程度不同,需要添加兼容性检查:

mounted() {
  if (!('speechSynthesis' in window)) {
    console.warn('当前浏览器不支持语音合成API');
  }
}

语音队列管理

避免连续播报时语音重叠,可以添加队列管理:

vue 实现语音播报

data() {
  return {
    speechQueue: []
  }
},
methods: {
  addToQueue(text) {
    this.speechQueue.push(text);
    if (this.speechQueue.length === 1) {
      this.processQueue();
    }
  },
  processQueue() {
    if (this.speechQueue.length === 0) return;

    const utterance = new SpeechSynthesisUtterance(this.speechQueue[0]);
    utterance.onend = () => {
      this.speechQueue.shift();
      this.processQueue();
    };
    speechSynthesis.speak(utterance);
  }
}

语音控制功能

添加暂停、继续和停止功能:

methods: {
  pauseSpeech() {
    window.speechSynthesis.pause();
  },
  resumeSpeech() {
    window.speechSynthesis.resume();
  },
  cancelSpeech() {
    window.speechSynthesis.cancel();
    this.speechQueue = [];
  }
}

多语言支持

通过检测浏览器支持的语音列表实现多语言选择:

data() {
  return {
    voices: [],
    selectedVoice: null
  }
},
mounted() {
  speechSynthesis.onvoiceschanged = () => {
    this.voices = speechSynthesis.getVoices();
    this.selectedVoice = this.voices.find(voice => 
      voice.lang.includes('zh') || voice.lang.includes('en')
    );
  };
}

注意事项

  • 某些浏览器需要用户交互(如点击事件)后才能触发语音播报
  • 移动端浏览器可能对连续语音播报有限制
  • 语音质量取决于操作系统安装的语音引擎
  • 在组件销毁时应该取消所有语音:
beforeDestroy() {
  window.speechSynthesis.cancel();
}

完整组件示例

<template>
  <div>
    <input v-model="textToSpeak" placeholder="输入播报内容">
    <button @click="speak">播放</button>
    <button @click="pauseSpeech">暂停</button>
    <button @click="resumeSpeech">继续</button>
    <button @click="cancelSpeech">停止</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      textToSpeak: '',
      voices: [],
      selectedVoice: null
    }
  },
  mounted() {
    if ('speechSynthesis' in window) {
      speechSynthesis.onvoiceschanged = () => {
        this.voices = speechSynthesis.getVoices();
        this.selectedVoice = this.voices.find(voice => 
          voice.lang.includes('zh') || voice.lang.includes('en')
        );
      };
    }
  },
  methods: {
    speak() {
      if (!this.textToSpeak.trim()) return;

      const utterance = new SpeechSynthesisUtterance(this.textToSpeak);
      utterance.voice = this.selectedVoice;
      utterance.lang = 'zh-CN';
      window.speechSynthesis.speak(utterance);
    },
    pauseSpeech() {
      window.speechSynthesis.pause();
    },
    resumeSpeech() {
      window.speechSynthesis.resume();
    },
    cancelSpeech() {
      window.speechSynthesis.cancel();
    }
  },
  beforeDestroy() {
    window.speechSynthesis.cancel();
  }
}
</script>

标签: 语音vue
分享给朋友:

相关文章

vue 实现blog

vue 实现blog

Vue 实现博客的基本步骤 使用 Vue 实现博客可以分为前端和后端两部分,前端使用 Vue.js 框架,后端可以选择 Node.js、Python 或其他服务端语言。以下是一个基于 Vue 的博客实…

vue实现list

vue实现list

Vue 实现列表渲染 在 Vue 中,可以使用 v-for 指令来渲染列表。v-for 指令基于一个数组或对象来渲染一个列表,可以遍历数组或对象的属性。 基本列表渲染 <template>…

vue实现城市

vue实现城市

Vue 实现城市选择功能 使用 Element UI 的 Cascader 组件 Element UI 提供了一个 Cascader 级联选择器组件,非常适合实现城市选择功能。需要先安装 Elemen…

vue实现烟花

vue实现烟花

Vue 实现烟花效果 在 Vue 中实现烟花效果可以通过结合 CSS 动画和 JavaScript 动态生成烟花元素。以下是具体实现方法: 动态生成烟花元素 通过 Vue 的 v-for 动态生成烟…

vue原生实现

vue原生实现

Vue 原生实现方法 在 Vue 中实现原生功能通常指直接使用 Vue 的核心特性(如指令、响应式数据、组件等)而非依赖第三方库。以下是几种常见场景的原生实现方式: 数据绑定与响应式更新 Vue 的…

vue实现word文档实现预览

vue实现word文档实现预览

在Vue中实现Word文档预览可以通过多种方式实现,以下是几种常见的方法: 使用mammoth.js库 mammoth.js是一个将Word文档(.docx)转换为HTML的JavaScript库,…