Python写文字转语音工具

admin 2024年6月3日09:27:57评论11 views字数 4677阅读15分35秒阅读模式

文字转语音工具,主要功能输入指定文本内容,可选择语音角色和语速,并生成相应的 MP3 音频文件。使用了 Microsoft Edge TTS 引擎进行文本转语音,界面简洁友好,操作方便快捷。您只需几步即可完成文字到语音的转换过程,大大提高了工作和生活的效率。生成的 MP3 文件可以直接播放,或者用于各种场合。

代码:

import hashlib
import datetime
import os
import tempfile
import asyncio
import pygame.mixer
import customtkinter as ctk
from tkinter import filedialog
from tkinter import messagebox
from edge_tts import Communicate

pygame.mixer.init()

async def my_function(text, output, voice, rate):
    volume = '+0%'
    tts = Communicate(text=text, voice=voice, rate=rate, volume=volume)
    await tts.save(output)

def synthesize_text():
    text = text_entry.get("1.0", ctk.END).strip()
    voice = voice_var.get()
    rate = rate_var.get()
    output_dir = os.path.join(os.path.dirname(__file__), "mp3")
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    now = datetime.datetime.now()
    filename_base = hashlib.md5((text[:5] + str(now.timestamp())).encode()).hexdigest()
    filename = os.path.join(output_dir, filename_base + ".mp3")

    with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3", dir=output_dir) as temp_file:
        temp_filename = temp_file.name
        loop = asyncio.get_event_loop()
        loop.run_until_complete(my_function(text, temp_filename, voice, rate))

    os.rename(temp_filename, filename)
    messagebox.showinfo("成功", "音频文件生成成功!")

    open_file = messagebox.askyesno("打开文件", "是否打开生成的音频文件?")
    if open_file:
        os.startfile(filename)

def select_output_directory():
    output_dir = filedialog.askdirectory()
    if output_dir:
        output_dir_entry.delete(0, ctk.END)
        output_dir_entry.insert(ctk.END, output_dir)

# 设置 CustomTkinter 主题
ctk.set_appearance_mode("System")
ctk.set_default_color_theme("blue")

# 创建主窗口
root = ctk.CTk()
root.title("文字转语音工具--微信公众号:蓝胖子之家")
root.geometry("700x570")
root.resizable(False, False)

# 创建标题
title_label = ctk.CTkLabel(root, text="文字转语音工具", font=("Arial", 24, "bold"), pady=20)
title_label.pack()

# 创建文本输入框
text_label = ctk.CTkLabel(root, text="请输入要转换为语音的文本:", font=("Arial", 14))
text_label.pack()

text_entry = ctk.CTkTextbox(root, height=200, width=610, font=("Arial", 12))
text_entry.pack()

# 创建语音选择下拉框
voice_label = ctk.CTkLabel(root, text="请选择要使用的语音角色:", font=("Arial", 14))
voice_label.pack()

voice_var = ctk.StringVar()
voice_var.set("zh-CN-XiaoxiaoNeural")

voice_select = ctk.CTkOptionMenu(root, variable=voice_var, values=["zh-CN-XiaoxiaoNeural", "zh-CN-XiaoyiNeural",
                                 "zh-CN-YunjianNeural", "zh-CN-YunxiNeural", "zh-CN-YunxiaNeural",
                                 "zh-CN-YunyangNeural", "zh-CN-liaoning-XiaobeiNeural", "zh-CN-shaanxi-XiaoniNeural",
                                 "zh-HK-HiuGaaiNeural", "zh-HK-HiuMaanNeural", "zh-HK-WanLungNeural",
                                 "zh-TW-HsiaoChenNeural", "zh-TW-HsiaoYuNeural", "zh-TW-YunJheNeural"],
                                 font=("Arial", 12), width=20)
voice_select.pack()

# 创建语速选择下拉框
rate_label = ctk.CTkLabel(root, text="调整语速:", font=("Arial", 14))
rate_label.pack()

rate_var = ctk.StringVar()
rate_var.set("+0%")

rate_select = ctk.CTkOptionMenu(root, variable=rate_var, values=["-100%", "-90%", "-80%", "-70%", "-60%", "-50%", "-40%", "-30%",
                               "-20%", "-10%", "+0%", "+10%", "+20%", "+30%", "+40%", "+50%", "+60%", "+70%",
                               "+80%", "+90%", "+100%"], font=("Arial", 12), width=20)
