利用Python的Pyttsx3库实现离线文字转语音(TTS)功能

news2025/1/13 13:36:32

项目中需要一个语言模块,之前用微软的TTS其实挺好用的,但是不开源,离线也不好整,打算找个轻量化的,然后发现,Python里Pyttsx3库已经能完美实现我的需求了

Pyttsx3

Pyttsx3是一个Python库,用于将文本转换成语音。它是跨平台的,可以在Windows、MacOS和Linux上运行。Pyttsx3实际上是一个文本到语音转换(TTS)的接口,背后支持使用系统内置的语音引擎,比如Windows上的SAPI5、MacOS上的NSSpeechSynthesizer,以及Linux上的espeak。

使用pyttsx3,你可以控制语音的速度、音量和语调,并且可以选择不同的语音(如果系统支持的话)。这个库不依赖于互联网连接,因此非常适合需要在没有网络环境下使用语音功能的应用。

示例

这里有一个基本的使用pyttsx3的例子:

import pyttsx3

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

# 设置要说的话
engine.say("Hello, how are you?")

# 运行
engine.runAndWait()

中文的话,也是直接输进去就行

import pyttsx3

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

# 设置要说的话
engine.say("你有这么高速运转的机械进入中国记住我给出的原理")

# 运行
engine.runAndWait()

下面搞些好玩的,比如整个GUI界面

GUI界面使用

为了实现一个具有图形用户界面的程序,其中使用 pyttsx3 库来将文本转化为语音并保存为 MP3 文件,我们可以使用 Python 的 Tkinter 库来构建 GUI。以下是一个简单的示例程序,展示了如何实现这样的功能:

  1. 创建一个窗口,其中包含两个输入框:一个用于输入文本,另一个用于输入文件名。
  2. 添加两个按钮:一个用于保存语音为 MP3 文件,另一个用于试听输入的文本。
  3. 使用 pyttsx3 来生成语音,并利用其将生成的语音保存为文件。

首先,确保你已经安装了 pyttsx3tkinter 库。如果未安装,可以通过以下命令安装:

pip install pyttsx3

tkinter 通常作为 Python 的标准库自带,不需要额外安装。

以下是代码的实现:

import tkinter as tk
from tkinter import simpledialog
import pyttsx3
import datetime
import os

def save_speech():
    text = text_entry.get("1.0", "end-1c")
    filename = filename_entry.get()
    if not filename:
        filename = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    filename += ".mp3"
    
    engine = pyttsx3.init()
    engine.save_to_file(text, filename)
    engine.runAndWait()
    label_status.config(text=f"Saved as {filename}")

def preview_speech():
    text = text_entry.get("1.0", "end-1c")
    engine = pyttsx3.init()
    engine.say(text)
    engine.runAndWait()

root = tk.Tk()
root.title("Text to Speech Converter")

tk.Label(root, text="Enter Text:").pack()
text_entry = tk.Text(root, height=10, width=50)
text_entry.pack()

tk.Label(root, text="Enter Filename (optional):").pack()
filename_entry = tk.Entry(root)
filename_entry.pack()

save_button = tk.Button(root, text="Save to MP3", command=save_speech)
save_button.pack(pady=5)

preview_button = tk.Button(root, text="Preview", command=preview_speech)
preview_button.pack(pady=5)

label_status = tk.Label(root, text="")
label_status.pack()

root.mainloop()

这段代码创建了一个基本的界面,用户可以在其中输入文本和文件名。点击 "Save to MP3" 按钮将文本保存为 MP3 文件,而点击 "Preview" 按钮则可试听文本的语音输出。注意,pyttsx3save_to_file 方法可能在不同的系统和版本中行为有所不同,因此建议在开发中检查相关的库文档和兼容性问题。

进一步修改GUI

进一步的,我们可以在GUI中添加控制语速、音量和语调的选项,同时还可以提供一个下拉菜单来选择不同的语音。在下面的程序中,我将把所有界面元素的文本设置为中文,并增加调整这些语音属性的控件。

import tkinter as tk
from tkinter import simpledialog, ttk
import pyttsx3
import datetime

