关于HTML5语音Web Speech

公司用了挺久的,简单记下。百分之九十拷贝,百分之十小辣鸡属于自己,就标原创,嘿嘿。

HTML5中和Web Speech相关的API实际上有两类,一类是“语音识别(Speech Recognition)”,另外一个就是“语音合成(Speech Synthesis)”

我公司业务主要用的是语音合成这个类,这玩意就是把要读的内容拼接成html,然后speak就ok了。

// 全局语音控件
var player = window.speechSynthesis;
// 需要讲的话
var speckThis = new SpeechSynthesisUtterance();

代码很简单,,嗯,就搞定了

1. 相关api(拷贝):

出处:https://www.jianshu.com/p/92dec635f6c5

先从最简单的例子说起,如果想让浏览器读出“你好,世界!”的声音,可以下面的JS代码:

var utterThis = new window.SpeechSynthesisUtterance('你好,世界!');
window.speechSynthesis.speak(utterThis);

没错,只需要这么一点代码就足够了,大家可以在自己浏览器的控制台里面运行上面两行代码,看看有没有读出声音。

上面代码出现了两个长长的对象,SpeechSynthesisUtterancespeechSynthesis,就是语音合成Speech Synthesis API的核心。

首先是SpeechSynthesisUtterance对象,主要用来构建语音合成实例,例如上面代码中的实例对象utterThis。我们可以直接在构建的时候就把要读的文字内容写进去:

var utterThis = new window.SpeechSynthesisUtterance('你好,世界!');

又或者是使用实例对象的一些属性,包括:

  • text – 要合成的文字内容,字符串。
  • lang – 使用的语言,字符串, 例如:"zh-cn"
  • voiceURI – 指定希望使用的声音和服务,字符串。
  • volume – 声音的音量,区间范围是01,默认是1
  • rate – 语速,数值,默认值是1,范围是0.110,表示语速的倍数,例如2表示正常语速的两倍。
  • pitch – 表示说话的音高,数值,范围从0(最小)到2(最大)。默认值为1

因此上面的代码也可以写作:

var utterThis = new window.SpeechSynthesisUtterance();
utterThis.text = '你好,世界!';

不仅如此,该实例对象还暴露了一些方法:

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

接下来是speechSynthesis对象,主要作用是触发行为,例如读,停,还原等:

  • speak() – 只能接收SpeechSynthesisUtterance作为唯一的参数,作用是读合成的话语。

  • stop() – 立即终止合成过程。

  • pause() – 暂停合成过程。

  • resume() – 重新开始合成过程。

  • getVoices – 此方法不接受任何参数,用来返回浏览器支持的语音包列表,是个数组,例如,在我的电脑下,Firefox浏览器返回的语言包是两个:

    语言包Firefox浏览器

    Firefox浏览器下的语言包运行结果

    而在chrome浏览器下,数量就很惊人了:

     

    Chrome浏览器下返回的语言包

    虽然数量很多,是有种给人中看不中用的感觉,为什么这么说呢!在我的chrome浏览器下,不知道为什么,不会读任何声音,但是同样的demo见面,公司的电脑就可以,我后来仔细查了一下,有可能(20%可能性)是我家里的电脑win7版本是阉割版,没有安装或配置TTS引擎。

    手机Safari浏览器也不会读。

    其中,17是普通话大陆:

     

    普通话中国大陆语言包

    另外,getVoices的获取是个异步的过程,因此,你可以直接在控制台输入,speechSynthesis.getVoices()返回的是一个空数组,没关系,多试几次,或者搞个定时器之类的

2. 自己遇到的小问题

      除了浏览器兼容问题,遇到的问题就是读取数字时,若数字是6位之内,他就读几万几千啥的。。很智能但业务冲突了就很烦

解决起来也很简单,给待读字符串拼接空格就解决了,亲测有效。

//获取相关字符串
var strElectronTaxNo = row.electronTaxNo.toString();
//分割并字符间都加上空格
var strElectronTaxNoSplit = strElectronTaxNo.split("").join(" ");

 


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值