vue语音提示实现
实现语音提示的方法
使用Web Speech API
Vue中可以集成浏览器原生的Web Speech API实现语音合成(TTS)。通过SpeechSynthesisUtterance对象设置文本、语速、音调等参数,调用window.speechSynthesis.speak()播放语音。
// 在Vue组件中
methods: {
speak(text) {
const utterance = new SpeechSynthesisUtterance(text);
utterance.rate = 1; // 语速 (0.1-10)
utterance.pitch = 1; // 音调 (0-2)
window.speechSynthesis.speak(utterance);
}
}
第三方库:vue-speech
安装vue-speech库简化实现:
npm install vue-speech
在Vue中注册插件并调用:
import VueSpeech from 'vue-speech';
Vue.use(VueSpeech);
// 组件内使用
this.$speech({ text: '提示内容', lang: 'zh-CN' });
语音识别(ASR)的实现
Web Speech API的语音识别
通过SpeechRecognition接口实现语音输入转文字:
const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
recognition.lang = 'zh-CN';
recognition.onresult = (event) => {
const transcript = event.results[0][0].transcript;
console.log('识别结果:', transcript);
};
recognition.start();
第三方服务:阿里云/腾讯云SDK
接入云服务API需安装对应SDK,例如阿里云智能语音交互:
import NlsSDK from 'alibabacloud-nls';
const recognizer = new NlsSDK.SpeechRecognizer({
appkey: 'YOUR_APPKEY',
token: 'YOUR_TOKEN'
});
recognizer.on('recognized', (text) => {
console.log('识别文本:', text);
});
注意事项
兼容性处理
Web Speech API在移动端兼容性较差,需检测浏览器支持:
if (!('speechSynthesis' in window)) {
alert('当前浏览器不支持语音功能');
}
用户权限
语音识别需用户授权麦克风权限,建议在交互事件(如按钮点击)中触发。
性能优化
长时间语音识别可能占用资源,需在组件销毁时关闭服务:
beforeDestroy() {
window.speechSynthesis.cancel(); // 停止语音合成
recognition?.stop(); // 停止语音识别
}
示例:完整组件代码
<template>
<div>
<button @click="speak('语音提示内容')">播放语音</button>
<button @click="startRecognition">开始识别</button>
<p>识别结果: {{ recognizedText }}</p>
</div>
</template>
<script>
export default {
data() {
return {
recognizedText: '',
recognition: null
};
},
methods: {
speak(text) {
const utterance = new SpeechSynthesisUtterance(text);
window.speechSynthesis.speak(utterance);
},
startRecognition() {
this.recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
this.recognition.lang = 'zh-CN';
this.recognition.onresult = (event) => {
this.recognizedText = event.results[0][0].transcript;
};
this.recognition.start();
}
},
beforeDestroy() {
this.recognition?.stop();
}
};
</script>






