据我所知,无论是在Mac上还是在iOS中,voiceschanged事件都不会在Safari中触发。同样奇怪的是,它似乎也不会在iOS上的Chrome中出现,但我认为iOS上的Chrome使用与Safari相同的JavaScript引擎。
以下是我用来验证的演示:http://jsbin.com/gosaqihi/9/edit?js,console(摘自Getting the list of voices in speechSynthesis of Chrome (Web Speech API))
我也尝试使用addEventListener:
speechSynthesis.addEventListener("voiceschanged", function () {
var voices = speechSynthesis.getVoices(),
keys = Object.keys(voices[0]),
i, j;
document.write("<table border=1><tr>");
for ( i = 0; i < keys.length; i++ ) {
document.write("<td>" + keys[i] + "</td>");
}
document.write("</tr>");
for ( i = 0; i < voices.length; i++ ) {
document.write("</tr>");
for ( j = 0; j < keys.length; j++ ) {
document.write("<td>" + voices[i][keys[j]] + "</td>");
}
document.write("</tr>");
}
document.write("<table>");
}, false);
这两种方法(onvoiceschanged,addEventListener)在适用于Windows,Android和Mac的Chrome中运行良好,但在Chrome for iOS和Safari for Mac和iOS上均无效。据我所知,Safari根本不会触发voiceschanged事件。
复杂的是,我实际上并不拥有任何Apple设备,所以我不得不通过让朋友们尝试来解决这个问题。
在Safari中我需要做些什么特别的事情来获取声音列表吗?或者语音合成API是不是(完全)实现的呢?
答案 0 :(得分:4)
Apparently到目前为止,Safari仅部分支持Web Speech API。
您可以为在不同环境中工作的代码执行的操作是检测onvoiceschanged
中是否存在speechSynthesis
。如果没有,您只需拨打speechSynthesis.getVoices()
,而无需聆听onvoiceschanged
。
function doVoices() {
var voices = speechSynthesis.getVoices(),
// ...
}
if ('onvoiceschanged' in speechSynthesis) {
speechSynthesis.onvoiceschanged = doVoices;
} else {
doVoices();
}