def save_speech():
    text = text_entry.get("1.0", "end-1c")
    filename = filename_entry.get()
    if not filename:
        filename = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    filename += ".mp3"
    
    engine = pyttsx3.init()
    engine.setProperty('rate', int(rate_entry.get()))
    engine.setProperty('volume', float(volume_entry.get())/100)
    engine.setProperty('voice', voice_var.get())
    engine.save_to_file(text, filename)
    engine.runAndWait()
    status_label.config(text=f"文件已保存为:{filename}")

def preview_speech():
    text = text_entry.get("1.0", "end-1c")
    engine = pyttsx3.init()
    engine.setProperty('rate', int(rate_entry.get()))
    engine.setProperty('volume', float(volume_entry.get())/100)
    engine.setProperty('voice', voice_var.get())
    engine.say(text)
    engine.runAndWait()

root = tk.Tk()
root.title("文字转语音转换器")

tk.Label(root, text="输入文本:").pack()
text_entry = tk.Text(root, height=10, width=50)
text_entry.pack()

tk.Label(root, text="文件名(可选):").pack()
filename_entry = tk.Entry(root)
filename_entry.pack()

tk.Label(root, text="语速(0-200):").pack()
rate_entry = tk.Entry(root)
rate_entry.insert(0, '150')  # 默认语速
rate_entry.pack()

tk.Label(root, text="音量(0-100):").pack()
volume_entry = tk.Entry(root)
volume_entry.insert(0, '100')  # 默认音量
volume_entry.pack()

tk.Label(root, text="选择语音:").pack()
voice_var = tk.StringVar(root)
voices_combo = ttk.Combobox(root, textvariable=voice_var, state="readonly")
engine = pyttsx3.init()
voices = engine.getProperty('voices')
voices_combo['values'] = [voice.id for voice in voices]
voices_combo.current(0)
voices_combo.pack()

save_button = tk.Button(root, text="保存为MP3", command=save_speech)
save_button.pack(pady=5)

preview_button = tk.Button(root, text="试听", command=preview_speech)
preview_button.pack(pady=5)

status_label = tk.Label(root, text="")
status_label.pack()

root.mainloop()

这个程序包含了以下功能:

  • 输入文本:用户可以输入想要转换的文本。
  • 文件名:用户可以自定义保存的文件名,默认使用当前时间戳。
  • 语速设置:用户可以通过输入一个数值(0到200)来调整语速。
  • 音量设置:用户可以调整音量,范围从0到100。
  • 选择语音:用户可以从系统支持的语音中选择一个。

这样,用户就可以根据自己的需要调整语音输出的各种属性。这些设置会在保存文件或者试听时被应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1588876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【面试题】细说mysql中的各种锁

前言 作为一名IT从业人员,无论你是开发,测试还是运维,在面试的过程中,我们经常会被数据库,数据库中最经常被问到就是MySql。当面试官问MySql的时候经常会问道一个问题,”MySQL中有哪些锁?“当我…

简述Kafka的高可靠性

什么叫可靠性? 大家都知道,系统架构有三高:「高性能、高并发和高可用」,三者的重要性不言而喻。 对于任意系统,想要同时满足三高都是一件非常困难的事情,大型业务系统或者传统中间件都会搭建复杂的架构来…

day05-java面向对象(上)

5.1 面向对象编程 5.1.1 类和对象 1、什么是类 类是一类具有相同特性的事物的抽象描述,是一组相关属性和行为的集合。 属性:就是该事物的状态信息。 行为:就是在你这个程序中,该状态信息要做什么操作,或者基于事物…

如何在公网环境远程管理内网Windows系统部署的MongoDB数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…

品牌百度百科词条创建多少钱?

百度百科作为国内最具权威和影响力的知识型平台,吸引了无数品牌和企业争相入驻。一个品牌的百度百科词条,不仅是对品牌形象的一种提升,更是增加品牌曝光度、提高品牌知名度的重要途径。品牌百度百科词条创建多少钱,这成为了许多企…

ubuntu 20.04 设置国内镜像源(阿里源、清华源)

在网上搜了好多设置国内镜像源,都写的乱七八糟的,都是随便换,最后还是换得一堆问题。 镜像源也是跟版本一一对应的,不能随便一个国内源就还过去用,否则会出现各种各样的问题,我也是吃过亏之后才发现的。 国…

单例19c RMAN数据迁移方案

一、环境说明 源库 目标库 IP 192.168.37.200 192.168.37.202 系统版本 RedHat 7.9 RedHat 7.9 数据库版本 19.3.0.0.0 19.3.0.0.0 SID beg beg hostname beg rman 数据量 1353M 说明:源库已经创建数据库实例,并且存在用户kk和他创建的表空间…

