当前位置: 首页 > Web前端 > JavaScript

JS实现文字转语音自动播放

时间:2023-03-27 11:03:11 JavaScript

在开发业务系统的时候,有时候可能需要用语音播放一段文字,比如下面这个场景:当客户支付成功后,系统需要自动播报支付金额,其中支付金额不固定,如1元、2元、3.2元等。如果是相对固定的场景,声音受限,可以采用录音的方式,即先录制所有音频资源,然后根据业务播放场景中对应的音频即可;但是如果场景不固定,需要的声音不一样,如果采用录音的方式,音频资源会很多,可能会出现不完整的问题,这时候使用语音合成技术是更好的方法将文本实时转换为语音。目前,文字转语音,也就是语音合成技术,现在已经非常成熟了。百度、讯飞等都提供了相关服务,支持将文本转换为各种形式的语音。通常,这些服务需要付费。不高,又想节省成本,可以直接使用浏览器的语音合成功能。一些浏览器已经支持文本转语音功能,我们来看看官方介绍:语音合成是通过SpeechSynthesis接口访问的,该接口提供了文本转语音(TTS)功能,可以让程序读取其Text内容(通常使用设备的默认语音合成器)。不同的语音类型由SpeechSynthesisVoice对象表示,文本的不同部分由SpeechSynthesisUtterance对象表示,最后可以通过SpeechSynthesis.speak()方法生成语音。语音合成主要涉及以上三个对象:SpeechSynthesis、SpeechSynthesisVoice和SpeechSynthesisUtterance。1.SpeechSynthesisSpeechSynthesis是语音合成服务的controller接口,可以用来获取设备上可用的合成语音信息,启动,暂停等相关命令。您可以使用window.speechSynthesis属性访问SpeechSynthesis控制器来获取语音合成功能。入口。或者省略窗口,直接使用speechSynthesis。它有三个属性:paused、pending、speaking,都是只读的,不能修改。它有以下方法:SpeechSynthesis.cancel():取消语音播放SpeechSynthesis.getVoices():获取当前设备上所有可用语音的SpeechSynthesisVoice列表。SpeechSynthesis.pause():暂停语音播放SpeechSynthesis.resume():恢复播放SpeechSynthesis.speak():将语音添加到播放队列,其他语音播放完后自动播放2.SpeechSynthesisVoiceSpeechSynthesisVoice表示该语音支持的语音资源当前系统中,每个SpeechSynthesisVoice都对应相关的语音服务,可以通过SpeechSynthesis.getVoices()获取语音列表,如下:它有5个只读属性,分别是default,lang,name,localService,voiceURI.3,SpeechSynthesisUtteranceSpeechSynthesisUtterance表示一个发音请求,其中包含语音服务要说的内容,以及应该如何说(例如:语言、音调、音量)。有6个属性,分别如下:lang:朗读时的语言pitch:语音的音高,取值0~2,正常音调1rate:朗读速度,取值0.1~10,normalspeed值为1text:要合成的文本内容voicevoice:朗读文本的语音服务,默认为SpeechSynthesisVoice属性值defaultvolume:朗读时的音量,取值范围为0~1,正常音量为1除上述属性外,还有7个事件方法,分别为:onboundary:播放到单词或句子结尾时触发onend:语音播放结束时触发onerror:触发语音播放错误时onmark:语音播放到mark时触发markonpause:语音播放暂停时触发onresume:恢复语音播放时触发onstart:语音播放开始时触发。SpeechSynthesisVoice的属性和方法可以直接在控制台查看,如下:4.语音合成代码了解语音合成的相关对象最后来做个简单的测试letsynth=window.speechSynthesis;letutterThis=newSpeechSynthesisUtterance('支付宝到7.5元');synth.speak(utterThis);运行后可以听到声音,这里用Chrome浏览器用设备测试过,声音正常。下面是一个比较通用的方法和具体的实现代码:synthesizedContent,string*@paramrate朗读文本的语速0.1~10Normal1*@paramlang朗读文本时的语言*@paramvolume朗读时的音量0~1Normal1*@parampitch朗读音高0~2Normal1*@returnsSpeechSynthesisUtterance*/functionspeak({text,speechRate,lang,volume,pitch},endEvent,startEvent){if(!window.SpeechSynthesisUtterance){console.warn('当前浏览器不支持文本-转语音服务')return;}if(!text){返回;}constspeechUtterance=newSpeechSynthesisUtterance();speechUtterance.text=文本;speechUtterance.rate=语音速率||1;speechUtterance.lang=语言||'zh-CN';speechUtterance.volume=音量||1;speechUtterance.pitch=音调||1;speechUtterance.onend=function(){endEvent&&endEvent();};speechUtterance.onstart=function(){startEvent&&startEvent();};speechSynthesis.speak(speechUtterance);returnspeechUtterance;}Testitspeak({text:'微信收到100元'},function(){console.log('语音播放结束');},function(){console.log('语音开始播放');});运行后可以看到此时的speechUtterance实例如下:同时控制台会依次输出如下信息。org/en-US/docs/Web/API/Web_Speech_APIhttps://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesishttps://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisVoicehttps://developer.mozilla.org/zh-CN/docs/Web/API/SpeechSynthesisUtterance