首页 > 编程语言 >转载:JavaScript文字转语音_SpeechSynthesisUtterance语音合成的使用

转载:JavaScript文字转语音_SpeechSynthesisUtterance语音合成的使用

时间:2023-03-28 18:02:09浏览次数:47  
标签:const JavaScript SpeechSynthesisUtterance 语音 synth msg speak

原文链接:https://mp.weixin.qq.com/s?__biz=MjM5MDA2MTI1MA==&mid=2649118413&idx=3&sn=3385dee75bcffa307baa79c3cde4095b&chksm=be587160892ff87605cf347eddad2ad7a55a957836a30a665416f8f976f6b2a3a75b8a4ad4df&scene=27

在做项目的过程中,遇到场景是客户要求播放语音的场景,这里需要js来实现文字转语音播放的功能。在不使用第三方API接口(这种方式需要外网),能想到的也就是利用html5的个API:SpeechSynthesis。
SpeechSynthesis用于将指定文字合成为对应的语音.也包含一些配置项,指定如何去阅读(语言,音量,音调)等等。

实例对象属性

  • lang 获取并设置话语的语言

  • pitch 获取并设置话语的音调(值越大越尖锐,越低越低沉)

  • rate 获取并设置说话的速度(值越大语速越快,越小语速越慢)

  • text 获取并设置说话时的文本

  • voice 获取并设置说话的声音

  • volume 获取并设置说话的音量

SpeechSynthesis方法

  • speak() 将对应的实例添加到语音队列中

  • cancel() 删除队列中所有的语音.如果正在播放,则直接停止

  • pause() 暂停语音

  • resume() 恢复暂停的语音

  • getVoices 获取支持的语言数组. 注意:必须添加在voiceschanged事件中才能生效

实例对象方法

onstart – 语音合成开始时候的回调。
onpause – 语音合成暂停时候的回调。
onresume – 语音合成重新开始时候的回调。
onend – 语音合成结束时候的回调。

简单实现

先从最简单的例子说起,如果想让浏览器读出“你好,世界!”的声音,可以下面的js代码:
let utterThis = new SpeechSynthesisUtterance('你好,世界!');speechSynthesis.speak(utterThis);
只需要这么一点代码就足够了,大家可以在自己浏览器的控制台里面运行上面两行代码,看看有没有读出声音。
除了使用speak方法,我们还可以实例对象属性text,因此上面的代码也可以写成:
let utterThis = new SpeechSynthesisUtterance();utterThis.text = '你好,世界!';utterThis.lang = 'zh';//汉语utterThis.rate = 0.7;//语速speechSynthesis.speak(utterThis);

项目实战

html:
<div class="voiceinator">  <h1>听说 5000</h1>  <select name="voice" id="voices">    <option value="">Select A Voice</option>  </select>  <label for="rate">Rate:</label>  <input name="rate" type="range" min="0" max="3" value="1" step="0.1">  <label for="pitch">Pitch:</label>  <input name="pitch" type="range" min="0" max="2" step="0.1">  <textarea name="text">你好 给你点?</textarea>  <button id="stop">Stop!</button>  <button id="speak">Speak</button></div>
JavaScript:
const synth = window.speechSynthesis
const msg = new SpeechSynthesisUtterance()
let voices = []
const voicesDropdown = document.querySelector('[name="voice"]')
const options = document.querySelectorAll('[type="range"], [name="text"]')
const speakButton = document.querySelector('#speak')
const stopButton = document.querySelector('#stop')

msg.text = '你好 给你点?'
msg.lang = 'zh-CN'

synth.addEventListener('voiceschanged',getSupportVoices)
speakButton.addEventListener('click',throttle(handleSpeak,1000))
stopButton.addEventListener('click',handleStop)
options.forEach(e => e.addEventListener('change',handleChange))

