9

我一直在 Chrome(33 及以上)中使用新的语音合成 API 来制作基于 Web 的通信辅助工具。我希望用户能够改变男性和女性之间的声音,API 允许我这样做。但是,当页面第一次加载和函数第一次运行(从 onclick 事件)时,它使用默认的女性声音。然后任何时候运行它,它都会使用我试图使用的男性声音。我怎样才能让男声也第一次运行?

这是调用 javascript 的按钮:

<button type="button" name="speakMe"id="speakMe" onclick="speakPhrase($('phraseBar').getValue());" ><img src="images/speakMe.png" /></button>

这是被调用的 speakPhrase 函数:

function speakPhrase(phrase) {
    if(phrase =="")
    {
        alert("Please enter a phrase before asking me to speak for you. Thank you!");
    }
    else
    {
        var speech = new SpeechSynthesisUtterance(phrase);
        var voices = window.speechSynthesis.getVoices();
        speech.voice = voices.filter(function(voice) { return voice.name == 'Google UK English Male'; })[0];
        window.speechSynthesis.speak(speech);

    }
}

任何人都可以帮忙吗?

4

4 回答 4

10

在第一次通话时,voices 数组似乎是空的。从我读到的内容来看,它与加载声音的异步调用有关。所以,它在第一次被调用时总是空的。对我来说,这很神奇:

var speech_voices;
if ('speechSynthesis' in window) {
  speech_voices = window.speechSynthesis.getVoices();
  window.speechSynthesis.onvoiceschanged = function() {
    speech_voices = window.speechSynthesis.getVoices();
  };
}

从您的语音功能之外的某个地方呼叫。

于 2015-07-11T11:38:31.347 回答
1

我解决了问题。

根本原因:当您第一次调用 API 时,由于某种原因无法加载语音。并且首次加载默认语音。

所以我在页面加载或启动或就绪状态下添加了下面的代码行,甚至在我的代码被调用之前:

voices = window.speechSynthesis.getVoices();

这解决了我的问题,希望对其他人有所帮助。

于 2017-05-18T17:52:15.953 回答
0

幸运的是,我设法通过在设置语音之前将默认属性设置为 false 来解决问题

function speakPhrase(phrase) {
    if(phrase =="")
    {
        alert("Please enter a phrase before asking me to speak for you. Thank you!");
    }
    else
    {
        var speech = new SpeechSynthesisUtterance(phrase);
        var voices = window.speechSynthesis.getVoices();
        speech.default = false;
        speech.voice = voices.filter(function(voice) { return voice.name == 'Google UK English Male'; })[0];
        speech.lang = 'en-GB'; //Also added as for some reason android devices used for testing loaded spanish language 
        window.speechSynthesis.speak(speech);
    }
}
于 2014-04-02T13:15:36.160 回答
0

更新了答案。这对我有用。

$(window).load(function(){ voices = window.speechSynthesis.getVoices(); })
于 2017-09-28T05:18:10.677 回答