我正在开发一个应用程序,要求我在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上运行正常。我在网上广泛搜索了一个解决方案,但找不到一个。有人可以在这里指出我正确的方向。
答案 0 :(得分:1)
遇到同样的问题,这就是我想出来的。
答案 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。