function getSupportVoices() {
  voices = synth.getVoices()
  voices.forEach(e => {
      const option = document.createElement('option')
      option.value = e.lang
      option.text = e.name
      voicesDropdown.appendChild(option)
   })
}
function handleSpeak(e) {
  msg.lang = voicesDropdown.selectedOptions[0].value
  synth.speak(msg)
}
function handleStop(e) {
  synth.cancel(msg)
}
function handleChange(e) {
  msg[this.name] = this.value
}
function throttle(fn,delay) {
  let last = 0
  return function() {
      const now = new Date()
      if(now - last > delay) {
        fn.apply(this,arguments)
        last = now
      }
  }
}

 

 
html部分:页面布局方面就是通过select下拉菜单选择需要转换为什么语言,具体包括什么语言是通过js动态加载的。其次分别用两个input的滑动来选择语音播报的速度和音调。通过修改textarea来设置需要播报的文字内容。最后通过按钮来控制语音的播报和停止。JS部分:首先通过const synth = window.speechSynthesis来创建语音,用const msg = new SpeechSynthesisUtterance()来创建文本实例设置默认播报的文本和语言:msg.text和msg.lang。通过voiceschanged事件来动态获取支持的语言种类,并生成options添加到html中.其中最主要的方法就是synth.getVoices()获取.各位可以通过自行打印获取到的数组查看具体包含的属性。创建按钮点击事件,分别通过synth.speak(msg)和synth.cancel(msg)来播放和取消播放。在播放前通过voicesDropdown.selectedOptions[0].value来设置文本的语言(这里如果文本的内容语言和播报选择的语言不一致的话会出现乱读的情况)。最后添加了一个节流函数,防止多次点击按钮不断播放(最好是能获取播放的时长,或监听播报完毕事件,这里就是简单的2秒识别一次,有兴趣的小伙伴可以自行编写)。

遇到问题

1、google chrome播放语音可能会卡住,所以无声音。解决方法:在播放语音之前先 调用一下cancel方法:
window.speechSynthesis.cancel()
2、出现警告:speechSynthesis.speak() without user activation is no longer allowed since M71, around December 2018.解决方法:进去必须有一个事件动作,如点击事件click,或者你直接鼠标点击页面某处就可以播放了。
3、SpeechSynthesisUtterance在浏览器会存在兼容性问题(如IE不支持),目前主流浏览器如Chrome,Edge,Safari等等都是支持的。解决方案,提示用户更换其他浏览器访问,代码:
if(!!window.SpeechSynthesisUtterance){   console.log("请使用其他浏览器!")}

标签:const,JavaScript,SpeechSynthesisUtterance,语音,synth,msg,speak
From: https://www.cnblogs.com/yaohuimo/p/17266164.html

相关文章

  • Javascript 加密解密方法
    本文链接Javascript和我之前发的python加密以及go加密解密不一样不需要导那么多的库只需要安装几个库其中需要了解最多的crypto-js具体就不多介绍了直接上官......
  • JavaScript学习
    从算法又做回了开发。一、作用1)对事件的反应2)改变图像3)验证输入 二、语法1)基本的一些标记,例如数字,字符串,数组等2)变量使用var3)类型有很多,用typeof来看4)使用新变......
  • javascript 使用json 将js 数据转换成json
     如果是字符串格式的话接的先解析成jsonvarjsonList=pm.response.text();varjson=JSON.parse(jsonList);console.log(json);console.log(json.has_more);varres={"......
  • JavaScript基础
    1.引入jshttps://www.w3cschool.cn/javascript/用script标签,在其中写js代码<scriptsrc="JS/style.js"></script>Numberjs不区分小数和整数NaN表示不是一......
  • 第一篇 javascript 数据类型
    1、数据类型基础数据类型(7种)1、String2、Number3、Boolean4、null5、undefined6、Symbol7、bigInit引用数据类型(Object)1、Object2、Array3、Fun......
  • 第二篇 javascript 标示符、变量、语句、操作符
    bycaixin深圳1、标识符及变量标识符1、所谓标识符,就是变量、函数、属性的名字,或者函数的参数。标识符申明规则:1、第一个字符必须是一个字母、下划线_、或者......
  • Javascript绝句欣赏
     1.取整同时转成数值型:’10.567890′|0//结果:10’10.567890′^0//结果:10-2.23456789|0//结果:-2~~-2.23456789//结果:-2 2.日期转数值:vard=+ne......
  • JavaScript 压缩 加密 解密
     代码: <!DOCTYPEHTMLPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.or......
  • JavaScript 触发click事件 兼容FireFox,IE 和 Chrome
    解决了火狐下无法触发click事件的问题 <scriptlanguage="javascript"> functiontest2(name) { if(document.all) { document.getElementById(name).click(); ......
  • 系统化学习前端之JavaScript(BOM)
    前言DOM提供了JavaScript操作页面的API,BOM提供了JavaScript操作浏览器的API。BOMBOM浏览器对象模型,BOM的核心只有一个window对象。window对象在JavaScrip......