Rancher1.0版本安装使用

Rancher1.0版本安装使用 准备环境 rancher是一个容器管理和服务编排工具。 如下链接,讲的可以,大家参考下,我已经测试过了。 http://tonybai.com/2016/04/14/an-introduction-about-rancher/ 操作系统Centos7.2 用户为root。最好使用Cent…

ELK日志分析系统之Zookeeper

一、Zookeeper简介 ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。分布式应用可以基于它实现更高级的服务,实现诸如同步服务、配置维护和集群管理或者命名的服务。 Zookeepe…

SQL注入---HTTP报头注入

文章目录 目录 文章目录 一.uagent注入 二.refeer注入 三.Cookie注入 前文中提到万能密钥的工作原理,然而万能密钥仅在源代码中没有代码审计,此时才被称之为万能密钥,而代码中有代码审计时需要分以下几种情况讨论 一.uagent注入 先看代码&a…

【攻防世界】题目名称-文件包含

看到 include(),想到文件包含,用php伪协议。 知识点 看到 include(),require(),include_once(),require_once() ,想到文件包含,用php伪协议 ?filenamephp://filter/readconvert.base64-encode/…

TinyEMU源码分析之中断处理

TinyEMU源码分析之中断处理 1 触发中断2 查询中断2.1 查询中断使能与pending状态(mie和mip)2.2 查询中断总开关与委托(mstatus和mideleg)2.2.1 M模式2.2.2 S模式2.2.3 U模式 3 处理中断3.1 获取中断编号3.2 检查委托3.3 进入中断3…

【图像处理】-小议YUV色彩空间-YUV和RGB格式的来由,相互关系以及转换方式,并对编程实现的YUV转为RGB程序进行介绍

小议YUV色彩空间 摘要: 在视频图像处理等相关相关领域,YUV是一个经常出现的格式。本文主要以图解的资料形式详细描述YUV和RGB格式的来由,相互关系以及转换方式,并对编程实现的YUV转为RGB程序进行介绍。 1 引言 自然界的颜色千变万化&#xff…

AI算力报告:算力大时代,AI算力产业链全景梳理

今天分享的是AI算力专题系列深度研究报告:《算力大时代,AI算力产业链全景梳理》。 (报告出品方:中信建投证券) 报告共计:98页 核心观点 生成式 AI取得突破,我们对生成式 A 带来的算力需求做…

AI预测体彩排3第1弹【2024年4月12日预测--第1套算法开始计算第1次测试】

前面经过多个模型几十次对福彩3D的预测,积累了一定的经验,摸索了一些稳定的规律,有很多彩友让我也出一下排列3的预测结果,我认为目前时机已成熟,且由于福彩3D和体彩排列3的玩法完全一样,我认为3D的规律和模…

6.基础乐理-升降号、黑键的音名

首先需要先了解音乐中的两个符号,升号和降号,升号的符号像#,降号的符号像b,如下图: 升号表示升高到相邻的音,降号表示降低到相邻的音,现在首先要知道音是有高低的,在钢琴键盘上从左到…

ZGC的介绍

背景 在jdk17中已经将ZGC从实验性产品升级到正式产品功能,达到亚毫秒级停顿,毫不留情地将parallel和G1拉开了数量级的差别,无论是平均停顿还是最大停顿时间都能毫不费劲地控制在10ms内。 《深入理解Java虚拟机》在书中这样定义:Z…

String类(2)

❤️❤️前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&…

【日常记录】【JS】使用Number.prototype.toLocaleString 对 数字做 格式化

文章目录 1、引言2、语法参数3、常见案例4、参考链接 1、引言 在目前的项目中,经常需要给数字做格式化处理,特别是财务方面,比如分割成千分位,保留小数,增加符号等 ,这些都需要我们手写一些函数来处理。 但…

Vue.js组件精讲 第2章 基础:Vue.js组件的三个API:prop、event、slot

如果您已经对 Vue.js 组件的基础用法了如指掌,可以跳过本小节,不过当做复习稍读一下也无妨。 组件的构成 一个再复杂的组件,都是由三部分组成的:prop、event、slot,它们构成了 Vue.js 组件的 API。如果你开发的是一个…