鱼C论坛

 找回密码
 立即注册
查看: 90|回复: 1

[技术交流] 大家看下这个文本转语音的小程序怎么样?

[复制链接]
发表于 2025-2-10 15:01:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import tkinter as tk
from tkinter import filedialog, ttk, messagebox
import subprocess
import os

# subprocess这个库在python2.4以上版本自带
# tkinter库这个呢没有的话请自行安装

# 创建文本转语音函数
def text_to_speech(text, output_file, voice_name):
    # 确保文件路径有效
    if not os.path.exists(os.path.dirname(output_file)):
        result_label.config(text="错误:保存路径不存在")
        return
    
    # 检查文件是否已经存在,避免覆盖
    if os.path.exists(output_file):
        result_label.config(text="错误:文件已存在,请选择不同的文件名")
        return
    
    # 清理文本中的换行符
    cleaned_text = text.replace("\n", " ").replace("\r", "")  # 将换行符替换为空格或空字符
    
    # 调用 edge-tts 生成语音
    command = f"edge-tts --text "{cleaned_text}" --voice {voice_name} --write-media {output_file}"
    # print(command)
    try:
        subprocess.run(command, shell=True, check=True)
        result_label.config(text=f"语音文件已生成:{output_file}")
    except subprocess.CalledProcessError as e:
        result_label.config(text=f"生成语音时发生错误: {e}")

# 创建生成语音的回调函数
def generate_speech():
    text = text_input.get("1.0", "end-1c")  # 获取文本框中的文本
    if text.strip():  # 确保文本框不为空
        # 让用户选择保存路径
        output_file = filedialog.asksaveasfilename(defaultextension=".mp3", filetypes=[("MP3 files", "*.mp3")])
        if output_file:
            # 获取用户选择的语音源
            selected_voice = voice_combobox.get()
            # 映射用户选择的语音描述到正确的语音名称
            voice_mapping = {
                "英语 - Aria (美国)女": "en-US-AriaNeural",
                "英语 - Brian (美国)男": "en-US-BrianNeural",
                "英语 - Ryan (英国)男": "en-GB-RyanNeural",
                "英语 - Sonia (英国)女": "en-GB-SoniaNeural",
                "中文 - Xiaoxiao (普通话)女": "zh-CN-XiaoxiaoNeural",
                "中文 - HiuGaai (粤语)女": "zh-HK-HiuGaaiNeural",
                "中文 - 陕西小妮 (普通话)女": "zh-CN-shaanxi-XiaoniNeural",
                "韩语 - SeoYeon (韩国)女": "ko-KR-SunHiNeural",
                "俄语 - Svetlana (俄国)女": "ru-RU-SvetlanaNeural",
                "日语 - Nanami (日本)女": "ja-JP-NanamiNeural"
            }
            voice_name = voice_mapping.get(selected_voice, "en-US-AriaNeural")  # 默认使用英文语音
            text_to_speech(text, output_file, voice_name)
        else:
            result_label.config(text="未选择文件路径")
    else:
        result_label.config(text="请输入文本")

# 创建窗口
root = tk.Tk()
root.title("文本转语音生成器")

# 设置窗口大小
root.geometry("420x320")

# 延迟弹出更新信息框,避免阻塞主界面
root.after(500, lambda: messagebox.showinfo("更新信息", "修复了长文本中不能含有换行符的问题!\n加入了韩、日、俄语音库\n\n注意现在还没法检测输入的文本语言,\n是否与语音库匹配会报错!\n勉强能用,语音别选错了!"))

# 创建文本框
text_input = tk.Text(root, height=8, width=30)
text_input.pack(pady=10)

# 创建选择语音的下拉框
voice_label = tk.Label(root, text="选择语音:")
voice_label.pack()

# 增加中文和英文的语音选择
voice_display = [
    "英语 - Aria (美国)女", "英语 - Brian (美国)男", "英语 - Ryan (英国)男",
    "英语 - Sonia (英国)女", "中文 - Xiaoxiao (普通话)女", "中文 - HiuGaai (粤语)女",
    "中文 - 陕西小妮 (普通话)女", "韩语 - SeoYeon (韩国)女", "俄语 - Svetlana (俄国)女",
    "日语 - Nanami (日本)女"
]

voice_combobox = ttk.Combobox(root, values=voice_display, state="readonly")
voice_combobox.set(voice_display[0])  # 默认选择第一个语音
voice_combobox.pack(pady=5)

# 创建生成语音的按钮
generate_button = tk.Button(root, text="生成语音", command=generate_speech)
generate_button.pack(pady=10)

# 显示结果的标签
result_label = tk.Label(root, text="")
result_label.pack()

# 运行主循环
root.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-2-10 15:01:28 | 显示全部楼层
你这个代码看起来还不错,不过在一些地方有些小问题和遗漏。我帮你补全并修正一下:

