3

Im using this exact code in both the scenarios.

        var msg = new SpeechSynthesisUtterance();
        var voices = window.speechSynthesis.getVoices();
        msg.voice = voices[1];
        msg.text = "hello world";
        msg.lang = 'en-US';
        speechSynthesis.speak(msg);

If I run this in the chrome console I get a female voice. But if I put the exact code in an index.html and run it, it plays a male voice. Could any one please clarify why this difference occurs. Thanks in advance.

Nirojan Selvanathan
  • 10,066
  • 5
  • 61
  • 82

1 Answers1

7

Found the Root cause. Getting the list of voices in speechSynthesis of Chrome (Web Speech API)

The calls are async, so when I try to run in index.html the voices array is empty. As I suggested when I run this and then use the speak it works fine.

    var msg;
    var voices;
    var timer = setInterval(function() {
        voices = speechSynthesis.getVoices();
        console.log(voices);
        if (voices.length !== 0) {
            msg = new SpeechSynthesisUtterance();
            msg.voice = voices[0];
            speechSynthesis.speak(msg);
            msg.lang = 'en-US';
            clearInterval(timer);
        }
    }, 200);
    timer();
    speechSynthesis.speak("hello world");
Nirojan Selvanathan
  • 10,066
  • 5
  • 61
  • 82
  • this works fine!!! just adding the index of whatever the voice we want will change the voice type. eg: msg.voice = voices[1]; will change to female voice of "Microsoft Zira Desktop - English (United States)" – Amila Viraj Mar 03 '20 at 06:15