基于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
相关产品推荐
相关产品推荐

