文字转语音播报,兼容多种浏览器
业务场景:当存在某些今日待办事项的时候,需要进行语音播报通知。并兼容常见的一些浏览器,目前兼容谷歌、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.CHiOSSpeech.h // // 文 件 名:CHiOSSpeech.h // // 版权所有:Copyright © 2018年 leLight. All rights reserved. ...
- 网页内容复制粘贴(三种方案 兼容多种浏览器)
tags: js ctrl+c 网页内容复制粘贴(三种方案 兼容多种浏览器) 对网页上的内容实现复制粘贴的功能 痛点:需要支持多种不同的浏览器 主要有IE,Firefox IE浏览器下的解决方案: w ...
- js框架jquery实现的幸运大转盘抽奖程序代码,兼容多种浏览器(Internet Explorer 6.0+ 、Firefox 2.0 、Safari 3 、Opera 9 、Chrome)
博客目录 js框架jquery实现的幸运大转盘抽奖程序代码 实现功能截图 系统功能 使用技术 代码 写在最后 js框架jquery实现的幸运大转盘抽奖程序代码 本系统实现了一个幸运转盘抽奖,兼容多种浏 ...
- 【自媒体必备】AI文字转语音,支持多种人声选择,在线生成一键导出【电脑永久版】
AI文字转语音,支持多种人声选择,在线生成一键导出 软件是电脑版安装版本,大家根据自己安软件的习惯进行安装即可,安装后打开软件即可,且完全免费.语音选择方面就有晓晓.云扬.云希等等常用选择.点击后面的 ...
- OPENCART之兼容多种浏览器的加入收藏夹扩展功能插件(CROSS-BROWSER BOOKMAR
2019独角兽企业重金招聘Python工程师标准>>> OPENCART之兼容多种浏览器的加入收藏夹扩展功能插件(CROSS-BROWSER BOOKMARK) 由于安全原因,谷歌浏 ...
- java 文字转换成语音 代码_java文字转语音播报功能的实现方法
前言 本文主要给大家分享了关于java文字转语音播报的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法如下 一.pom.xml引入jar包依赖 com.hynnet ja ...
- js框架jquery实现幸运大转盘抽奖程序代码,兼容多种浏览器
原文:js框架jquery实现幸运大转盘抽奖程序代码,兼容多种浏览器 源代码下载地址:http://www.zuidaima.com/share/1779633798073344.htm 看到网页上有 ...
- ios 原生语音识别,百度翻译API使用,原生文字转语音播报
若有不正之处,希望大家不吝赐教,谢谢! 原生语音识别所需: 首先需要再plist文件中加入: Privacy - Speech Recognition Usage Description 需要使用si ...
- SpeechSynthesisUtterance文字转语音播报
一.介绍 SpeechSynthesisUtterance是HTML5中新增的API,用于将指定文字合成为对应的语音.也包含一些配置项,指定如何去阅读(语言,音量,音调)等 二.基本属性 var sp ...
- Android如何解决文字转语音播报的问题
如何解决文字转语音的问题 1.网上的普遍解决方式 2.我自己需求和解决方式 3.总结 1.网上的普遍解决方式 TTS+语音引擎实现离线的语音播报的功能 下载百度,讯飞等厂家的离线SDK(收费) 由于这 ...
最新文章
- linux 导入txt_手机混用闪存到底是真是假:教你查手机闪存型号|闪存|手机|linux|ufs|zip...
- 八月十二日,周二总结
- UVALive - 3126 Taxi Cab Scheme(最小路径覆盖-二分图最大匹配)
- Linux shell利用sed如何批量更改文件名详解
- mysql Error Code: 1005(errorno:121)解决
- php js 图片旋转,jQuery实现可以控制图片旋转角度效果
- sqlserver 全文索引
- python入门第七章好友管理系统
- 彷徨了两天,天慢慢晴朗了,心也爽朗了……
- StanfordDB class自学笔记 (8) Querying XML
- iPhoneamp;iPad DFU及恢复模式刷机、降级教程
- 这“⼀⼝”和那“一口”有什么不同,关于unicode一个小知识
- PostgreSQL客户端无法访问数据库问题
- C++:显示每年的各月份第一天是星期几
- 网站存在后门 收到公安的网络安全限期整改通知书
- [渝粤教育] 无锡商业职业技术学院 商务礼仪 参考 资料
- 设计一个单选题考试程序python_Python123计算机等级考试二级Python语言与程序设计通关指南七Python 计算生态...
- 大一学生WEB前端静态网页——唯品会1页 包含hover效果
- html5页面和app的区别,H5页面与APP区别何在
- 如何将数据进行数据可视化展现?
热门文章
- Beyond Compare的文档比较工具的设置
- this product is covered by one or more of the following
- Fisher exact test费雪精确检验
- 用户体验--NPS满意度指标
- # Android12 wifi和4G同时使用
- 不使用设备管理器卸载外设驱动的方法(转)
- java开发工具排名_排名前16的Java工具类
- 格物致知诚意正心修身齐家治国平天下是什么意思【转载】
- ant design vue 修改 table 的默认分页的pageSize
- Some file crunching failed, see logs for details解决方案 以及.9patch点9图片的报错的详细修改方法