Text-to-Speech in Python (TTS) Using Pyttsx3

Share this blog with others!

Voice Assistant is amazing, isn’t it? Guess what, we can create our own voice assistant to support us in our everyday lives. It would not be high-end voice assistance but a combination of basic text-to-speech and speech recognition in Python.

In this blog, we will take look at Text-To-Speech Engine, Pyttsx3, that will give voice to our computer or machine.

Interested in Python, Must learn OpenCV in Python.

Installing Pyttsx3 using pip

pip install pyttsx3

This will install the pyttsx3 library in your machine or the virtual environment if you are using it.

Text-To-Speech using Pyttsx3 in Python

We have installed the necessary package needed for Text-To-Speech Conversion, so now let’s code it.

import pyttsx3

engine = pyttsx3.init()
engine.say("This is Text-To-Speech Engine Pyttsx3")
engine.runAndWait()
engine.stop()

Python

Let’s understand this code line by line.

First of all, we’re going to import the pyttsx3 package that we’ve installed using the pip. The name pyttsx3 is really big and we might make an error when coding a big program.

We can give a short name using the Python import alias syntax.

Example:

pip install pyttsx3 as tts

Python

You can use a different name as you like. I’m going for the original name because it specifically describes the name of the package. If a shorter syntax for this package is created later, you can use it.

engine = pyttsx3.init()


Python

The above code initializes the pyttsx3 package. The Instance of the initialized pyttsx3 package is stored in the engine variable. We are calling the variable engine as it works as the engine and converts Text-To-Speech whenever execute the functions from the package.

engine.say("This is Text-To-Speech Engine Pyttsx3")

Python

There is a built-in say() function in the pyttsx3 package that takes a string value and speaks it out.

engine.runAndWait()

Python

This function keeps track when the engine starts converting text to speech and waits for that much time, and does not allow the engine to close. If we don’t write this code, it may happen that the engine might not work properly as the processes will not be synchronized.

After all the processes are over, we shut down the engine by calling stop() function.

Change Text-to-Speech Voice In Pyttsx3 Python

We can also change the voice of the engine, the default is the voice of a male named David.

To change the voice of the pyttsx3 engine, first, we will have to get the list of objects of voices.

voices = engine.getProperty('voices')

Python

The getProperty() function of the pyttsx3 package takes a string as a parameter and returns an object matching the string.

print(voices)

Python

When we print the voices, we get a list that contains two objects.

[<pyttsx3.voice.Voice object at 0x000001AF1634D820>, <pyttsx3.voice.Voice object at 0x000001AF1634DB80>]

Python

Let’s Print Each Voices.

print(voices[0])
print(voices[1])

Python

voices[0] – This Voice’s name is Microsoft David Desktop (Male Voice Default).

voices[1] – This is the Female Voice named Microsoft Zira Desktop.

# Voices[0]

<Voice id=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-US_DAVID_11.0
name=Microsoft David Desktop - English (United States)
languages=[]
gender=None
age=None>

# voices[1]

<Voice id=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-US_ZIRA_11.0
name=Microsoft Zira Desktop - English (United States)
languages=[]
gender=None
age=None>

Python

Now when we have understood the voice property. Also, stored the voices list from the engine.getProperty('voices') function. Let’s change the Voice of the engine to Female Voice Named Zira.

The naming convention of the pyttsx3 functions is very convenient. getProperty() function is used to get the property related to that string. So, the setProperty() function is used to set property based on a string.

engine.setProperty('voice', voices[1].id)

Python

The above code changes the voice to Zira, the setProperty() function takes the property name and the changing property id.

Changing Speed Rate in Pyttsx3

We can also change the Speed of the Speech Engine.

First, Let’s see what is the default rate that the voice ships with.

rate = engine.getProperty('rate')
print (rate)

Python

Get the Speed Rate of the engine using the getProperty() function and print it.

The Default Speed Rate of the Speech Engine is 200.

If we set the Speed below 200 the voice will speak slowly and above 200 will increase the speed rate of the engine.

engine.setProperty('rate', 100) # Decrease the Speed Rate x2
engine.setProperty('rate', 250) # Increase the Speed Rate x1.25

Python

Change Volume in Pyttsx3

In the previous section, we learned how to change the speed rate of the engine. In this section we will see how we can increase the volume of the engine.

volume = engine.getProperty('volume')
print(volume) # current volume level
engine.setProperty('volume', 2.0)

Python

The Code is almost similar for getting and setting every property in pyttsx3.

Saving The Audio in Pyttsx3

You can also save the Text-to-Speech Conversion as an audio file.

engine.save_to_file('Text-To-Speech you want to save as a audio file', 'audio.mp3')

Python

The save_to_file() function takes two parameters, first the text you want to convert to speech and save it, next the name of the file along with the extension of the audio file.

Today we got to know the basics of the pyttsx3 and how to work with it. The next blog will focus on the Speech Recognition part and then we’ll combine both to make a Voice Assistant with some features.

Learn More about the Python from Hack The Developer.

5 7 votes
Article Rating

Share this blog with others!
Subscribe
Notify of
guest
3 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
David Diskin
David Diskin
1 year ago

I am using Pyttsx3 in a Python app. The text to speech works fine but then the app just closes after the speech. I’m using the same code as above in my app.

def speak(self,text):
    engine = pyttsx3.init()
    engine.say(text)
    engine.runAndWait()
    engine.stop()

Any suggestions?? Thanks.

Scroll to Top