Python文本转语音引擎pyttsx3的使用完全指南

 更新时间:2025年04月02日 15:41:25   作者:阿福不是狗  
在开发需要语音输出功能的应用时,文本转语音技术是一个非常有用的工具,Python的pyttsx3库提供了一个简单且离线的方式来实现这一功能,下面小编就来和大家介绍一下pyttsx3的具体使用吧

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

什么是pyttsx3

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

安装

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

pip install pyttsx3

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

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

macOS:可能需要安装PyObjC

pip install pyobjc

Linux:需要安装espeak

sudo apt-get install espeak

基本使用

初始化引擎并说话

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

import pyttsx3

# 初始化TTS引擎
engine = pyttsx3.init()

# 设置要说的文本
engine.say("你好,我是Python文本转语音引擎")

# 运行并等待语音完成
engine.runAndWait()

调整语音属性

1. 改变语速

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

# 获取当前语速
rate = engine.getProperty('rate')
print(f"当前语速:{rate}")

# 设置新的语速 (降低50%)
engine.setProperty('rate', rate-100)

engine.say("这是降低语速后的语音效果")
engine.runAndWait()

2. 改变音量

音量范围从0.0到1.0:

# 获取当前音量
volume = engine.getProperty('volume')
print(f"当前音量:{volume}")

# 设置新的音量 (0.0 到 1.0)
engine.setProperty('volume', 0.7)  # 70%音量

engine.say("这是调整音量后的语音效果")
engine.runAndWait()

3. 更改声音

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

# 获取可用声音的列表
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还可以将语音保存为音频文件:

engine = pyttsx3.init()

# 设置要保存的文本
text = "这段文本将被保存为音频文件"

# 保存为WAV文件
engine.save_to_file(text, 'output.wav')
engine.runAndWait()

使用事件回调

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

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引擎:

import threading
import time

def 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("语音播放完成")

实用示例

简单的文本阅读器

import pyttsx3

def 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')

简单的语音提醒工具

import pyttsx3
import time
import threading

class VoiceReminder:
    def __init__(self):
        self.engine = pyttsx3.init()
        self.reminders = []
        self.running = True
        self.check_thread = threading.Thread(target=self._check_reminders)
        self.check_thread.daemon = True
        self.check_thread.start()
    
    def add_reminder(self, message, minutes):
        reminder_time = time.time() + minutes * 60
        self.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 = False
        self.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文本转语音引擎pyttsx3的使用完全指南的文章就介绍到这了,更多相关Python pyttsx3文本转语音内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 十分钟教会你用Python处理CSV文件

    十分钟教会你用Python处理CSV文件

    大家都知道使用csv文件可以较容易地存储多行且列相同的数据,便于数据的读取与解析,也常用于自动化测试过程中的数据参数化,下面这篇文章主要给大家介绍了关于如何利用Python处理CSV文件的相关资料,需要的朋友可以参考下
    2022-06-06
  • Python深入06——python的内存管理详解

    Python深入06——python的内存管理详解

    本篇文章主要介绍了python的内存管理详解,语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。有兴趣的同学可以了解一下。
    2016-12-12
  • python 将md5转为16字节的方法

    python 将md5转为16字节的方法

    今天小编就为大家分享一篇python 将md5转为16字节的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python实用秘技之快速优化导包顺序详解

    Python实用秘技之快速优化导包顺序详解

    这篇文章主要来和大家分享一个Python中的实用秘技,那就是如何快速优化导包顺序,文中的示例代码简洁易懂,快跟随小编一起学习起来吧
    2023-06-06
  • Python中集合的创建及常用函数的使用详解

    Python中集合的创建及常用函数的使用详解

    这篇文章主要为大家详细介绍了Python中集合的创建、使用和遍历,集合常见的操作函数,集合与列表,元组,字典的嵌套,感兴趣的小伙伴可以了解一下
    2022-06-06
  • 浅谈python的深浅拷贝以及fromkeys的用法

    浅谈python的深浅拷贝以及fromkeys的用法

    这篇文章主要介绍了python的深浅拷贝以及fromkeys的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • python opencv 实现对图像边缘扩充

    python opencv 实现对图像边缘扩充

    今天小编就为大家分享一篇python opencv 实现对图像边缘扩充,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python完成毫秒级抢淘宝大单功能

    Python完成毫秒级抢淘宝大单功能

    在本篇文章里小编给大家分享了关于Python完成毫秒级抢淘宝大单功能以及实例代码,需要的朋友们参考下。
    2019-06-06
  • 解决Jupyter notebook中.py与.ipynb文件的import问题

    解决Jupyter notebook中.py与.ipynb文件的import问题

    这篇文章主要介绍了解决Jupyter notebook中.py与.ipynb文件的import问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • NumPy中np.random.rand函数的实现

    NumPy中np.random.rand函数的实现

    np.random.rand是NumPy库中的一个函数,用于生成随机数,本文主要介绍了NumPy中np.random.rand函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07

最新评论