import pyttsx3
import tkinter as tk
from tkinter import scrolledtext, messagebox, ttk
from tkinter import filedialog
class TextToSpeechApp:
def __init__(self, root):
self.root = root
self.root.title("文字转语音工具")
self.root.geometry("600x400")
# 初始化语音引擎
self.engine = pyttsx3.init()
self.voices = self.engine.getProperty('voices')
# 创建界面
self.create_widgets()
def create_widgets(self):
# 输入框
self.input_label = tk.Label(self.root, text="输入要转换为语音的文字:")
self.input_label.pack(pady=5)
self.text_input = scrolledtext.ScrolledText(self.root, width=70, height=10)
self.text_input.pack(pady=5)
# 语音设置
self.settings_frame = tk.Frame(self.root)
self.settings_frame.pack(pady=10)
# 语速设置
self.rate_label = tk.Label(self.settings_frame, text="语速:")
self.rate_label.grid(row=0, column=0, padx=5)
self.rate_slider = tk.Scale(self.settings_frame, from_=50, to=200, orient=tk.HORIZONTAL)
self.rate_slider.set(125) # 默认值
self.rate_slider.grid(row=0, column=1, padx=5)
# 音量设置
self.volume_label = tk.Label(self.settings_frame, text="音量:")
self.volume_label.grid(row=0, column=2, padx=5)
self.volume_slider = tk.Scale(self.settings_frame, from_=0, to=1, resolution=0.1, orient=tk.HORIZONTAL)
self.volume_slider.set(0.9) # 默认值
self.volume_slider.grid(row=0, column=3, padx=5)
# 语音选择
self.voice_label = tk.Label(self.settings_frame, text="语音:")
self.voice_label.grid(row=1, column=0, padx=5, pady=10)
self.voice_var = tk.StringVar()
self.voice_combobox = ttk.Combobox(self.settings_frame, textvariable=self.voice_var, width=40)
self.voice_combobox.grid(row=1, column=1, columnspan=3, padx=5, pady=10)
# 填充语音选项
voice_names = [voice.name for voice in self.voices]
self.voice_combobox['values'] = voice_names
if voice_names:
self.voice_combobox.current(0)
# 按钮
self.button_frame = tk.Frame(self.root)
self.button_frame.pack(pady=10)
self.speak_button = tk.Button(self.button_frame, text="朗读", command=self.speak_text)
self.speak_button.pack(side=tk.LEFT, padx=10)
self.save_button = tk.Button(self.button_frame, text="保存为音频文件", command=self.save_to_file)
self.save_button.pack(side=tk.LEFT, padx=10)
self.clear_button = tk.Button(self.button_frame, text="清空", command=self.clear_text)
self.clear_button.pack(side=tk.LEFT, padx=10)
def speak_text(self):
text = self.text_input.get("1.0", tk.END).strip()
if not text:
messagebox.showwarning("警告", "请输入要转换的文字")
return
try:
# 设置语音属性
self.engine.setProperty('rate', self.rate_slider.get())
self.engine.setProperty('volume', self.volume_slider.get())
# 设置语音选择
selected_voice = self.voice_combobox.current()
if selected_voice >= 0:
self.engine.setProperty('voice', self.voices[selected_voice].id)
# 朗读文本
self.engine.say(text)
self.engine.runAndWait()
except Exception as e:
messagebox.showerror("错误", f"发生错误: {str(e)}")
def save_to_file(self):
text = self.text_input.get("1.0", tk.END).strip()
if not text:
messagebox.showwarning("警告", "请输入要转换的文字")
return
file_path = tk.filedialog.asksaveasfilename(
defaultextension=".mp3",
filetypes=[("MP3 文件", "*.mp3"), ("WAV 文件", "*.wav"), ("所有文件", "*.*")],
title="保存语音文件"
)
if file_path:
try:
# 设置语音属性
self.engine.setProperty('rate', self.rate_slider.get())
self.engine.setProperty('volume', self.volume_slider.get())
# 设置语音选择
selected_voice = self.voice_combobox.current()
if selected_voice >= 0:
self.engine.setProperty('voice', self.voices[selected_voice].id)
# 保存到文件
self.engine.save_to_file(text, file_path)
self.engine.runAndWait()
messagebox.showinfo("成功", f"语音文件已保存到:\n{file_path}")
except Exception as e:
messagebox.showerror("错误", f"保存文件时出错: {str(e)}")
def clear_text(self):
self.text_input.delete("1.0", tk.END)
if __name__ == "__main__":
root = tk.Tk()
app = TextToSpeechApp(root)
root.mainloop()
文字转语音/python
最新推荐文章于 2025-04-11 12:05:25 发布