Using pyttsx3 for Text-to-Speech in Python
This article provides a hands‑on guide to using the pyttsx3 library for offline text‑to‑speech conversion in Python, covering installation, basic playback, voice property adjustments, multilingual support, and conditional speech examples with counters.
The author explores how to convert text to speech using the offline Python library pyttsx3.
Installation is done via pip: pip3 install pyttsx3 Basic usage involves initializing the engine, queuing text with say(), and invoking runAndWait() to produce audio:
import pyttsx3
engine = pyttsx3.init()
engine.say('Hello world')
engine.runAndWait()The script demonstrates how to inspect and adjust voice properties such as rate, volume, and available voices:
rate = engine.getProperty('rate')
engine.setProperty('rate', 200)
volume = engine.getProperty('volume')
engine.setProperty('volume', 1.0)
voices = engine.getProperty('voices')
for v in voices:
print(v.id, v.name)For Chinese speech, no explicit language setting is required; the engine works with Mandarin text directly:
engine.say('语音合成开始')
engine.say('我会说中文了,开森,开森')
engine.runAndWait()A more elaborate example shows conditional speech based on lists of known and unknown names, with different intervals for each case:
import pyttsx3
engine = pyttsx3.init()
def VOICE_TEXT(names):
unknown_name = []
known_name = []
for name in names:
if name == 'Unknown':
unknown_name.append(name)
else:
known_name.append(name)
num_known = len(known_name)
num_unknown = len(unknown_name)
if len(names) == 0:
return
elif num_unknown == 0:
text = '欢迎'
for i in range(num_known):
if i + 1 == num_known and i != 0:
text += '和{}'.format(known_name[i])
else:
text += known_name[i]
engine.say(text)
engine.runAndWait()
elif num_known == 0:
text = '警告,警告,有陌生人未识别,有陌生人未识别'
engine.say(text)
engine.runAndWait()
else:
text = '欢迎'
for i in range(num_known):
if i + 1 == num_known and i != 0:
text += '和{}'.format(known_name[i])
else:
text += known_name[i]
engine.say(text)
engine.say('请注意, 您旁边有未识别人员,您将不允许进入,请询问值班人员,谢谢合作')
engine.runAndWait()
if __name__ == '__main__':
VOICE_TEXT(['张三丰', '张无忌'])
VOICE_TEXT(['Unknown', '张三丰'])
VOICE_TEXT(['Unknown'])An advanced version adds global counters to limit how often each speech type is spoken, resetting after reaching thresholds:
import pyttsx3
KUNOWN = 0
UNKNOWN = 0
UNKNOWN_KNOWN = 0
engine = pyttsx3.init()
def VOICE_TEXT(names):
unknown_name = []
known_name = []
for name in names:
if name == 'Unknown':
unknown_name.append(name)
else:
known_name.append(name)
num_known = len(known_name)
num_unknown = len(unknown_name)
if len(names) == 0:
return
elif num_unknown == 0:
global KUNOWN
KUNOWN += 1
if KUNOWN == 15:
KUNOWN = 1
text = '欢迎'
for i in range(num_known):
if i + 1 == num_known and i != 0:
text += '和{}'.format(known_name[i])
else:
text += known_name[i]
engine.say(text)
engine.runAndWait()
elif num_known == 0:
global UNKNOWN
UNKNOWN += 1
if UNKNOWN == 10:
UNKNOWN = 1
text = '警告,警告,有外来人员未识别,有外来人员未识别'
engine.say(text)
engine.runAndWait()
else:
global UNKNOWN_KNOWN
UNKNOWN_KNOWN += 1
if UNKNOWN_KNOWN == 25:
UNKNOWN_KNOWN = 2
text = '欢迎'
for i in range(num_known):
if i + 1 == num_known and i != 0:
text += '和{}'.format(known_name[i])
else:
text += known_name[i]
engine.say(text)
engine.say('请注意, 您旁边有外来人员,您将不允许进入,请询问值班人员,谢谢合作')
engine.runAndWait()
if __name__ == '__main__':
VOICE_TEXT(['张三丰', '张无忌'])
VOICE_TEXT(['Unknown', '张三丰'])
VOICE_TEXT(['Unknown'])The tutorial concludes by suggesting that the speech function can be called from a timed loop in a larger program, using the counter variables to control playback frequency.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
