文字转语音工具,主要功能输入指定文本内容,可选择语音角色和语速,并生成相应的 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()
- 导入必要的库:
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 引擎进行文本转语音。
- 定义异步函数
my_function
:- 这个函数接受三个参数:
text
、output
和voice
。 - 使用
edge_tts.Communicate
类将输入的文本转换为语音,并将结果保存到指定的输出文件中。 - 这个函数使用
asyncio
库进行异步执行,以提高响应速度。
- 这个函数接受三个参数:
- 定义
synthesize_text
函数:- 这个函数是主要的功能实现部分。
- 首先从文本输入框中获取要转换的文本。
- 根据用户选择的语音角色和语速,调用
my_function
函数进行文本转语音。 - 生成一个唯一的文件名,格式为
[前5个字符]_[时间戳].mp3
。 - 使用
tempfile
创建一个临时文件,将转换结果保存到该文件中。 - 最后将临时文件重命名为最终的 MP3 文件,并显示一个成功消息框,询问用户是否打开生成的音频文件。
- 定义
select_output_directory
函数:- 这个函数用于打开文件选择对话框,让用户选择输出目录。
- 选择的目录路径会显示在输出目录输入框中。
- 设置 CustomTkinter 主题和创建主窗口:
- 使用
ctk.set_appearance_mode
和ctk.set_default_color_theme
设置 CustomTkinter 的外观模式和颜色主题。 - 创建主窗口
ctk.CTk()
,并设置标题和大小。
- 使用
- 创建 GUI 元素:
- 创建标题标签
ctk.CTkLabel
。 - 创建文本输入框
ctk.CTkTextbox
。 - 创建语音选择下拉框
ctk.CTkOptionMenu
,提供多种语音角色供用户选择。 - 创建语速选择下拉框
ctk.CTkOptionMenu
,提供多种语速选项供用户调整。 - 创建输出目录选择框,包括一个输入框
ctk.CTkEntry
和一个选择目录按钮ctk.CTkButton
。 - 创建合成按钮
ctk.CTkButton
,并将其与synthesize_text
函数关联。
- 创建标题标签
- 运行主事件循环:
- 最后,调用
root.mainloop()
启动主事件循环,开始运行应用程序。
- 最后,调用
运行效果:
音频效果:
原文始发于微信公众号(蓝胖子之家):Python写文字转语音工具
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论