文字转语音/python

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

adfass

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值