Python知识点:利用pyttsx3实现文本转语音

1,107 阅读3分钟

简明介绍

pyttsx3是一个用于文本转语音(Text To Speech,TTS)的Python库,可以方便地进行文本到语音的转换,实现计算机的语音输出功能。与其他库不同,它可以离线工作(不依赖于网络连接),并且与 Python 2 和 3 兼容。支持多种 TTS 引擎,包括 sapi5、nsss 和 espeak。pyttsx3可用于任何需要语音合成(Speech Synthesis)的应用场景,包括:

  • 语音助手:将文本转换为语音,用于回答用户的问题、提醒日程等。
  • 语音导航:将导航信息转换为语音,引导用户前往目的地。
  • 语音播报:将消息转换为语音,用于播报新闻、天气预报等。
  • 教学辅助:将教材内容转换为语音,用于听写单词、朗读古诗等。
  • 可访问性:帮助视觉障碍人群更好地获取信息。

环境安装

$ pip install pyttsx3
$ pip install pypiwin32

应用示例

import sys

try:
    import pyttsx3
except ImportError:
    print('The pyttsx3 module needs to be installed to run this program.')
    print('On Windows, open a Command Prompt and run: pip install pyttsx3')
    print('On macOS and Linux, open a Terminal and run: pip3 install pyttsx3')
    sys.exit()

def getIntegerInput(prompt):
    value = 0
    text = input(prompt)
    if text.isdigit():
        value = int(text)
    return value

# 创建语音引擎对象:根据操作系统自动选择语音驱动
engine = pyttsx3.init()
# 改变语速,默认为每分钟200个字
rate = engine.getProperty('rate')
engine.setProperty('rate', rate+10)
# 改变音量:默认为1.0(min=0 and max=1)
volume = engine.getProperty('volume')
engine.setProperty('volume', volume-0.25)
# 改变声音
voices = engine.getProperty('voices')
for voice in voices:
	# print(voice)
    print("Voice:")
    print(" - ID: %s" % voice.id)
    print(" - Name: %s" % voice.name)
    print(" - Languages: %s" % voice.languages)
    print(" - Gender: %s" % voice.gender)
    print(" - Age: %s" % voice.age)
index = getIntegerInput('Enter voice index> ')
if index >= len(voices):
    index = len(voices) - 1
print("use voice: %s" % voices[index].id)
engine.setProperty('voice', voices[index].id)
# 
counter = getIntegerInput('Enter counter> ')
print("use counter %d" % counter)

def speakText(text):
    print(text)
    # 语音播报
    engine.say(text)
    # 等待语音播报完毕
    engine.runAndWait()
#
speakText("任务开始")
if counter > 0:
    for i in range(1, counter+1):
        speakText(str(i))
else:
    poem = '''春眠不觉晓
处处闻啼鸟
夜来风雨声
花落知多少'''
    speakText(poem)
#
speakText("任务结束")
# 停止播报并清除命令队列
engine.stop()

说明1:测试机器上只有两个语音包,Huihui(中文,即中文和英文均可转语音)和Zira(英文,只能在英文的时候可转语音)。

Voice:
 - ID: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_ZH-CN_HUIHUI_11.0
 - Name: Microsoft Huihui Desktop - Chinese (Simplified)
 - Languages: []
 - Gender: None
 - Age: None
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

image.png

说明2:Huihui和Zira两个语音包都是女声,如果希望指定男声,通过执行注册表调整在Windows 10/11上解锁额外的文本到语音语音。

按Win+R快捷键调用“运行”对话框,输入"regedit"打开注册表编辑器,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices路径下可以看到默认语音包,右键HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens\MSTTS_V110_zhCN_KangkangM,从上下文菜单中选择“导出”,使用文本编辑器打开导出的.reg文件将其中"Speech Server"全部替换成"Speech"并保存,双击.reg文件将其合并到注册表中。将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSTTS_V110_zhCN_KangkangM的VoicePath改为%windir%\Speech_OneCore\Engines\TTS\zh-CN\M2052Kangkang。

image.png

参考资料

nateshmbhat/pyttsx3: Offline Text To Speech synthesis for python

pyttsx3 2.6 documentation

Python pyttsx3|文本朗读(各种语言)

如何在 Windows 11/10 中解锁额外的文本转语音

Microsoft Speech SDK 使用过程中女声改为男声遇到的问题

《Python编程快速上手2:趣味小项目轻松学》