Python使用总结之Python文本转语音引擎:pyttsx3完全指南

ops/2025/3/3 4:37:14/

Python使用总结之Python文本转语音引擎:pyttsx3完全指南

在开发需要语音输出功能的应用时,文本转语音(TTS)技术是一个非常有用的工具。Python的pyttsx3库提供了一个简单且离线的方式来实现这一功能,无需依赖互联网连接或外部API。本文将详细介绍pyttsx3的安装、基础使用以及高级功能,帮助你快速掌握这一实用工具。

什么是pyttsx3?

pyttsx3是一个跨平台的Python文本转语音转换库,它可以在不需要网络连接的情况下工作。该库使用你系统上已安装的TTS引擎,如Windows上的SAPI5、macOS上的NSS和Linux上的espeak。

安装

安装pyttsx3非常简单,只需使用pip命令:

python">pip install pyttsx3

在某些系统上,可能还需要安装额外的依赖:

Windows:通常不需要额外安装(使用SAPI5)
macOS:可能需要安装PyObjC

python">pip install pyobjc

Linux:需要安装espeak

sudo apt-get install espeak

基本使用

初始化引擎并说话

以下是使用pyttsx3的最简单示例:

python">import pyttsx3# 初始化TTS引擎
engine = pyttsx3.init()# 设置要说的文本
engine.say("你好,我是Python文本转语音引擎")# 运行并等待语音完成
engine.runAndWait()

调整语音属性

1. 改变语速

语速以每分钟字数(WPM)衡量,默认值通常为200:

python"># 获取当前语速
rate = engine.getProperty('rate')
print(f"当前语速:{rate}")# 设置新的语速 (降低50%)
engine.setProperty('rate', rate-100)engine.say("这是降低语速后的语音效果")
engine.runAndWait()
2. 改变音量

音量范围从0.0到1.0:

python"># 获取当前音量
volume = engine.getProperty('volume')
print(f"当前音量:{volume}")# 设置新的音量 (0.0 到 1.0)
engine.setProperty('volume', 0.7)  # 70%音量engine.say("这是调整音量后的语音效果")
engine.runAndWait()
3. 更改声音

pyttsx3允许使用系统上可用的不同声音:

python"># 获取可用声音的列表
voices = engine.getProperty('voices')# 打印可用声音的信息
for i, voice in enumerate(voices):print(f"语音{i}:")print(f" - ID: {voice.id}")print(f" - 名称: {voice.name}")print(f" - 语言: {voice.languages}")print(f" - 性别: {voice.gender}")print(f" - 年龄: {voice.age}")# 设置第二个声音(如果有的话)
if len(voices) > 1:engine.setProperty('voice', voices[1].id)engine.say("这是使用另一个声音的效果")engine.runAndWait()

高级功能

将语音保存为文件

除了直接播放语音外,pyttsx3还可以将语音保存为音频文件:

python">engine = pyttsx3.init()# 设置要保存的文本
text = "这段文本将被保存为音频文件"# 保存为WAV文件
engine.save_to_file(text, 'output.wav')
engine.runAndWait()

使用事件回调

pyttsx3提供了事件回调机制,可以在语音开始、结束或发生错误时执行特定操作:

python">def onStart(name):print(f'开始: {name}')def onWord(name, location, length):print(f'词: {name}, 位置: {location}, 长度: {length}')def onEnd(name, completed):print(f'结束: {name}, 完成: {completed}')# 连接回调函数
engine = pyttsx3.init()
engine.connect('started-utterance', onStart)
engine.connect('started-word', onWord)
engine.connect('finished-utterance', onEnd)engine.say('这段文本将触发回调函数')
engine.runAndWait()

多线程使用

在图形界面或需要非阻塞语音输出的应用中,可以在单独的线程中运行TTS引擎:

python">import threading
import timedef speak_in_thread(text):engine = pyttsx3.init()engine.say(text)engine.runAndWait()engine.stop()# 创建一个线程来播放语音
speech_thread = threading.Thread(target=speak_in_thread, args=("这段文本将在单独的线程中播放,不会阻塞主程序",))
speech_thread.start()# 主程序可以继续执行其他任务
print("语音播放已开始,但主程序继续执行")
for i in range(5):print(f"主线程计数: {i}")time.sleep(0.5)# 等待语音线程结束
speech_thread.join()
print("语音播放完成")

实用示例

1. 简单的文本阅读器

python">import pyttsx3def text_reader(file_path):try:with open(file_path, 'r', encoding='utf-8') as file:text = file.read()engine = pyttsx3.init()print("开始阅读文件...")engine.say(text)engine.runAndWait()print("文件阅读完成")except FileNotFoundError:print(f"错误: 找不到文件 '{file_path}'")except Exception as e:print(f"发生错误: {e}")# 使用示例
text_reader('example.txt')

2. 简单的语音提醒工具

