DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»

Asaolu Elijah πŸ§™β€β™‚οΈ
Asaolu Elijah πŸ§™β€β™‚οΈ

Posted on • Updated on

Text To Speech In 3 Lines Of JavaScript

If you're curious about trying this out, that's the 3 lines of code below πŸ‘‡

var msg = new SpeechSynthesisUtterance();
msg.text = "Hello World";
window.speechSynthesis.speak(msg);
Enter fullscreen mode Exit fullscreen mode

But if you're not in a hurry, this article explains everything you need to know about converting text to speech (spoken words) on the web with JavaScript.

Introduction

In a previous article, we'd explored the Web Speech API and also how to convert Speech To Text
Another amazing feature of the Web Speech API is to convert Text to Speech.

Note: Text To Speech != Speech To Text 🧐

  • Text To Speech is when we give the computer some words and the computer will say this words out loud in some robotic/human voice. While
  • Speech To Text is when we say some words to the computer, and what we'd just said will be converted to text (I guess this is explanatory enough)

Getting Started

The first thing we'll need to do is check if our browser supports the speech synthesis API. And the code below does that:

if ('speechSynthesis' in window) {
Β // Speech Synthesis supported πŸŽ‰
}else{
  // Speech Synthesis Not Supported 😣
  alert("Sorry, your browser doesn't support text to speech!");
}
Enter fullscreen mode Exit fullscreen mode

Next step is to create a new speechSynthesis object, add required property and make our app talk πŸ‘‡

var msg = new SpeechSynthesisUtterance();
msg.text = "Good Morning";
window.speechSynthesis.speak(msg);
Enter fullscreen mode Exit fullscreen mode

Code Explanation

  • Line 1: We created a variable msg, and the value assigned to it is a new instance of the speechSynthesis class.
  • Line 2: The .text property is used to specify the text we want to convert to speech
  • And finally, the code on the 3rd(last) line is what actually make our browser talks.

Altering Default Output

The speechSynthesis API gives room to also change alter the default output like changing the voice, volume, speech rate, language, pitch and more:

var msg = new SpeechSynthesisUtterance();
var voices = window.speechSynthesis.getVoices();
msg.voice = voices[10]; 
msg.volume = 1; // From 0 to 1
msg.rate = 1; // From 0.1 to 10
msg.pitch = 2; // From 0 to 2
msg.text = "Como estas Joel";
msg.lang = 'es';
speechSynthesis.speak(msg);
Enter fullscreen mode Exit fullscreen mode

Getting Supported Voices

The code below helps you retrieve the list of all supported voices:

speechSynthesis.getVoices().forEach(function(voice) {
Β  console.log(voice.name, voice.default ? voice.default :'');
});
Enter fullscreen mode Exit fullscreen mode

Conclusion

Well, there's nothing to conclude here I guess πŸ™ƒ
But you could follow me on Twitter, I tweet and retweet interesting technical stuffs; you sure want to see em.

Thanks for reading πŸ‘

Top comments (25)

Collapse
phyrosalpha profile image
Felipe Matheus Ribeiro

I am not getting make the code to work.

I am using firefox in linux OS
The browser can detect the SpeechSynthesisUtterance() but there is no voice or
any sound. I noticed that window.speechSynthesis.getVoices() don't return any voice.

Collapse
josiasaurel profile image
Josias Aurel

Unfortunately it didn't work for me

Collapse
asaoluelijah profile image
Asaolu Elijah πŸ§™β€β™‚οΈ Author

Hi Josias,

Please note that the speechSynthesis API is not yet supported on all browsers.
The code below help you check for browser support:

if ('speechSynthesis' in window) {
 alert("Broswer supports speech synthesis πŸŽ‰");
}else{
  alert("Sorry, your browser doesn't support the speech synthesis API !");
}
Enter fullscreen mode Exit fullscreen mode
Collapse
josiasaurel profile image
Josias Aurel

I use Chrome and it's says my browser supports it

Thread Thread
lazaruswist profile image
lazarusWist • Edited on

Check out MDN's speak easy synthesis demo which works on Chrome. There's two things you need to do to set it up properly:

1) As is the case with the Web Audio API generally, Chromium Browsers will not allow audio to be played without the user interacting with the page first. You need to put the speech synthesis code behind an event listener for some page event like a button click.

2) It seems that Chrome, unlike FireFox, does not have access to system voices when speechSynthesis is initialised for the first time. You need to add an event listener which refers to a function when the voices are found, something like - speechSynthesis.onvoiceschanged = getVoices. The technology is still experimental so I expect this will change in the future.

Collapse
richardengle profile image
Richardengle

codepen.io/richardengle/pen/KKNzKXg is my version of this, combined with some hacks. try it :]

Collapse
jcubic profile image
Jakub T. Jankiewicz

This is old but see my comment. You need to wait for voices to load.

Collapse
borisschapira profile image
Boris Schapira

Beware, the default voice locale is not the locale of the browser but the locale of the system. Be sure to always define the msg.lang (and the OS will switch to the right voice by itself).

Collapse
asaoluelijah profile image
Asaolu Elijah πŸ§™β€β™‚οΈ Author

Wow, I'd never noticed that.
Thanks for the great insight Boris.

Collapse
jcubic profile image
Jakub T. Jankiewicz • Edited on

NOTE: getVoices doesn't work on page load in Chrome. See StackOverflow: Getting the list of voices in speechSynthesis (Web Speech API)

Collapse
stardrop9 profile image
Kurt Starck

Thanks you make this so simple.

Collapse
ronaldohoch profile image
Ronaldo Hoch

Nice πŸ‘

Collapse
karenefereyan profile image
Efereyan Karen Simisola

Amazing

Collapse
mktcode profile image
mkt

Mind blown. Thanks! That's what Stephen Hawking used, right? :D

Collapse
asaoluelijah profile image
Asaolu Elijah πŸ§™β€β™‚οΈ Author

Might be! :D

Collapse
mattmundell profile image
Matt Mundell

Nice. Any idea how to make it sound more human?

Collapse
alexalannunes profile image
Alex Alan Nunes

Toppppp.
How I'd export audio?

Collapse
palrintu50 profile image
palrintu50 • Edited on

can u help me to add speechsynthesis in tensorflowjs for react webapp or react native app

Collapse
abduallahnoorsayket profile image
abdullahnoorsayket • Edited on
Collapse
wperablog profile image
WPEra

nothing to work!

Collapse
richardengle profile image
Richardengle
Collapse
tanishdahiya profile image
TanishDahiya

Can you please send me the whole code so that I easily understand

Collapse
asaoluelijah profile image
Asaolu Elijah πŸ§™β€β™‚οΈ Author
var msg = new SpeechSynthesisUtterance();
msg.text = "My browser will say this sentence.";
window.speechSynthesis.speak(msg);
Collapse
sachin123np profile image
sachin123np • Edited on

How to read the web page content? suppose in html page we have

hii gud morning

how do we take reference for the p tag in order to speak the content inside the p tag?
Collapse
nayyhah profile image
Neha Jha • Edited on

You can add an id in p tag
say, id="content" is added in p tag

now access the content inside the p tag using this id and replace in above code like this:
msg.text = document.getElementById("content").textContent;

🌚 Browsing with dark mode makes you a better developer by a factor of exactly 40.

It's a scientific fact.