You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于gTTS API的Python多语言TTS程序“语言未找到”错误求助

解决多语言文本转语音程序的“语言未找到”错误

我正在开发一款支持多语言的文本转语音程序,用户可通过下拉菜单选择朗读语言,使用gTTS API实现功能。编写的Python代码运行时出现“语言未找到”错误。

问题根源

  • 变量不匹配:下拉框控件是auto_select,但翻译函数里错误使用了未定义的choose_lang变量,导致获取的语言值为空或错误。
  • 语言名称与API要求不兼容:gTTS和googletrans需要的是语言代码(如en、zh-cn),但下拉框里用的是语言全称,无法直接被API识别。
  • 拼写错误:下拉框里的语言名称存在拼写错误(如Batalan应为Catalan,Gaitian creole应为Haitian creole),还有重复的Hebrew条目,导致语言映射失败。
  • playsound用法错误:gTTS生成的音频对象需要先保存为本地文件,playsound只能播放文件路径,不能直接播放gTTS对象。
  • 缺失必要导入与定义:未导入ttk、messagebox,也未定义frame1控件,导致程序运行时出现语法错误。

修正后的完整代码

import gtts
import os
import playsound
from googletrans import Translator, LANGUAGES
import tkinter as tk
from tkinter import ttk, messagebox

# 将googletrans的语言名称与代码反向映射:名称→代码
LANG_NAME_TO_CODE = {v: k for k, v in LANGUAGES.items()}
# 修正拼写错误的语言名称
CORRECTED_LANG_NAMES = [
    'Afrikaans', 'Albanian', 'Amharic', 'Arabic', 'Armenian', 'Azerbaijani',
    'Basque', 'Belarusian', 'Bengali', 'Bosnian', 'Bulgarian', 'Catalan',
    'Cebuano', 'Chichewa', 'Chinese (Simplified)', 'Chinese (Traditional)',
    'Corsican', 'Croatian', 'Czech', 'Danish', 'Dutch', 'English', 'Esperanto',
    'Estonian', 'Filipino', 'Finnish', 'French', 'Frisian', 'Galician', 'Georgian',
    'German', 'Greek', 'Gujarati', 'Haitian Creole', 'Hausa', 'Hawaiian', 'Hebrew',
    'Hindi', 'Hmong', 'Hungarian', 'Icelandic', 'Igbo', 'Indonesian', 'Irish',
    'Italian', 'Japanese', 'Javanese', 'Kannada', 'Kazakh', 'Khmer', 'Korean',
    'Kurdish (Kurmanji)', 'Kyrgyz', 'Lao', 'Latin', 'Latvian', 'Lithuanian',
    'Luxembourgish', 'Macedonian', 'Malagasy', 'Malay', 'Malayalam', 'Maltese',
    'Maori', 'Marathi', 'Mongolian', 'Myanmar (Burmese)', 'Nepali', 'Norwegian',
    'Odia', 'Pashto', 'Persian', 'Polish', 'Portuguese', 'Punjabi', 'Romanian',
    'Russian', 'Samoan', 'Scots Gaelic', 'Serbian', 'Sesotho', 'Shona', 'Sindhi',
    'Sinhala', 'Slovak', 'Slovenian', 'Somali', 'Spanish', 'Sundanese', 'Swahili',
    'Swedish', 'Tajik', 'Tamil', 'Telugu', 'Thai', 'Turkish', 'Ukrainian', 'Urdu',
    'Uyghur', 'Uzbek', 'Vietnamese', 'Welsh', 'Xhosa', 'Yiddish', 'Yoruba', 'Zulu'
]

root = tk.Tk()
root.title("TEXT TO SPEECH")
root.geometry("1280x720")
root.resizable(False, False)
root.configure(bg="#305065")

# 创建主框架
frame1 = tk.Frame(root, bg="#305065")
frame1.pack(fill=tk.BOTH, expand=True)

