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.
Test Development Learning Exchange
Test Development Learning Exchange
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.