1. filetypes= 缺少内容。
2. voice_display 缺少内容。

以下是修改后的代码:
import tkinter as tk
from tkinter import filedialog, ttk, messagebox
import subprocess
import os

# 创建文本转语音函数
def text_to_speech(text, output_file, voice_name):
    # 确保文件路径有效
    if not os.path.exists(os.path.dirname(output_file)):
        result_label.config(text="错误:保存路径不存在")
        return
    
    # 检查文件是否已经存在,避免覆盖
    if os.path.exists(output_file):
        result_label.config(text="错误:文件已存在,请选择不同的文件名")
        return
    
    # 清理文本中的换行符
    cleaned_text = text.replace("\n", " ").replace("\r", "")  # 将换行符替换为空格或空字符
    
    # 调用 edge-tts 生成语音
    command = f"edge-tts --text "{cleaned_text}" --voice {voice_name} --write-media {output_file}"
    try:
        subprocess.run(command, shell=True, check=True)
        result_label.config(text=f"语音文件已生成:{output_file}")
    except subprocess.CalledProcessError as e:
        result_label.config(text=f"生成语音时发生错误: {e}")

# 创建生成语音的回调函数
def generate_speech():
    text = text_input.get("1.0", "end-1c")  # 获取文本框中的文本
    if text.strip():  # 确保文本框不为空
        # 让用户选择保存路径
        output_file = filedialog.asksaveasfilename(defaultextension=".mp3", filetypes=[("MP3 files", "*.mp3")])
        if output_file:
            # 获取用户选择的语音源
            selected_voice = voice_combobox.get()
            # 映射用户选择的语音描述到正确的语音名称
            voice_mapping = {
                "英语 - Aria (美国)女": "en-US-AriaNeural",
                "英语 - Brian (美国)男": "en-US-BrianNeural",
                "英语 - Ryan (英国)男": "en-GB-RyanNeural",
                "英语 - Sonia (英国)女": "en-GB-SoniaNeural",
                "中文 - Xiaoxiao (普通话)女": "zh-CN-XiaoxiaoNeural",
                "中文 - HiuGaai (粤语)女": "zh-HK-HiuGaaiNeural",
                "中文 - 陕西小妮 (普通话)女": "zh-CN-shaanxi-XiaoniNeural",
                "韩语 - SeoYeon (韩国)女": "ko-KR-SunHiNeural",
                "俄语 - Svetlana (俄国)女": "ru-RU-SvetlanaNeural",
                "日语 - Nanami (日本)女": "ja-JP-NanamiNeural"
            }
            voice_name = voice_mapping.get(selected_voice, "en-US-AriaNeural")  # 默认使用英文语音
            text_to_speech(text, output_file, voice_name)
        else:
            result_label.config(text="未选择文件路径")
    else:
        result_label.config(text="请输入文本")

# 创建窗口
root = tk.Tk()
root.title("文本转语音生成器")

# 设置窗口大小
root.geometry("420x320")

# 延迟弹出更新信息框,避免阻塞主界面
root.after(500, lambda: messagebox.showinfo("更新信息", "修复了长文本中不能含有换行符的问题!\n加入了韩、日、俄语音库\n\n注意现在还没法检测输入的文本语言,\n是否与语音库匹配会报错!\n勉强能用,语音别选错了!"))

# 创建文本框
text_input = tk.Text(root, height=8, width=30)
text_input.pack(pady=10)

# 创建选择语音的下拉框
voice_label = tk.Label(root, text="选择语音:")
voice_label.pack()

# 增加中文和英文的语音选择
voice_display = [
    "英语 - Aria (美国)女",
    "英语 - Brian (美国)男",
    "英语 - Ryan (英国)男",
    "英语 - Sonia (英国)女",
    "中文 - Xiaoxiao (普通话)女",
    "中文 - HiuGaai (粤语)女",
    "中文 - 陕西小妮 (普通话)女",
    "韩语 - SeoYeon (韩国)女",
    "俄语 - Svetlana (俄国)女",
    "日语 - Nanami (日本)女"
]

voice_combobox = ttk.Combobox(root, values=voice_display, state="readonly")
voice_combobox.set("英语 - Aria (美国)女")  # 默认选择第一个语音
voice_combobox.pack(pady=5)

# 创建生成语音的按钮
generate_button = tk.Button(root, text="生成语音", command=generate_speech)
generate_button.pack(pady=10)

# 显示结果的标签
result_label = tk.Label(root, text="")
result_label.pack()

# 运行主循环
root.mainloop()

这个代码段对几个关键地方进行了修正并补完整。可以试试看这个版本是否能达到你的预期效果。如果你还有其他问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-24 01:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表