Home > Software engineering >  text to speech web api results in error on voice setting
text to speech web api results in error on voice setting

Time:10-23

on a button click I want to say blue sky in en-US language
this code results in error on utterThis.voice line
pls help

var synth = window.speechSynthesis;

$('button').on('click', function(){
    var utterThis = new SpeechSynthesisUtterance('blue sky');
        utterThis.rate = 1;
        utterThis.pitch = 1;
        utterThis.voice = {voiceURI: 'Google US English', name: 'Google US English', lang: 'en-US', localService: false, default: false};
    synth.speak(utterThis);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button>CLICK</button>
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>

CodePudding user response:

You need to use one of the voices returned by .getVoices - assigning a plain object to .voice won't work.

$('button').on('click', function() {
  var utterThis = new SpeechSynthesisUtterance('blue sky');
  utterThis.rate = 1;
  utterThis.pitch = 1;

  for (const v of speechSynthesis.getVoices()) {
    if (v.voiceURI === 'Google US English') {
      utterThis.voice = v;
    }
  }
  speechSynthesis.speak(utterThis);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button>CLICK</button>
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>

The voices returned by .getVoices are verified by the browser / operating system to be supported, and are clearly tied to an underlying service that translates the text into speech - a plain object, on the other hand, does not, which is why a plain object doesn't work.

  • Related