语音更改事件未在 Safari 中触发

voiceschanged event not fired in Safari

本文关键字:Safari 事件 语音      更新时间:2023-09-26

我所知,voiceschanged事件不会在Safari中触发,无论是在Mac上还是在iOS上。同样奇怪的是,它似乎也没有在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);

这两种方法(onvoiceschanged,addEventListener)在Chrome for Windows,Android和Mac中都可以正常工作,但在Chrome for iOS和Safari for Mac和iOS上失败。据我所知,Safari 根本不会触发语音更改事件。

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

我需要在 Safari 中做一些特别的事情来获取声音列表吗?还是语音合成 API 尚未(完全)实现?

显然,到目前为止,Safari 只对 Web 语音 API 提供部分支持。

为了使

代码在不同环境中工作,您可以做的是检测onvoiceschanged是否存在于speechSynthesis中。如果没有,您可以只打电话给speechSynthesis.getVoices()而不听onvoiceschanged

function doVoices() {
    var voices = speechSynthesis.getVoices(),
    // ...
}
if ('onvoiceschanged' in speechSynthesis) {
    speechSynthesis.onvoiceschanged = doVoices;
} else {
    doVoices();
}