python">import pyttsx3
import time
import threadingclass VoiceReminder:def __init__(self):self.engine = pyttsx3.init()self.reminders = []self.running = Trueself.check_thread = threading.Thread(target=self._check_reminders)self.check_thread.daemon = Trueself.check_thread.start()def add_reminder(self, message, minutes):reminder_time = time.time() + minutes * 60self.reminders.append((reminder_time, message))print(f"提醒已设置: '{message}' 将在 {minutes} 分钟后提醒")def _check_reminders(self):while self.running:current_time = time.time()# 检查是否有到期的提醒for i, (reminder_time, message) in enumerate(self.reminders[:]):if current_time >= reminder_time:print(f"提醒: {message}")self.engine.say(message)self.engine.runAndWait()# 删除已触发的提醒self.reminders.pop(i)time.sleep(1)def stop(self):self.running = Falseself.check_thread.join(timeout=1)# 使用示例
reminder = VoiceReminder()
reminder.add_reminder("该喝水了", 0.1)  # 6秒后提醒
reminder.add_reminder("休息一下眼睛", 0.2)  # 12秒后提醒# 保持程序运行足够长的时间来触发提醒
time.sleep(15)
reminder.stop()

常见问题和解决方案

  1. No module named ‘win32com.client’
    解决方案: pip install pywin32

  2. No module named ‘pyttsx3’
    确保正确安装了pyttsx3: pip install pyttsx3

  3. 无法更改声音/找不到声音
    确保系统上安装了额外的TTS声音。在Windows上,可以在控制面板 > 语音识别 > 文本到语音中添加额外的声音。

  4. Linux上没有声音输出
    确保安装了espeak: sudo apt-get install espeak

  5. 速度调整不起作用
    尝试更大范围的调整,某些引擎对小幅度调整不敏感。

总结

pyttsx3是一个功能强大且易于使用的Python文本转语音库,它提供了语音合成的核心功能,同时保持了简单的API。它的离线特性使其成为需要TTS功能但不想依赖网络服务的应用的理想选择。

通过本教程,你应该已经掌握了pyttsx3的基本用法和一些高级技巧。你可以将这些知识应用到各种项目中,例如辅助技术、语言学习应用、语音通知系统或任何需要语音输出的应用程序。

希望这篇教程对你有所帮助!如果你有任何问题或遇到困难,不要犹豫,查阅官方文档或在相关论坛上寻求帮助。

祝你的Python TTS项目顺利!


http://www.ppmy.cn/ops/162384.html

相关文章

SQL-Server链接服务器访问Oracle数据

SQL Server 链接服务器访问 Oracle 离线安装 .NET Framework 3.5 方法一:使用 NetFx3.cab 文件 下载 NetFx3.cab 文件,并将其放置在 Windows 10 系统盘的 C:Windows 文件夹中。 以管理员身份运行命令提示符,输入以下命令并回车: …

用 AI 工具实现被动收入:自动化内容生成与发布

——————————————————— 用 AI 工具实现被动收入:自动化内容生成与发布 嘿,朋友们!今天聊点硬核又实在的东西——如何用AI工具实现被动收入。 别急着划走!我知道很多人一听“被动收入”就觉得是个遥不可及的梦…

Spark基础篇-Application、Job、Stage 和 Task

Spark基础篇 单独看看Application、Job、Stage 和 Task 在 Apache Spark 中,Application、Job、Stage 和 Task 是任务调度和执行的四个核心层级概念,它们构成从宏观到微观的完整执行流程。以下是对它们的详细解释及其关系: 1. Application(应用程序) 定义:一个完整的 Sp…

C++ ++++++++++

初始C 注释 变量 常量 关键字 标识符命名规则 数据类型 C规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存 整型 sizeof关键字 浮点型(实型) 有效位数保留七位,带小数点。 这个是保…

「爬虫实战分享:如何高效爬取某汽车官方销售排行榜」

本文目录 💖前言一、💫代理IP的作用二、💫爬虫中的挑战1.代理IP的质量和稳定性2.IP封禁问题3. 反爬虫技术的升级 三、💫亮数据动态代理:数据采集的可靠伙伴1、真实体验 四、💫爬虫实战:使用亮数…

2025年4月1日-2日AutoCable 中国汽车线束线缆及连接技术创新峰会即将开幕

正如人体的心脏与四肢之间需要靠神经和血管连接,汽车的各个部件,也要靠各种电线、管道连接。线束,就是汽车的神经和血管,车主向汽车下达的每一个功能指令,都通过线束来传递,看似不起眼的线束,却…

wiresharkarp网络安全python

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 Wireshark和ARP:网络安全与Python的结合 在网络安全领域,Wireshark是一款不可或缺的工具,它能够用于捕获和分析网络数据包&am…

C++day6

编写一个如下场景: 有一个英雄Hero类,私有成员,攻击,防御,速度,生命值,以及所有的set get 方法 编写一个 武器 Weapon 类,拥有私有成员攻击力,以及set get 方法 编写一个…