# 顶部标题
tk.Label(frame1, text="TEXT TO SPEECH", font="Helvetica 20 bold", fg="white", bg='#305065').pack(pady=10)

# 语言选择下拉框
selected_lang_name = tk.StringVar()
auto_select = ttk.Combobox(frame1, width=27, textvariable=selected_lang_name, state='readonly', font=('verdana', 10, 'bold'))
auto_select['values'] = CORRECTED_LANG_NAMES
auto_select.current(CORRECTED_LANG_NAMES.index('English'))  # 默认选中英语
auto_select.place(x=150, y=60)

# 文本框
sor_txt = tk.Text(frame1, width=40, height=11, borderwidth=5, relief=tk.RIDGE, font=('verdana', 15))
sor_txt.place(x=30, y=110)
dest_txt = tk.Text(frame1, width=40, height=11, borderwidth=5, relief=tk.RIDGE, font=('verdana', 15))
dest_txt.place(x=710, y=110)

# 按钮功能定义
def translate_and_speak():
    input_text = sor_txt.get(1.0, tk.END).strip()
    lang_name = selected_lang_name.get()
    
    if not input_text:
        messagebox.showerror("TEXT TO SPEECH", "Enter the text to translate!")
        return
    
    # 将语言名称转换为API所需的代码
    try:
        lang_code = LANG_NAME_TO_CODE[lang_name.lower()]
    except KeyError:
        messagebox.showerror("TEXT TO SPEECH", f"Unsupported language: {lang_name}")
        return
    
    # 翻译文本
    translator = Translator()
    try:
        translated = translator.translate(input_text, dest=lang_code)
        dest_txt.delete(1.0, tk.END)
        dest_txt.insert(tk.END, translated.text)
    except Exception as e:
        messagebox.showerror("TEXT TO SPEECH", f"Translation failed: {str(e)}")
        return
    
    # 生成并播放语音
    try:
        tts = gtts.gTTS(translated.text, lang=lang_code)
        temp_audio = "temp_audio.mp3"
        tts.save(temp_audio)
        playsound.playsound(temp_audio)
        os.remove(temp_audio)  # 播放后删除临时文件
    except Exception as e:
        messagebox.showerror("TEXT TO SPEECH", f"Speech generation failed: {str(e)}")
        # 清理临时文件(如果存在)
        if os.path.exists(temp_audio):
            os.remove(temp_audio)

def clear_text():
    sor_txt.delete(1.0, tk.END)
    dest_txt.delete(1.0, tk.END)

# 按钮
button_change = tk.Button(frame1, text="TRANSLATE & SPEAK", relief=tk.RAISED, borderwidth=2,
                          font=('verdana', 10, 'bold'), bg='#248aa2', cursor="hand2",
                          command=translate_and_speak)
button_change.place(x=590, y=430, width=150, height=40)
button_clear = tk.Button(frame1, text="CLEAR", relief=tk.RAISED, borderwidth=2,
                         font=('verdana', 10, 'bold'), bg='#248aa2', cursor="hand2",
                         command=clear_text)
button_clear.place(x=590, y=480, width=150, height=40)

root.mainloop()

关键修正点说明

  • 语言映射:通过LANG_NAME_TO_CODE将下拉框的语言名称转换为API支持的语言代码,避免名称不兼容问题。
  • 变量统一:使用selected_lang_name获取下拉框选中的语言,替代原来未定义的choose_lang。
  • 拼写修正:修正了语言名称的拼写错误,确保能正确映射到语言代码。
  • 音频播放逻辑:先将gTTS生成的音频保存为临时文件,播放后自动删除,符合playsound的使用要求。
  • 异常处理:添加了翻译和语音生成的异常捕获,避免程序崩溃并给出明确错误提示。
  • 缺失模块补充:导入了ttk和messagebox,定义了frame1控件,修复语法错误。

内容的提问来源于stack exchange,提问作者Indibar Dutta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:20:31