前言:
HTML5中和Web Speech相关的API实际上有两类,一类是“语音识别(Speech Recognition)”,另外一个就是“语音合成(Speech Synthesis)”, 这两个名词实际上指的分别是“语音转文字”,和“文字变语音”。
speak() – 只能接收SpeechSynthesisUtterance作为唯一的参数,作用是读合成的话语。 stop() – 立即终止合成过程。 pause() – 暂停合成过程。 resume() – 重新开始合成过程。 getVoices() – 此方法不接受任何参数,用来返回浏览器支持的语音包列表,是个数组。 speechSynthesis.getVoices()返回因每个浏览器不同及版本的不同返回不太一样,大致是这样:
注意:语言包获取不稳定,有时候返回为空,可以用定时器多试几次。
- SpeechSynthesisUtterance主要用来构建语音合成实例,
- speechSynthesis大概用来触发浏览器语音模块,让浏览器把内容读出来。 想要浏览器开口说话,只需要:
let speechInstance = new SpeechSynthesisUtterance('大家好,我是渣渣辉。'); speechSynthesis.speak(speechInstance);` 就是这么简单,不妨copy进浏览器试一下? // 更换语言 var msg = new SpeechSynthesisUtterance(); var voices = window.speechSynthesis.getVoices(); // 获取语言包 msg.voice = voices[18]; // 18:普通话 msg.text = "Hello World"; speechSynthesis.speak(msg); //
SpeechSynthesisUtterance实例有以下属性,可以通过设置一下属性调整发音:
-
text – 要合成的文字内容,字符串。
-
lang – 使用的语言,字符串, 例如:"zh-cn"
-
voiceURI – 指定希望使用的声音和服务,字符串。
-
volume – 声音的音量,区间范围是0到1,默认是1。
-
rate – 语速,数值,默认值是1,范围是0.1到10,表示语速的倍数,例如2表示正常语速的两倍。
-
pitch – 表示说话的音高,数值,范围从0(最小)到2(最大)。默认值为1。
还有一些方法: - onstart – 语音合成开始时候的回调。
- onpause – 语音合成暂停时候的回调。
- onresume – 语音合成重新开始时候的回调。
- onend – 语音合成结束时候的回调。
- speechSynthesis对象有以下方法:
一、原生写法
代码如下:
<template>
<div class="box">
<!-- <input type="text" name="text" id="text" v-model="text" /> -->
<button @click="playVoice">播放语音</button>
<button @click="pauseVoice" v-if="status === '开始播放'">暂停播放</button>
<button @click="resumeVoice" v-if="status === '暂停播放'">继续播放</button>
<button @click="stopVoice">停止播放</button>
<div>播放状态:{{ status }}</div>
</div>
</template>
<script>
const synth = window.speechSynthesis
const msg = new window.SpeechSynthesisUtterance()
export default {
data() {
return {
currentMsgIndex: 0,
text: "",
status: "",
tableData: [
{ text: '切换后基站BCCH与TCH电平不一致' },
{ text: '切换带异常' },
{ text: '切换后TA偏大' },
{ text: '切换后基站BCCH与TCH电平不一致' },
{ text: '切换带异常' },
{ text: '切换后TA偏大' },
{ text: '切换后基站BCCH与TCH电平不一致' },
{ text: '切换带异常' },
{ text: '切换后TA偏大' }
]
}
},
created() {
this.playVoice()
},
mounted() {
msg.onstart = e => {
// this.currentMsgIndex = 0
this.status = '开始播放'
console.log(this.status)
}
msg.onend = e => {
this.status = '结束播放'
console.log(this.status)
this.currentMsgIndex++
if (this.currentMsgIndex < this.tableData.length) {
this.playVoice()
} else {
this.currentMsgIndex = 0
}
console.log(this.currentMsgIndex)
}
msg.onpause = e => {
this.status = "暂停播放"
console.log('onpause:', this.status)
}
},
destroyed() {
this.stopVoice()
},
methods: {
//播放
playVoice() {
this.handleSpeak(this.tableData[this.currentMsgIndex].text)
},
//暂停
pauseVoice() {
this.handlePause()
},
//继续
resumeVoice() {
this.handleResume()
},
//停止
stopVoice() {
this.handleStop()
},
handleSpeak(TEXT) {
console.log('TEXT:', TEXT)
// if (!this.text) return alert('请输入文本!')
msg.text = TEXT // this.text
msg.lang = 'zh-CN' // 语言
msg.volume = 1 // 音量:0~1,默认1
msg.rate = 1 // 语速:0.1~10,默认1
msg.pitch = 1 // 音高:0~2,默认1
// msg.voiceURI=''// 希望使用的声音
synth.speak(msg)
},
handleStop(e) {
synth.cancel(msg)
},
handlePause(e) {
synth.pause(this.tableData[this.currentMsgIndex].text)
},
handleResume(e) {
synth.resume(msg)
}
}
}
</script>
二、vue安装依赖写法:
speak-tts
// 下载依赖包
npm install speak-tts
// 引入
import Speech from 'speak-tts'
html:
<el-button type="success" @click="speakTtsSpeech">语音播报</el-button>
<el-button @click="paused">tts暂停</el-button>
<el-button @click="goahead">tts继续播放</el-button>
js:
data () {
return {
speech: null,
tableData: [
{ text: '切换后基站BCCH与TCH电平不一致' },
{ text: '切换带异常' },
{ text: '切换后TA偏大' },
{ text: '切换后基站BCCH与TCH电平不一致' },
{ text: '切换带异常' },
{ text: '切换后TA偏大' },
{ text: '切换后基站BCCH与TCH电平不一致' },
{ text: '切换带异常' },
{ text: '切换后TA偏大' }
]
}
},
mounted(){
this.speechInit() // 需要初始化
this.speakTtsSpeech()
},
methods:{
speechInit(){
this.speech = new Speech()
this.speech.setLanguage('zh-CN')
this.speech.init().then(()=>{})
},
// 播放函数
speakTtsSpeech(textContent){
for (let i = 0; i < this.tableData.length; i++) {
this.speech.speak({
text: this.tableData[i].text,// 播放的文本内容
listeners: {
// 开始播放
onstart: () => { console.log("Start utterance")},
// 判断播放是否完毕
onend: () => { console.log("End utterance")},
// 恢复播放
onresume: () => { console.log("Resume utterance") },
},
}).then(()=>{console.log("读取成功")})
}
},
// 暂停
paused() {
this.speech.pause();
},
// 从暂停处继续播放
goahead() {
this.speech.resume();
},
},
//离开页面取消语音,不取消可能会造成奇妙的bug
destroyed() {
this.speech.cancel();
},