chrome浏览器在18年4月起,就在桌面浏览器全面禁止了音视频的自动播放功能.严格地来说,是Chrome不允许在用户对网页进行触发之前播放音频.不光是这样,在页面加载完毕的情况下,用户没有click.dbclick.touch等主动交互行为,使用js直接调用.play() 方法的话,chrome都会抛出如下错误:
Uncaught (in promise) DOMException: play() failed because the user didn’t interact with the document first.
如果用户已经与系统进行过交互,则可以进行自动播放。但是当用户长时间无交互,则无法通过websock获取到的消息进行自动语音播报。
方法一、使用iframe的方式进行语音播放。
以下是vue的部分代码
<template>
<div id="cam">
<iframe
:src="url"
frameborder="0"
wmode="transparent | window"
style="opacity: 0.0.1;"
v-if="isAudio"
ref="audio"
auto preload="auto"
></iframe>
</div>
</template>
export default {
name: "audioPlay",
data() {
return {
url: '',
isAudio: false,
};
},
mounted() {
setTimeout(() => {
console.log('play');
this.url = "https://tts.baidu.com/text2audio?cuid=baike&spd=5&lan=ZH&ctp=1&pdt=301&vol=4&rate=32&per=0&tex=' "+ encodeURI('小朋友,你是否有很多问号');
this.isAudio = true
}, 3000)
},
运行代码,在用户无交互的情况下,三秒后将自动播放语音。
方法二
解决了语音播报的问题以后,根据业务需要,可能会有一些不能连通外网或者网络状态不好的情况,经过一系列的检索后找到一个好东西
SpeechSynthesisUtterance是HTML5中新增的API,用于将指定文字合成为对应的语音。也包含一些配置项,指定如何去阅读(语言、音量、音调)等
1.方法
speak()将对应的实例添加到语音队列中cancel()删除队列中所有的语音。如果正在播放,则直接停止pause()暂停语音resume()恢复暂停的语音getVoices获取支持的语言数组。 注意:必须添加在voiceschanged事件中才能生效
2.回调事件
onstart语音合成开始时候的回调。onpause语音合成暂停时候的回调。onresume语音合成重新开始时候的回调。onend语音合成结束时候的回调。
speechSynthesis.speak(new SpeechSynthesisUtterance("小朋友,你是否有很多问号"));
无需iframe,通过这一行代码就能解决浏览器的语音限制问题了
最后,还有一点需要注意,如果你运行了上述代码没有实现语音的播放,需要检查浏览的声音设置,需要将声音由自动(默认)或者静音改为允许才能播放声音