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

Python多语言翻译项目:语音转文本模块功能实现求助

多语言翻译器语音转文本功能修复

现有代码问题分析

  1. speak函数未根据选中语言指定识别参数,默认仅识别英文
  2. 函数外的if (l.get())==('Hindi')代码块逻辑无效:执行时机错误,且变量r、audio、sor_text未正确定义
  3. 使用exit()直接终止程序,用户体验极差,应改用弹窗提示
  4. 变量名错误:sor_text应为sor_txt

修复方案

  1. 新增语言名称与Google语音识别代码的映射表,匹配下拉框中的语言选项
  2. 重构speak函数,实现基于选中语言的语音识别,并将结果插入源文本框
  3. 替换exit()为messagebox弹窗提示,保留程序运行状态
  4. 移除无效的外部判断代码块
  5. 修正原代码中语言名称的拼写错误

修复后的完整代码

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()

额外优化说明

  1. 增加环境噪音调整、超时检测逻辑,提升语音识别稳定性
  2. 处理图片文件不存在的情况,避免程序崩溃
  3. 保留原有文本翻译和清空功能,仅修复语音转文本模块

内容的提问来源于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 16:20:26