SpeechSynthesis.getVoices()不列出Firefox中的声音

时间:2017-10-07 06:28:12

标签: javascript html5 firefox text-to-speech speech-synthesis

我正在开发一个应用程序,要求我在Web浏览器中使用文本到语音。我正在使用HTML5语音合成。在谷歌浏览器上,代码运行正常,所有可用的声音都使用| getVoices()|列出,但在Firefox中根本没有列出语音。我在Firefox 56.0(Ubuntu)上测试我的代码。

在通过互联网搜索时,我遇到了一个StackOverflow answer,它建议在| onVoiceChanged |之后调用getVoices()函数。事件

    window.speechSynthesis.onvoiceschanged = function() {
    window.speechSynthesis.getVoices();
    ... 
};

我正在以上述方式调用该调用,它在Chrome中可以正常工作,但在Firefox上则不行。

另一个StackOverflow回答建议我启用| media.webspeech.synth.enabled |在about:配置Firefox,但在我的Firefox中首选| media.webspeech.synth.enabled |已经设置为true。

我检查了MDN文档https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesis/getVoices,此页面上的示例在Firefox中没有运行,但在Chrome中运行良好。我发现CanIUse.com列出了Firefox 55以后支持的SpeechSynthesis,但它对我不起作用。

Mozilla Developer Network的demo演示语音合成无法在我的Firefox上运行,但在Google Chrome上运行正常。我在网上广泛搜索了一个解决方案,但找不到一个。有人可以在这里指出我正确的方向。

3 个答案:

答案 0 :(得分:1)

遇到同样的问题,这就是我想出来的。

  • 在Firefox Ubuntu 16.04上对我不起作用
  • 在虚拟机上运行Windows。声音来自Windows。 “微软大卫”是其中一个选择。
  • Chrome适用于Ubuntu,但仅限于在线时。它没有在控制台中显示任何流量,但语音只有在线时才有效!

答案 1 :(得分:1)

我在Windows 7 64位专业版下运行FireFox 58.0.2(64位)。你提到的demo会为我列出一个声音: Microsoft Anna - 英语(美国)(en-US)。这个声音由我的Windows操作系统提供,而不是FireFox(Chrome列出了Chrome附带的19个附加声音)。

您的代码在Chrome中运行但不适用于Firefox的原因是Firefox不会调用speechSynthesis.onvoiceschanged而Chrome会调用。

为什么呢?以下是Mozilla对 voiceschanged 事件的描述:

  

列表时会触发Web Speech API的voiceschanged事件   将返回的SpeechSynthesisVoice对象   SpeechSynthesis.getVoices()方法已经改变(当声音改变时)   事件火灾。)

只是一个猜测,但可能造成差异的原因可能是Chrome在事件发生后触发事件"添加"声音到你的页面。 Firefox没有,所以它没有。

前面提到的演示通过在触发它的条件代码之前调用populateVoiceList()来解决这种不兼容问题(下面第四行,来自http://mdn.github.io/web-speech-api/speak-easy-synthesis/script.js):

function populateVoiceList() {
  voices = synth.getVoices();
  var selectedIndex = voiceSelect.selectedIndex < 0 ? 0 : voiceSelect.selectedIndex;
  voiceSelect.innerHTML = '';
  for(i = 0; i < voices.length ; i++) {
    var option = document.createElement('option');
    option.textContent = voices[i].name + ' (' + voices[i].lang + ')';

    if(voices[i].default) {
      option.textContent += ' -- DEFAULT';
    }

    option.setAttribute('data-lang', voices[i].lang);
    option.setAttribute('data-name', voices[i].name);
    voiceSelect.appendChild(option);
  }
  voiceSelect.selectedIndex = selectedIndex;
}

populateVoiceList();
if (speechSynthesis.onvoiceschanged !== undefined) {
  speechSynthesis.onvoiceschanged = populateVoiceList;
}

这是我为我的网络应用程序采用的方法; 否则我的声音列表永远不会被Firefox填充 。此代码也恰好解决了Safari的类似问题;见voiceschanged event not fired in Safari

答案 2 :(得分:0)

原始错误似乎表明您需要安装语音(语音调度程序),请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=1003464