1、原理
语音合成 (也被称作是文本转为语音,英语简写是 tts) 包括接收 app 中需要语音合成的文本,再在设备麦克风播放出来这两个过程。
Web API中对此有一个主要控制接口 SpeechSynthesis,外加一些处理如何表示要被合成的文本 (也被称为 utterances),用什么声音来播出 utterances 等工作的相关接口。同样的,许多操作系统都有自己的某种语音合成系统,在这个任务中我们调用可用的 API 来使用语音合成系统。
2、示例
您可以直接复制下面代码运行在浏览器中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <script src="https://cdn.bootcdn.net/ajax/libs/axios/1.5.0/axios.js"></script> </head> <body> <div> <input type="text" /> <button>开始播放语音</button> </div> </body> <script> const btn = document.querySelector('button') const ipt = document.querySelector('input') function speak({ text, speechRate, lang, volume, pitch }, endEvent, startEvent) { if (!window.SpeechSynthesisUtterance) { console.warn('当前浏览器不支持文字转语音服务') return } if (!text) { return } const speechUtterance = new SpeechSynthesisUtterance() speechUtterance.text = text speechUtterance.rate = speechRate || 1 speechUtterance.lang = lang || 'zh-CN' speechUtterance.volume = volume || 1 speechUtterance.pitch = pitch || 1 speechUtterance.onstart = function (e) { startEvent && startEvent() } speechUtterance.onend = function (e) { endEvent && endEvent() } speechSynthesis.speak(speechUtterance) return speechUtterance } btn.addEventListener('click', function () { if (!ipt.value) return speak( { text: ipt.value, }, function () { console.log('语音播放结束') }, function () { console.log('语音开始播放') } ) }) </script> </html>
支持的浏览器
- Firefox 桌面版和移动版。
- Firefox OS 2.5+。
- Chrome 桌面版和安卓版。
注意:如果效果演示失败,大概是由于您当前使用的浏览器不支持语音转文字这个API,请更换浏览器后重试!
3、解析speak函数
接受参数
text
:要转换为语音的文本内容。speechRate
:语音播放速率。lang
:语音的语言代码。volume
:语音的音量。pitch
:语音的音调。1、另外,它还接受两个回调函数作为参数:
endEvent
和startEvent
。endEvent
在语音播放结束时触发,而startEvent
在语音播放开始时触发。2、函数首先检查浏览器是否支持语音合成服务,如果不支持则输出警告信息并返回。然后它检查是否传入了要转换的文本内容,如果没有则直接返回。
3、接着,函数创建了一个
SpeechSynthesisUtterance
对象,该对象表示一段要朗读的文本。4、然后将传入的参数赋值给这个对象的相应属性,如文本内容、语速、语言、音量和音调。
在设置好
SpeechSynthesisUtterance
对象的属性后,5、函数设置了两个事件处理程序:
onstart
和onend
。onstart
事件处理程序在语音播放开始时触发startEvent
回调函数,onend
事件处理程序在语音播放结束时触发endEvent
回调函数。6、最后,函数通过
speechSynthesis.speak()
方法来开始语音合成,将SpeechSynthesisUtterance
对象传递给该方法以开始朗读文本,并返回这个SpeechSynthesisUtterance
对象。