Safari 中未触发变声事件

voiceschanged event not fired in Safari

据我所知,voicechanged 事件不会在 Safari 中触发,无论是在 mac 上还是在 iOS 中。同样奇怪的是,它似乎也没有在 iOS 上的 Chrome 中触发,但我假设 iOS 上的 Chrome 使用相同的 JavaScript 引擎野生动物园.

下面是我用来验证的演示:http://jsbin.com/gosaqihi/9/edit?js,console (taken from 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)在 Chrome Windows、Android 和 Mac 中工作正常,但在 Chrome 上 iOS 和 Safari 上 iOS 失败=35=] 和 iOS。据我所知,Safari 根本不会触发 voicechanged 事件。

复杂的是,我实际上没有任何 Apple 设备,所以我不得不通过让朋友尝试来解决这个问题。

我需要在 Safari 中做些什么来获取语音列表吗?还是语音合成 API 还没有(完全)实现?

Apparently Safari 目前仅部分支持网络语音API。

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

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

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