Safari浏览器中未触发voiceschanged事件

4
据我所知,无论是在Mac还是iOS上,Safari浏览器都不会触发voiceschanged事件。同样奇怪的是,在iOS上的Chrome浏览器似乎也不会触发该事件,但我假设iOS上的Chrome使用与Safari相同的JavaScript引擎。
以下是我用来验证的演示:http://jsbin.com/gosaqihi/9/edit?js,console(摘自获取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);

在Windows、Android和Mac的Chrome浏览器中,使用onvoiceschanged和addEventListener两种方法都能正常工作,但在iOS版Chrome浏览器和Safari浏览器上则无法正常工作。据我所知,Safari浏览器根本不会触发voiceschanged事件。

更加复杂的是,我自己并没有苹果设备,所以只能让朋友来试验。

在Safari浏览器中获取语音列表需要进行特殊处理吗?还是说语音合成API尚未(完全)实现?

1个回答

8

显然,目前Safari仅对Web Speech API提供部分支持。

为了让您的代码在不同环境中正常工作,您可以检测speechSynthesis中是否存在onvoiceschanged。如果没有,您可以直接调用speechSynthesis.getVoices()而无需监听onvoiceschanged

function doVoices() {
    var voices = speechSynthesis.getVoices(),
    // ...
}

if ('onvoiceschanged' in speechSynthesis) {
    speechSynthesis.onvoiceschanged = doVoices;
} else {
    doVoices();
}

1
谢谢。我希望这个文档能够更好地记录在某个地方。 :/ - Asmor
有了这个答案,我们可以在Safari中选择语音,因为仅设置“lang”是不够的。谢谢! - Marco C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接