业务场景:当存在某些今日待办事项的时候,需要进行语音播报通知。并兼容常见的一些浏览器,目前兼容谷歌、IE、火狐、360浏览器、QQ浏览器、搜狗浏览器。

1、实例

HTML

<iframe style="display:none;" allow="autoplay" id="ifr-video"></iframe>

JS

var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
var isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器
var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; //判断是否IE浏览器
var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf('rv:11.0') > -1;
var isChrome = userAgent.indexOf('Chrome')!=-1;
var is360Nomal = userAgent.indexOf('compatible') != -1;
/*** 文字转语音播报*/function textToVideo (txt,timeOut) {if (isIE || isIE11 || is360Nomal) {// IE浏览器,360兼容模式if(audio.src && audio.src != baiduApi +  encodeURI(txt)){setTimeout(function(){audio.src = baiduApi +  encodeURI(txt);audio.play();},timeOut);}else{audio.src = baiduApi +  encodeURI(txt);audio.play();}}else if(isChrome){//  360极速模式,Chromeif($("#ifr-video").attr('src') && $("#ifr-video").attr('src') != baiduApi +  encodeURI(txt)){setTimeout(function(){$("#ifr-video").attr('src',baiduApi +  encodeURI(txt));},timeOut);}else{$("#ifr-video").attr('src',baiduApi +  encodeURI(txt));}} else { // 火狐window.speechSynthesis.speak(new SpeechSynthesisUtterance(txt));}}

只有HTML5自带的API在调用多次speak方法后,语音会按顺序播放。由于setTimeout是异步的,多次调用文字转语音播报,通过替换src的方式很容易就会被覆盖。所以,我在调用此方法时加了自定义延时。如果src中有内容且不是自己的话,可以延时播放。不过这种方法只适用同一时间播报语句在3条左右的,太多的话就不好控制了。

我考虑过,在调用播放方法(如 audio.play())时,加个睡眠时间,类似于java sleep 。(可通过js计时器不断计算时间差实现 ) 沉睡10s 左右,一句话也差不多播报完了。但这也有一个致命的问题,会阻塞其他的脚本代码,这就很不友好了,只好放弃这种思路。

后来,想到可以把所有的需要播报的文字,全部放在一个数组里。再用定时器定时去刷(每分钟一次),判断数组是否为空。不为空就给数组里的文字添加不同延时的语音播报。第一个语音播报也加了10s 延时,是为了避免同一时刻调用 videoPlay 造成的播报语句覆盖。

 // 语音播放文字数组var audioArr = [];audioArr.push("您有新的订单,请及时处理。");audioArr.push("您有新的订单,请及时处理。");audioArr.push("您有新的订单,请及时处理。");
/***  语音播报触发事件*/function videoPlay(){if(audioArr.length>0){var len = audioArr.length;for(var i=0;i<len;i++){setTimeout(function(){if(audioArr.length>0){textToVideo(audioArr.shift());}},10000 * (i+1));}}}/*** 文字转语音播报具体实现*/function textToVideo (txt){if (isIE || isEdge || isIE11 || is360Nomal) {// IE浏览器,edge,360兼容模式audio.src = baiduApi +  encodeURI(txt);audio.play();console.log(mini.formatDate( new Date(),'yyyy-MM-dd HH:mm:ss') + "  " + txt);}else if(isChrome){// 360极速模式,Chrome$("#ifr-video").attr('src',baiduApi +  encodeURI(txt));console.log(mini.formatDate( new Date(),'yyyy-MM-dd HH:mm:ss') + "  " + txt);} else { // 火狐window.speechSynthesis.speak(new SpeechSynthesisUtterance(txt));console.log(mini.formatDate( new Date(),'yyyy-MM-dd HH:mm:ss') + "  " + txt);}}/**定时触发查询是否有语音播报*/setInterval(function () {videoPlay();},60000);

2、判断浏览器类型

    function getBrowserType() {var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串var isOpera = userAgent.indexOf("Opera") > -1; var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; var isEdge = userAgent.indexOf("Windows NT 6.1; Trident/7.0;") > -1 && !isIE; //判断是否IE的Edge浏览器var isFF = userAgent.indexOf("Firefox") > -1; var isSafari = userAgent.indexOf("Safari") > -1 && userAgent.indexOf("Chrome") == -1; //判断是否Safari浏览器var isChrome = userAgent.indexOf("Chrome") > -1 && userAgent.indexOf("Safari") > -1; //判断Chrome浏览器var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf('rv:11.0') > -1;if (isIE) {var reIE = new RegExp("MSIE (\\d+\\.\\d+);");reIE.test(userAgent);var fIEVersion = parseFloat(RegExp["$1"]);if (fIEVersion == 7) {return "IE7";} else if (fIEVersion == 8) {return "IE8";} else if (fIEVersion == 9) {return "IE9";} else if (fIEVersion == 10) {return "IE10";}  else {return "0"} } if (isIE11) {return "isIE11";}if (isFF) {return "FF";}if (isOpera) {return "Opera";}if (isSafari) {return "Safari";}if (isChrome) {return "Chrome";}if (isEdge) {return "Edge";}}

3、使用SpeechSynthesisUtterance (支持Firefox与360)

SpeechSynthesisUtterance 是 HTML5的新特性,可以实现将文字转换成语音播放。

 var msg = new SpeechSynthesisUtterance(txt);window.speechSynthesis.speak(msg);
常见属性:
SpeechSynthesisUtterance.lang 获取并设置话语的语言
SpeechSynthesisUtterance.pitch 获取并设置话语的音调(值越大越尖锐,越低越低沉)
SpeechSynthesisUtterance.rate 获取并设置说话的速度(值越大语速越快,越小语速越慢)
SpeechSynthesisUtterance.text 获取并设置说话时的文本
SpeechSynthesisUtterance.voice 获取并设置说话的声音
SpeechSynthesisUtterance.volume 获取并设置说话的音量
demo:
 let msg = new SpeechSynthesisUtterance();msg.text = "how are you" // 要合成的文本msg.lang = "en-US" // 美式英语发音(默认自动选择)msg.rate = 2 // 二倍速(默认为 1,范围 0.1~10)msg.pitch = 2 // 高音调(默认为 1,范围 0~2 )msg.volume = 0.5 // 音量 0.5 倍(默认为1,范围 0~1)window.speechSynthesis.speak(msg);
常见方法:
SpeechSynthesis.speak()    //开始读
SpeechSynthesis.pause()   //暂停
SpeechSynthesis.resume() //继续
SpeechSynthesis.cancel()  //取消阅读

4、使用百度开发的API (支持IE)

    var url = "https://tts.baidu.com/text2audio?cuid=baike&lan=ZH&ctp=1&pdt=301&vol=9&rate=32&per=0&tex=" + encodeURI(txt);// baidu文字转语音var  audio = new Audio(url);audio.src = url;audio.play();

注意:必须在外网条件下才能使用。

5、引用iframe (支持Chrome)

HTML
<iframe style="display:none;" allow="autoplay" id="ifr-video"></iframe>
JS
var url = "https://tts.baidu.com/text2audio?cuid=baike&lan=ZH&ctp=1&pdt=301&vol=9&rate=32&per=0&tex=" + encodeURI(txt);// baidu文字转语音
$("#ifr-video").attr('src',url);

注意:此src地址受限且不稳定
1、src 必须是绝对地址
2、src 不能是localhost,可以使用ip、域名、也可以是127.0.0.1
3、当前页面的域名,不可以和引入的iframe 的 src 域名相等,会出现不稳定,时而不能播放的现象。

参考文献:
JS浏览器(谷歌浏览器)网页实现音频(提示音)自动播放
web文字转语音

文字转语音播报,兼容多种浏览器相关推荐

  1. 苹果原生文字转语音播报

    1.CHiOSSpeech.h // // 文 件 名:CHiOSSpeech.h // // 版权所有:Copyright © 2018年 leLight. All rights reserved. ...

  2. 网页内容复制粘贴(三种方案 兼容多种浏览器)

    tags: js ctrl+c 网页内容复制粘贴(三种方案 兼容多种浏览器) 对网页上的内容实现复制粘贴的功能 痛点:需要支持多种不同的浏览器 主要有IE,Firefox IE浏览器下的解决方案: w ...

  3. js框架jquery实现的幸运大转盘抽奖程序代码,兼容多种浏览器(Internet Explorer 6.0+ 、Firefox 2.0 、Safari 3 、Opera 9 、Chrome)

    博客目录 js框架jquery实现的幸运大转盘抽奖程序代码 实现功能截图 系统功能 使用技术 代码 写在最后 js框架jquery实现的幸运大转盘抽奖程序代码 本系统实现了一个幸运转盘抽奖,兼容多种浏 ...

  4. 【自媒体必备】AI文字转语音,支持多种人声选择,在线生成一键导出【电脑永久版】

    AI文字转语音,支持多种人声选择,在线生成一键导出 软件是电脑版安装版本,大家根据自己安软件的习惯进行安装即可,安装后打开软件即可,且完全免费.语音选择方面就有晓晓.云扬.云希等等常用选择.点击后面的 ...

  5. OPENCART之兼容多种浏览器的加入收藏夹扩展功能插件(CROSS-BROWSER BOOKMAR

    2019独角兽企业重金招聘Python工程师标准>>> OPENCART之兼容多种浏览器的加入收藏夹扩展功能插件(CROSS-BROWSER BOOKMARK) 由于安全原因,谷歌浏 ...

  6. java 文字转换成语音 代码_java文字转语音播报功能的实现方法

    前言 本文主要给大家分享了关于java文字转语音播报的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法如下 一.pom.xml引入jar包依赖 com.hynnet ja ...

  7. js框架jquery实现幸运大转盘抽奖程序代码,兼容多种浏览器

    原文:js框架jquery实现幸运大转盘抽奖程序代码,兼容多种浏览器 源代码下载地址:http://www.zuidaima.com/share/1779633798073344.htm 看到网页上有 ...

  8. ios 原生语音识别,百度翻译API使用,原生文字转语音播报

    若有不正之处,希望大家不吝赐教,谢谢! 原生语音识别所需: 首先需要再plist文件中加入: Privacy - Speech Recognition Usage Description 需要使用si ...

  9. SpeechSynthesisUtterance文字转语音播报

    一.介绍 SpeechSynthesisUtterance是HTML5中新增的API,用于将指定文字合成为对应的语音.也包含一些配置项,指定如何去阅读(语言,音量,音调)等 二.基本属性 var sp ...

  10. Android如何解决文字转语音播报的问题

    如何解决文字转语音的问题 1.网上的普遍解决方式 2.我自己需求和解决方式 3.总结 1.网上的普遍解决方式 TTS+语音引擎实现离线的语音播报的功能 下载百度,讯飞等厂家的离线SDK(收费) 由于这 ...

最新文章

  1. linux 导入txt_手机混用闪存到底是真是假:教你查手机闪存型号|闪存|手机|linux|ufs|zip...
  2. 八月十二日,周二总结
  3. UVALive - 3126 Taxi Cab Scheme(最小路径覆盖-二分图最大匹配)
  4. Linux shell利用sed如何批量更改文件名详解
  5. mysql Error Code: 1005(errorno:121)解决
  6. php js 图片旋转,jQuery实现可以控制图片旋转角度效果
  7. sqlserver 全文索引
  8. python入门第七章好友管理系统
  9. 彷徨了两天,天慢慢晴朗了,心也爽朗了……
  10. StanfordDB class自学笔记 (8) Querying XML
  11. iPhoneamp;iPad DFU及恢复模式刷机、降级教程
  12. 这“⼀⼝”和那“一口”有什么不同,关于unicode一个小知识
  13. PostgreSQL客户端无法访问数据库问题
  14. C++:显示每年的各月份第一天是星期几
  15. 网站存在后门 收到公安的网络安全限期整改通知书
  16. [渝粤教育] 无锡商业职业技术学院 商务礼仪 参考 资料
  17. 设计一个单选题考试程序python_Python123计算机等级考试二级Python语言与程序设计通关指南七Python 计算生态...
  18. 大一学生WEB前端静态网页——唯品会1页 包含hover效果
  19. html5页面和app的区别,H5页面与APP区别何在
  20. 如何将数据进行数据可视化展现?

热门文章

  1. Beyond Compare的文档比较工具的设置
  2. this product is covered by one or more of the following
  3. Fisher exact test费雪精确检验
  4. 用户体验--NPS满意度指标
  5. # Android12 wifi和4G同时使用
  6. 不使用设备管理器卸载外设驱动的方法(转)
  7. java开发工具排名_排名前16的Java工具类
  8. 格物致知诚意正心修身齐家治国平天下是什么意思【转载】
  9. ant design vue 修改 table 的默认分页的pageSize
  10. Some file crunching failed, see logs for details解决方案 以及.9patch点9图片的报错的详细修改方法