在Safari中没有触发voiceschanged事件

时间:2015-01-05 12:35:42

标签: javascript html5 safari speech-synthesis webspeech-api

据我所知,无论是在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是不是(完全)实现的呢?

1 个答案:

答案 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();
}