4

据我所知,无论是在 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 中都可以正常工作,但在适用于 iOS 的 Chrome 和适用于 Mac 和 iOS 的 Safari 上都失败了。据我所知,Safari 根本不会触发 voiceschanged 事件。

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

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

4

1 回答 1

7

到目前为止,显然Safari 仅部分支持 Web Speech API。

您可以为您的代码在不同环境中工作做的事情是检测是否onvoiceschanged存在于speechSynthesis. 如果没有,你可以speechSynthesis.getVoices()不听就直接打电话onvoiceschanged

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

if ('onvoiceschanged' in speechSynthesis) {
    speechSynthesis.onvoiceschanged = doVoices;
} else {
    doVoices();
}
于 2015-01-29T14:34:28.453 回答