python实现离线文字转语音:pyttsx3 库

文章目录

一、pyttsx3

0、简介

文档:https://pypi.ac.cn/project/pyttsx3/

pyttsx3 是 Python 轻量级的离线文本转语音(TTS, Text-to-Speech) 库,区别于 gTTS(需要联网),它直接调用操作系统内置的语音引擎,无需网络即可实现文本转语音,响应速度快,且支持跨平台(Windows、macOS、Linux)。

bash 复制代码
# 基础安装(Windows 直接可用,Linux/macOS 需额外依赖)
pip install pyttsx3

# Linux:需安装 espeak 和 libespeak1
sudo apt-get install espeak libespeak1

# macOS:若语音异常,可安装 pyobjc
pip install pyobjc

1、基础文本转语音(入门用法)

py 复制代码
import pyttsx3

# 1. 初始化语音引擎
engine = pyttsx3.init()

# 2. 设置要朗读的文本(支持中文,Windows 自带中文语音包)
text = "你好,我是pyttsx3库,这是基础的文本转语音示例。"

# 3. 执行朗读(将文本加入朗读队列)(可多次调用,按顺序朗读)
engine.say(text)

# 4. 等待朗读完成(必须调用,否则程序会直接结束,无语音输出)
engine.runAndWait()

# 5. 释放引擎资源(可选,建议在程序结束时调用)
engine.stop()

2、自定义语速、音量(常用配置)

py 复制代码
import pyttsx3

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

# ========== 1. 调整语速 ==========
# 获取当前语速(默认约200词/分钟,值越小越慢)
# getProperty(key):获取引擎属性,常用 key 包括 rate(语速)、volume(音量)、voices(语音列表);
current_rate = engine.getProperty('rate')
print(f"当前语速:{current_rate}")

# 设置新语速(建议范围:100-300)
# setProperty(key, value):设置引擎属性,音量值必须在 0.0-1.0 之间,语速值无严格上限,但建议在 100-300 之间。
engine.setProperty('rate', 150)  # 放慢语速

# ========== 2. 调整音量 ==========
# 获取当前音量(范围0.0-1.0,默认1.0)
current_volume = engine.getProperty('volume')
print(f"当前音量:{current_volume}")

# 设置新音量(0.8表示80%音量)
engine.setProperty('volume', 0.8)

# 朗读文本
text = "我现在的语速是150词/分钟,音量是80%。"
engine.say(text)
engine.runAndWait()
engine.stop()

3、切换语音类型(男声 / 女声)

Windows 系统中,中文语音包通常名称包含 "慧慧""晓晓" 等,语言代码为 zh-CN;

若找不到中文语音,可在 Windows 控制面板的 "语音识别" 中安装中文语音包。

py 复制代码
import pyttsx3

engine = pyttsx3.init()

# 1. 获取所有可用的语音列表
# voices 是一个列表,每个元素是语音对象,包含 id(唯一标识)、name(名称)、language(语言)等属性;
voices = engine.getProperty('voices')
print("可用的语音包列表:")
for idx, voice in enumerate(voices):
    print(f"序号:{idx},名称:{voice.name},语言:{voice.languages}")

# 2. 切换语音(以Windows为例,通常0是英文男声,1是中文女声)
engine.setProperty('voice', voices[1].id)  # 切换到中文女声

# 3. 朗读中文文本
engine.say("你好,我是中文女声,现在切换了语音类型。")
engine.runAndWait()

# (可选)切换回英文男声
engine.setProperty('voice', voices[0].id)
engine.say("Hello, I am English male voice.")
engine.runAndWait()

engine.stop()

4、中断正在朗读的语音(交互场景)

py 复制代码
import pyttsx3
import time
import threading

# 初始化引擎
engine = pyttsx3.init()
engine.setProperty('rate', 100)  # 放慢语速,方便测试中断

# 定义朗读函数
def read_long_text():
    long_text = "这是一段很长的文本,用于测试中断功能。我会慢慢朗读,你可以在朗读过程中触发中断。" * 3
    engine.say(long_text)
    engine.runAndWait()

# 启动朗读线程(避免阻塞主线程)
read_thread = threading.Thread(target=read_long_text)
read_thread.start()

# 等待3秒后中断朗读
time.sleep(3)
print("正在中断朗读...")
engine.stop()  # 中断当前朗读

# 等待线程结束
read_thread.join()
print("朗读已中断")

5、批量朗读文件中的文本(读取文件 + 语音朗读)

py 复制代码
import pyttsx3

def read_text_from_file(file_path):
    # 初始化引擎
    engine = pyttsx3.init()
    engine.setProperty('rate', 160)
    engine.setProperty('volume', 0.9)

    try:
        # 读取文件内容(指定编码为utf-8,避免中文乱码)
        with open(file_path, 'r', encoding='utf-8') as f:
            content = f.read()

        # 分段朗读(避免文本过长导致卡顿)
        paragraphs = content.split('\n')  # 按换行符分段
        for para in paragraphs:
            if para.strip():  # 跳过空行
                engine.say(para)
                engine.runAndWait()

    except FileNotFoundError:
        print(f"错误:未找到文件 {file_path}")
    except Exception as e:
        print(f"读取文件出错:{e}")
    finally:
        engine.stop()

# 调用函数,读取并朗读txt文件
if __name__ == "__main__":
    read_text_from_file("test.txt")  # 确保当前目录有test.txt文件,且内容为中文/英文

6、将语音保存为音频文件(扩展用法)

pyttsx3 本身不支持直接保存音频,但可通过 Windows 自带的 SAPI5 实现(最简便,仅适用于 Windows):

py 复制代码
import pyttsx3
from comtypes.client import CreateObject  # 需要安装:pip install comtypes

def text_to_audio(text, output_path):
    # 初始化SAPI5语音引擎
    speaker = CreateObject("SAPI.SpVoice")
    # 初始化音频流
    stream = CreateObject("SAPI.SpFileStream")
    
    # 设置输出文件格式(WAV格式)
    stream.Open(output_path, 3)  # 3 = SPSF_CREATE_ALWAYS
    speaker.AudioOutputStream = stream
    
    # 执行语音合成并保存
    speaker.Speak(text)
    
    # 关闭流
    stream.Close()

# 测试:将文本保存为WAV文件
if __name__ == "__main__":
    text = "这是保存为音频文件的示例,输出格式为WAV。"
    text_to_audio(text, "output.wav")
    print(f"音频已保存到 output.wav")
相关推荐
Amelia1111112 小时前
day41
python
@Luminescence2 小时前
conda指令汇总及入门(持续更新ing)
python·conda
superman超哥2 小时前
Rust 减少内存分配策略:性能优化的内存管理艺术
开发语言·后端·性能优化·rust·内存管理·内存分配策略
t198751282 小时前
基于射线理论的水声信道仿真MATLAB程序
开发语言·matlab
可触的未来,发芽的智生2 小时前
2025年终总结:智能涌现的思考→放弃冯诺依曼架构范式,拥抱“约束产生智能”
javascript·人工智能·python·神经网络·程序人生
bu_shuo2 小时前
MATLAB与Simulink介绍
开发语言·matlab·simulink
吃西瓜的年年2 小时前
5.C语言流程控制语句
c语言·开发语言
萧曵 丶2 小时前
Java 泛型详解
java·开发语言·泛型
码上宝藏2 小时前
从解耦到拓展:Clapper 0.10.0 插件化架构设计与 Lua 脚本集成
linux·开发语言·lua·视频播放器·clapper