Python使用pyttsx3库实现离线文字转语音功能

作者:

文章目录
  • 目录
    • pyttsx3库
      • 0、简介
      • 1、基础文本转语音(入门用法)
      • 2、自定义语速、音量(常用配置)
      • 3、切换语音类型(男声 / 女声)
      • 4、中断正在朗读的语音(交互场景)
      • 5、批量朗读文件中的文本(读取文件 + 语音朗读)
      • 6、将语音保存为音频文件(扩展用法)

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

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

    # 基础安装(Windows 直接可用,Linux/macOS 需额外依赖)
    pip install pyttsx3
    
    # Linux:需安装 espeak 和 libespeak1
    sudo apt-get install espeak libespeak1
    
    # macOS:若语音异常,可安装 pyobjc
    pip install pyobjc
    

    import pyttsx3
    
    # 1. 初始化语音引擎
    engine = pyttsx3.init()
    
    # 2. 设置要朗读的文本(支持中文,Windows 自带中文语音包)
    text = "你好,我是pyttsx3库,这是基础的文本转语音示例。"
    
    # 3. 执行朗读(将文本加入朗读队列)(可多次调用,按顺序朗读)
    engine.say(text)
    
    # 4. 等待朗读完成(必须调用,否则程序会直接结束,无语音输出)
    engine.runAndWait()
    
    # 5. 释放引擎资源(可选,建议在程序结束时调用)
    engine.stop()
    

    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()
    

    Windows 系统中,中文语音包通常名称包含 “慧慧”“晓晓” 等,语言代码为 zh-CN;
    若找不到中文语音,可在 Windows 控制面板的 “语音识别” 中安装中文语音包。

    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()
    

    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("朗读已中断")
    

    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文件,且内容为中文/英文
    

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

    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")
    

    到此这篇关于Python使用pyttsx3库实现离线文字转语音功能的文章就介绍到这了,更多相关Python pyttsx3离线文字转语音内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Python调用pyttsx3实现离线文字转语音的方式
    • Python文本转语音引擎pyttsx3的使用完全指南
    • Python文本到语音转换库pyttsx3的安装及使用全面指南

    站内搜索