You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpeechSynthesis API的getVoices方法返回空数组,无法设置语音怎么办?

问题原因

语音合成API的语音列表是异步加载的。页面初始化阶段直接调用window.speechSynthesis.getVoices()时,浏览器还没完成系统语音数据的加载,所以返回空数组。而在开发者控制台执行代码时,页面已经加载完成,语音列表早已就绪,因此能正常获取到语音数组。

解决方法

方法1:监听voiceschanged事件(官方推荐)

当浏览器加载完语音列表后会触发voiceschanged事件,此时再获取语音并设置即可:

var msg = new SpeechSynthesisUtterance();
msg.text = "Hello World!";

window.speechSynthesis.onvoiceschanged = function() {
  var voices = window.speechSynthesis.getVoices();
  // 确保目标索引存在再设置
  if (voices.length > 2) {
    msg.voice = voices[2];
    speechSynthesis.speak(msg);
  }
};

方法2:异步轮询(备选方案)

如果voiceschanged事件触发不稳定,可以用轮询方式等待语音列表加载完成:

function initSpeech() {
  var voices = window.speechSynthesis.getVoices();
  if (voices.length > 0) {
    var msg = new SpeechSynthesisUtterance();
    msg.voice = voices[2];
    msg.text = "Hello World!";
    speechSynthesis.speak(msg);
  } else {
    setTimeout(initSpeech, 100); // 每100毫秒检查一次
  }
}

initSpeech();

优化建议:精准定位语音

依赖数组索引可能因环境变化失效,建议通过语音的name或lang属性精准匹配目标语音:

// 示例:找到"Microsoft Linda - English (Canada)"
var targetVoice = voices.find(voice => voice.name === "Microsoft Linda - English (Canada)");
if (targetVoice) {
  msg.voice = targetVoice;
}

内容的提问来源于stack exchange,提问作者Amolgorithm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:22:08