Python多语言翻译项目:语音转文本模块功能实现求助
多语言翻译器语音转文本功能修复
现有代码问题分析
speak函数未根据选中语言指定识别参数,默认仅识别英文- 函数外的
if (l.get())==('Hindi')代码块逻辑无效:执行时机错误,且变量r、audio、sor_text未正确定义 - 使用
exit()直接终止程序,用户体验极差,应改用弹窗提示 - 变量名错误:
sor_text应为sor_txt
修复方案
- 新增语言名称与Google语音识别代码的映射表,匹配下拉框中的语言选项
- 重构
speak函数,实现基于选中语言的语音识别,并将结果插入源文本框 - 替换
exit()为messagebox弹窗提示,保留程序运行状态 - 移除无效的外部判断代码块
- 修正原代码中语言名称的拼写错误
修复后的完整代码
import tkinter as tk from tkinter import * from tkinter import ttk from tkinter import messagebox from tkinter import filedialog from tkinter.messagebox import showinfo from tkinter.ttk import Combobox from googletrans import Translator, LANGUAGES import pyttsx3 import os import speech_recognition as sr root=Tk() root.title("TEXT TO SPEECH") root.geometry("1280x720") root.resizable(False,False) root.configure(bg="#305065") # 语言名称到Google语音识别代码的映射 LANG_CODE_MAP = { 'Afrikaans': 'af-ZA', 'Albanian': 'sq-AL', 'Amharic': 'am-ET', 'Arabic': 'ar-SA', 'Armenian': 'hy-AM', 'Azerbaijani': 'az-AZ', 'Basque': 'eu-ES', 'Belarusian': 'be-BY', 'Bengali': 'bn-IN', 'Bosnian': 'bs-BA', 'Bulgarian': 'bg-BG', 'Catalan': 'ca-ES', 'Cebuano': 'ceb-PH', 'Chichewa': 'ny-MW', 'Chinese (simplified)': 'zh-CN', 'Chinese (traditional)': 'zh-TW', 'Corsican': 'co-FR', 'Croatian': 'hr-HR', 'Czech': 'cs-CZ', 'Danish': 'da-DK', 'Dutch': 'nl-NL', 'English': 'en-US', 'Esperanto': 'eo-XX', 'Estonian': 'et-EE', 'Filipino': 'fil-PH', 'Finnish': 'fi-FI', 'French': 'fr-FR', 'Frisian': 'fy-NL', 'Galician': 'gl-ES', 'Georgian': 'ka-GE', 'German': 'de-DE', 'Greek': 'el-GR', 'Gujarati': 'gu-IN', 'Haitian creole': 'ht-HT', 'Hausa': 'ha-NG', 'Hawaiian': 'haw-US', 'Hebrew': 'he-IL', 'Hindi': 'hi-IN', 'Hmong': 'hmn-US', 'Hungarian': 'hu-HU', 'Icelandic': 'is-IS', 'Igbo': 'ig-NG', 'Indonesian': 'id-ID', 'Irish': 'ga-IE', 'Italian': 'it-IT', 'Japanese': 'ja-JP', 'Javanese': 'jv-ID', 'Kannada': 'kn-IN', 'Kazakh': 'kk-KZ', 'Khmer': 'km-KH', 'Korean': 'ko-KR', 'Kurdish (kurmanji)': 'ku-TR', 'Kyrgyz': 'ky-KG', 'Lao': 'lo-LA', 'Latin': 'la-XX', 'Latvian': 'lv-LV', 'Lithuanian': 'lt-LT', 'Luxembourgish': 'lb-LU', 'Macedonian': 'mk-MK', 'Malagasy': 'mg-MG', 'Malay': 'ms-MY', 'Malayalam': 'ml-IN', 'Maltese': 'mt-MT', 'Maori': 'mi-NZ', 'Marathi': 'mr-IN', 'Mongolian': 'mn-MN', 'Myanmar (burmese)': 'my-MM', 'Nepali': 'ne-NP', 'Norwegian': 'nb-NO', 'Odia': 'or-IN', 'Pashto': 'ps-AF', 'Persian': 'fa-IR', 'Polish': 'pl-PL', 'Portuguese': 'pt-BR', 'Punjabi': 'pa-IN', 'Romanian': 'ro-RO', 'Russian': 'ru-RU', 'Samoan': 'sm-WS', 'Scots gaelic': 'gd-GB', 'Serbian': 'sr-RS', 'Sesotho': 'st-ZA', 'Shona': 'sn-ZW', 'Sindhi': 'sd-PK', 'Sinhala': 'si-LK', 'Slovak': 'sk-SK', 'Slovenian': 'sl-SI', 'Somali': 'so-SO', 'Spanish': 'es-ES', 'Sundanese': 'su-ID', 'Swahili': 'sw-KE', 'Swedish': 'sv-SE', 'Tajik': 'tg-TJ', 'Tamil': 'ta-IN', 'Telugu': 'te-IN', 'Thai': 'th-TH', 'Turkish': 'tr-TR', 'Ukrainian': 'uk-UA', 'Urdu': 'ur-PK', 'Uyghur': 'ug-CN', 'Uzbek': 'uz-UZ', 'Vietnamese': 'vi-VN', 'Welsh': 'cy-GB', 'Xhosa': 'xh-ZA', 'Yiddish': 'yi-DE', 'Yoruba': 'yo-NG', 'Zulu': 'zu-ZA' } # 翻译功能 def translate(): lang_1=sor_txt.get(1.0,END) cl=choose_lang.get() if lang_1 == '': messagebox.showerror("TEXT TO SPEECH","Enter the text to translate!") else: dest_txt.delete(1.0,END) translator=Translator() output=translator.translate(lang_1,dest=cl) dest_txt.insert('end',output.text) # 清空文本框 def clear(): sor_txt.delete(1.0,'end') dest_txt.delete(1.0,'end') # 主框架 frame1=Frame(root,width=1280,height=720,relief=RIDGE,borderwidth=5,bg='#305065') frame1.place(x=0,y=0) # 标题 Label(root,text="TEXT TO SPEECH",font="Helvetica 20 bold",fg="white",bg='#305065').pack(pady=10) # 源语言选择框 a=tk.StringVar() auto_select=ttk.Combobox(frame1,width=27,textvariable=a,state='readonly',font=('verdana',10,'bold')) auto_select['values'] = tuple(LANG_CODE_MAP.keys()) auto_select.place(x=150,y=60) # 目标语言选择框 l=tk.StringVar() choose_lang=ttk.Combobox(frame1,width=27,textvariable=l,state='readonly',font=('verdana',10,'bold')) choose_lang['values'] = tuple(LANG_CODE_MAP.keys()) choose_lang.place(x=850,y=60) # 窗口图标 try: image_icon=PhotoImage(file="speak.png") root.iconphoto(False,image_icon) except: pass # 文本框与按钮 sor_txt=Text(frame1,width=40,height=11,borderwidth=5,relief=RIDGE,font=('verdana',15)) sor_txt.place(x=30,y=110) dest_txt=Text(frame1,width=40,height=11,borderwidth=5,relief=RIDGE,font=('verdana',15)) dest_txt.place(x=710,y=110) button_change=Button(frame1,text="TRANSLATE",relief=RAISED,borderwidth=2,font=('verdana',10,'bold'),bg='#248aa2',cursor="hand2",command=translate) button_change.place(x=590,y=430,width=100,height=40) button_clear=Button(frame1,text="CLEAR",relief=RAISED,borderwidth=2,font=('verdana',10,'bold'),bg='#248aa2',cursor="hand2",command=clear) button_clear.place(x=590,y=480,width=100,height=40) # 语音转文本功能 def speak(): selected_lang = auto_select.get() if not selected_lang: messagebox.showwarning("提示", "请先选择源语言") return lang_code = LANG_CODE_MAP.get(selected_lang) if not lang_code: messagebox.showerror("错误", "该语言暂不支持语音识别") return r = sr.Recognizer() with sr.Microphone() as source: r.adjust_for_ambient_noise(source) messagebox.showinfo("提示", "请开始说话...") try: audio = r.listen(source, timeout=10, phrase_time_limit=30) except sr.WaitTimeoutError: messagebox.showwarning("超时", "未检测到语音输入") return try: result = r.recognize_google(audio, language=lang_code) sor_txt.insert(END, result) except sr.RequestError: messagebox.showerror("错误", "语音识别服务不可用,请检查网络连接") except sr.UnknownValueError: messagebox.showerror("错误", "无法识别语音,请重新尝试") # 语言选择提示 def lang_change(event): showinfo( title="Result", message=f'You selected {a.get()}!' ) auto_select.bind('<<ComboboxSelected>>', lang_change) # 语音按钮 try: imageicon=PhotoImage(file="speak.png") speak_btn=Button(root,text="Speak",compound=LEFT,image=imageicon,width=130,font="arial 14 bold",command=speak) speak_btn.image = imageicon speak_btn.place(x=230,y=430) except: speak_btn=Button(root,text="Speak",width=130,font="arial 14 bold",command=speak) speak_btn.place(x=230,y=430) root.mainloop()
额外优化说明
- 增加环境噪音调整、超时检测逻辑,提升语音识别稳定性
- 处理图片文件不存在的情况,避免程序崩溃
- 保留原有文本翻译和清空功能,仅修复语音转文本模块
内容的提问来源于stack exchange,提问作者Indibar Dutta
相关产品推荐
相关产品推荐