rate_select.pack()

# 创建输出目录选择框
output_dir_label = ctk.CTkLabel(root, text="选择输出目录:", font=("Arial", 14))
output_dir_label.pack()

output_dir_frame = ctk.CTkFrame(root)
output_dir_frame.pack()

output_dir_entry = ctk.CTkEntry(output_dir_frame, font=("Arial", 12), width=50)
output_dir_entry.pack(side=ctk.LEFT)

output_dir_button = ctk.CTkButton(output_dir_frame, text="选择目录", font=("Arial", 12), command=select_output_directory)
output_dir_button.pack(side=ctk.LEFT)

# 创建合成按钮
synthesize_button = ctk.CTkButton(root, text="合成音频", font=("Arial", 16, "bold"), command=synthesize_text, width=150, height=50)
synthesize_button.pack(pady=20)

root.mainloop()
  1. 导入必要的库:
    • hashlib: 用于生成唯一的文件名。通过计算文本前5个字符和当前时间戳的 MD5 哈希值来生成唯一的文件名。
    • datetime: 用于获取当前时间,以便生成唯一的文件名。
    • os: 用于操作文件和目录,如创建输出目录、重命名文件等。
    • tempfile: 用于创建临时文件,在生成最终音频文件之前使用。
    • asyncio: 用于异步执行 my_function 函数,以提高响应速度。
    • pygame.mixer: 用于播放生成的音频文件。
    • customtkinter as ctk: 用于创建 GUI 界面。
    • tkinter.filedialog: 用于打开文件选择对话框,让用户选择输出目录。
    • tkinter.messagebox: 用于显示消息框,如成功生成音频文件的提示。
    • edge_tts.Communicate: 用于调用 Microsoft Edge TTS 引擎进行文本转语音。
  2. 定义异步函数 my_function:
    • 这个函数接受三个参数: textoutput 和 voice
    • 使用 edge_tts.Communicate 类将输入的文本转换为语音,并将结果保存到指定的输出文件中。
    • 这个函数使用 asyncio 库进行异步执行,以提高响应速度。
  3. 定义 synthesize_text 函数:
    • 这个函数是主要的功能实现部分。
    • 首先从文本输入框中获取要转换的文本。
    • 根据用户选择的语音角色和语速,调用 my_function 函数进行文本转语音。
    • 生成一个唯一的文件名,格式为 [前5个字符]_[时间戳].mp3
    • 使用 tempfile 创建一个临时文件,将转换结果保存到该文件中。
    • 最后将临时文件重命名为最终的 MP3 文件,并显示一个成功消息框,询问用户是否打开生成的音频文件。
  4. 定义 select_output_directory 函数:
    • 这个函数用于打开文件选择对话框,让用户选择输出目录。
    • 选择的目录路径会显示在输出目录输入框中。
  5. 设置 CustomTkinter 主题和创建主窗口:
    • 使用 ctk.set_appearance_mode 和 ctk.set_default_color_theme 设置 CustomTkinter 的外观模式和颜色主题。
    • 创建主窗口 ctk.CTk(),并设置标题和大小。
  6. 创建 GUI 元素:
    • 创建标题标签 ctk.CTkLabel
    • 创建文本输入框 ctk.CTkTextbox
    • 创建语音选择下拉框 ctk.CTkOptionMenu,提供多种语音角色供用户选择。
    • 创建语速选择下拉框 ctk.CTkOptionMenu,提供多种语速选项供用户调整。
    • 创建输出目录选择框,包括一个输入框 ctk.CTkEntry 和一个选择目录按钮 ctk.CTkButton
    • 创建合成按钮 ctk.CTkButton,并将其与 synthesize_text 函数关联。
  7. 运行主事件循环:
    • 最后,调用 root.mainloop() 启动主事件循环,开始运行应用程序。

运行效果:

Python写文字转语音工具

音频效果:

 

原文始发于微信公众号(蓝胖子之家):Python写文字转语音工具

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月3日09:27:57
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Python写文字转语音工具https://cn-sec.com/archives/2807906.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息