A very underutilized feature in browsers is text-to-speech. With the Speech Synthesis API, you can use JavaScript to “make the browser talk”. Here’s an example:

const message = new SpeechSynthesisUtterance(
    "Hi! This is an example of the Speech Synthesis API"
);
message.lang = "en-US";

const voices = speechSynthesis
    .getVoices()
    .filter(voice => voice.lang === "en-US");
message.voice = voices[0];

speechSynthesis.speak(message);

View example live: https://jsfiddle.net/holanicozerpa/4h2sf9gL/6/

As you can see in the example, one of the key parts of the Speech Synthesis API is the SpeechSynthesisUtterance class. An object of this class represents the text that the browser will later read aloud.

The other key part is the speechSynthesis object. It’s a global object that serves as the controller. This object, among other things, has a list of available voices. It also has the crucial speak method.

When you create the SpeechSynthesisUtterance, you can set the text in two ways. The first one is to put the text in the constructor (like in the example), and the second one is to use the text property.

While it’s not required, you should also set the language. This is to prevent international users listen to the text in the wrong language and incorrect pronunciation.

In Firefox and Chrome, setting the text and the language is enough. If you use the speechSynthesis.speak method, sending the utterance as a parameter, you will hear the text. But that probably won’t work on Safari. You should also set which voice to use.

Fortunately, you can use the speechSynthesis.getVoices() method to get the list of available voices. It returns an array of SpeechSynthesisVoice objects. Each of this object has a lang property, and you should pick a voice with the same language as the utterance object.

Lastly, you can associate the voice to the utterance object using the voice property. Once you do that, speech synthesis will also work in Safari.