为什么 speechSynthesis.getVoices() in Google Chrome returns 是一个空列表?
Why speechSynthesis.getVoices() in Google Chrome returns an empty list?
我想在桌面 Chrome、Safari 和 Firefox 上访问属于 SpeechSynthesis API 的语音列表。如果我在每个浏览器中打开一个新选项卡,并通过控制台 运行:
speechSynthesis.getVoices()
...我希望返回一个包含 'SpeechSynthesisVoice' 个对象(即可用声音)的数组。 Firefox 和 Safari 的行为符合预期,但在 Chrome 中第一次调用 getVoices() returns 一个空数组。我必须再次调用该方法才能接收预期的填充数组。
为什么 Chrome 会这样?它是否对某些网站 API 进行某种延迟加载?请帮助我理解。
发生这种情况是因为 SpeechSynthesis API 允许使用远程服务器进行语音合成,并且 Chrome 从 Google 的服务器请求语音列表。要解决此问题,您需要等待语音加载完毕,然后再次请求它们。
为此你应该听 voicechanged
event,然后初始化你的程序逻辑:
speechSynthesis.addEventListener("voiceschanged", () => {
const voices = speechSynthesis.getVoices()
})
我想在桌面 Chrome、Safari 和 Firefox 上访问属于 SpeechSynthesis API 的语音列表。如果我在每个浏览器中打开一个新选项卡,并通过控制台 运行:
speechSynthesis.getVoices()
...我希望返回一个包含 'SpeechSynthesisVoice' 个对象(即可用声音)的数组。 Firefox 和 Safari 的行为符合预期,但在 Chrome 中第一次调用 getVoices() returns 一个空数组。我必须再次调用该方法才能接收预期的填充数组。
为什么 Chrome 会这样?它是否对某些网站 API 进行某种延迟加载?请帮助我理解。
发生这种情况是因为 SpeechSynthesis API 允许使用远程服务器进行语音合成,并且 Chrome 从 Google 的服务器请求语音列表。要解决此问题,您需要等待语音加载完毕,然后再次请求它们。
为此你应该听 voicechanged
event,然后初始化你的程序逻辑:
speechSynthesis.addEventListener("voiceschanged", () => {
const voices = speechSynthesis.getVoices()
})