计算机科学技术 · 2024年 2月 25日 0

利用 Python 创建文本转语音应用程序

程序效果图

转换后的声音效果

  • 英文腔调
  • 中文腔调

在本教程中,我们将使用 Python 和一些流行的库来创建一个简单的文本转语音应用程序。这个应用程序将允许用户输入文本,并将其转换为语音,然后可以预览和保存生成的语音文件。

准备工作

在开始之前,请确保你已经安装了以下库:

  • tkinter:Python 的标准 GUI 库,用于创建应用程序的用户界面。
  • gtts:Google Text-to-Speech,用于将文本转换为语音。
  • pygame:用于播放音频文件。
  • os:用于文件操作。
  • datetime:用于生成时间戳。

你可以使用 pip 来安装这些库:

pip install gtts pygame

创建应用程序

我们将创建一个包含以下功能的应用程序:

  1. 文本输入框供用户输入要转换的文本。
  2. 单选按钮选择要转换的语言。
  3. “预览声音”按钮用于播放最近生成的语音文件。
  4. “另存为”按钮用于将最近生成的语音文件另存为用户指定的位置。

下面是完整的代码:

import tkinter as tk
from tkinter import filedialog
from gtts import gTTS
import pygame
import os
from datetime import datetime

class TextToSpeechApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Text to Speech App")
        self.root.geometry("500x350")

        self.label_text = tk.Label(root, text="请输入要转换为语音的文本:")
        self.label_text.grid(row=0, column=0, sticky="w", padx=10, pady=10)

        self.text_entry = tk.Text(root, width=60, height=10, wrap="word")
        self.text_entry.grid(row=1, column=0, padx=10, pady=(0, 10))

        self.language_var = tk.StringVar()
        self.language_var.set("en")
        self.languages = [("英文", "en"), ("中文", "zh"), ("法文", "fr"), ("德文", "de")]
        self.language_label = tk.Label(root, text="选择语言:")
        self.language_label.grid(row=2, column=0, sticky="w", padx=10, pady=(0, 5))
        self.language_frame = tk.Frame(root)
        self.language_frame.grid(row=3, column=0, padx=10, pady=5, sticky="w")
        for i, (lang_name, lang_code) in enumerate(self.languages):
            rb = tk.Radiobutton(self.language_frame, text=lang_name, variable=self.language_var, value=lang_code)
            rb.grid(row=0, column=i, padx=(0, 10))

        self.file_label = tk.Label(root, text="")
        self.file_label.grid(row=4, column=0, padx=10, pady=(10, 5), sticky="w")

        self.file_counter = 1
        self.recent_files = []

        self.text_entry.bind("<FocusOut>", self.convert_to_speech)
        self.language_var.trace_add("write", self.convert_to_speech)

        self.button_preview = tk.Button(root, text="预览声音", command=self.preview_sound)
        self.button_preview.grid(row=5, column=0, padx=10, pady=5)

        self.button_save_as = tk.Button(root, text="另存为", command=self.save_as)
        self.button_save_as.grid(row=6, column=0, padx=10, pady=5)

    def convert_to_speech(self, *args):
        text = self.text_entry.get("1.0", "end-1c")
        lang = self.language_var.get()
        if text:
            tts = gTTS(text=text, lang=lang)
            timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
            filename = f"output-{timestamp}-{lang}-{self.file_counter}.mp3"
            tts.save(filename)
            self.recent_files.append(filename)
            if len(self.recent_files) > 3:
                os.remove(self.recent_files.pop(0))  # 删除最旧的文件
            self.file_label.config(text=f"音频文件已生成:{filename}")
            self.file_counter += 1
        else:
            self.file_label.config(text="请输入要转换的文本!")

    def preview_sound(self):
        if self.recent_files:
            pygame.init()
            pygame.mixer.init()
            pygame.mixer.music.load(os.path.abspath(self.recent_files[-1]))
            pygame.mixer.music.play()
        else:
            self.file_label.config(text="没有可预览的音频文件!")

    def save_as(self):
        if hasattr(self, 'filename'):
            save_path = filedialog.asksaveasfilename(defaultextension=".mp3")
            if save_path:
                import shutil
                shutil.copy(self.filename, save_path)
                self.file_label.config(text=f"音频文件已保存为:{save_path}")
            else:
                self.file_label.config(text="保存取消!")
        else:
            self.file_label.config(text="请先生成音频文件!")

def main():
    root = tk.Tk()
    app = TextToSpeechApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()

运行应用程序

保存上述代码为 text_to_speech.py 文件,然后在终端中运行它:

python text_to_speech.py

这将打开一个图形用户界面,你可以在其中输入文本,选择语言,预览声音,并将声音另存为 MP3 文件。

现在,你已经学会了如何使用 Python 创建一个简单的文本转语音应用程序!