似乎某些时候,在某些设备上,如果没有用户交互,则不允许运行SpeechSynthesis。我的PC浏览器曾经警告过它,但是现在它可以工作了(我不知道在此期间我是否意外更改了权限),而我的Android平板电脑似乎允许localhost
上的http
],但不允许在我的生产站点https
上使用。电话始终不允许这样做。
我想知道是否有某种方法可以确定正在运行的设备上是否允许它,以便我可以显示通知或隐藏在我的应用程序中提供文字转语音的选项?
取决于浏览器。至少,Chrome以前默认情况下无需用户交互即可允许语音,但此更改a bit ago。一种不可靠的检查方法是将empty语音放入队列,然后查看SpeechSynthesis.speaking
是否为true
:
// Allowed:
btn.onclick = () => {
speechSynthesis.speak(new SpeechSynthesisUtterance(''));
const worked = speechSynthesis.speaking || speechSynthesis.pending;
console.log(worked);
};
<button id="btn">click</button>
// Not allowed, silent failure:
speechSynthesis.speak(new SpeechSynthesisUtterance(''));
const worked = speechSynthesis.speaking || speechSynthesis.pending;
console.log(worked);
[不幸的是,当由于没有用户交互而首先阻止语音时,speechSynthesis.speak
不会抛出(甚至异步),因此检查speaking
属性似乎是唯一的其他方法。