Hamed744 commited on
Commit
9a2f1d1
·
verified ·
1 Parent(s): 8b0d510

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +23 -25
app.py CHANGED
@@ -9,8 +9,8 @@ import time
9
  import threading
10
  import sys
11
 
12
- # --- NEW: Import googletrans ---
13
- from googletrans import Translator, LANGUAGES # LANGUAGES may not be strictly needed for this fixed target, but good to have.
14
 
15
  # --- START: پیکربندی لاگینگ ---
16
  logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
@@ -41,21 +41,18 @@ language_dict_persian_keys = {
41
  'انگلیسی (آفریقای جنوبی) - لیا (زن)': 'en-ZA-LeahNeural', 'انگلیسی (آفریقای جنوبی) - لوک (مرد)': 'en-ZA-LukeNeural',
42
  }
43
 
44
- # --- تابع جدید برای ترجمه با مترجم گوگل ---
45
- async def translate_text_google(text_to_translate, target_language="English"):
46
  if not text_to_translate or not text_to_translate.strip():
47
  return "خطا: متنی برای ترجمه وارد نشده است.", None
48
 
49
- # Google Translate uses ISO 639-1 codes. "English" maps to "en".
50
- # For a general translator, you'd map 'English' to 'en', 'French' to 'fr', etc.
51
- # Here, we assume the target is always English.
52
  target_lang_code = "en"
53
 
54
- logging.info(f"شروع ترجمه با Google Translate: '{text_to_translate[:50]}...' به '{target_lang_code}'")
55
 
56
  try:
57
- # Instantiate Translator
58
- # googletrans library uses a pool of free Google Translate servers, so no API key is needed.
59
  translator = Translator()
60
 
61
  # Run the synchronous translate method in a thread pool executor.
@@ -63,25 +60,27 @@ async def translate_text_google(text_to_translate, target_language="English"):
63
  # and running it directly in an `async` function would block the entire
64
  # asyncio event loop, making the Gradio app unresponsive.
65
  loop = asyncio.get_event_loop()
66
- translated_obj = await loop.run_in_executor(
67
  None, # Use the default ThreadPoolExecutor
68
  translator.translate,
69
  text_to_translate,
70
- dest=target_lang_code,
71
- src='fa' # Explicitly set source to Persian
72
  )
73
 
74
- if translated_obj and translated_obj.text:
75
- translated_text = translated_obj.text.strip()
76
- logging.info(f"ترجمه موفق با Google Translate: '{translated_text[:50]}...'")
 
 
77
  return "ترجمه موفق", translated_text
78
  else:
79
- logging.error("ترجمه با Google Translate پاسخ خالی برگرداند.")
80
- return "خطا: ترجمه گوگل پاسخ خالی داد.", None
81
  except Exception as e:
82
  error_type = type(e).__name__
83
- logging.error(f"خطای Google Translate ({error_type}): {e}\n{traceback.format_exc()}")
84
- return f"خطا در ترجمه با گوگل ({error_type}): مشکلی در اتصال یا ترجمه پیش آمد.", None
85
 
86
  # --- تابع تولید صدا (بدون تغییر) ---
87
  async def text_to_speech_edge_async(text_to_speak, tts_voice_key, rate, volume, pitch):
@@ -109,13 +108,13 @@ async def text_to_speech_edge_async(text_to_speak, tts_voice_key, rate, volume,
109
  logging.error(f"TTS: خطای نامشخص برای '{voice_id}': {error_type} - {e}")
110
  return f"خطای TTS ({error_type}): مشکلی در تولید صدا پیش آمد.", None
111
 
112
- # --- تابع اصلی Wrapper (با تغییر به تابع ترجمه گوگل) ---
113
  async def translate_and_speak_async_wrapper(persian_text, english_tts_voice_key, rate, volume, pitch):
114
  if not persian_text or not persian_text.strip():
115
  return "لط��اً متن فارسی را برای ترجمه وارد کنید.", None
116
 
117
- # --- MAIN CHANGE: Call the new Google Translate function ---
118
- translation_status_msg, translated_text = await translate_text_google(persian_text, target_language="English")
119
 
120
  if not translated_text:
121
  # If translated_text is None, translation_status_msg already contains the error message
@@ -223,8 +222,7 @@ with gr.Blocks(theme=app_theme_outer, css=custom_css, title="Alpha Translator")
223
  inputs=[input_text_persian, language_dropdown_tts_english, rate_slider, volume_slider, pitch_slider],
224
  outputs=[output_text_translated, output_audio],
225
  fn=translate_and_speak_async_wrapper,
226
- # caching examples can speed up demo loading for common inputs
227
- cache_examples=os.getenv("GRADIO_CACHE_EXAMPLES", "False").lower() == "true",
228
  label="💡 نمونه‌های کاربردی"
229
  )
230
 
 
9
  import threading
10
  import sys
11
 
12
+ # --- NEW: Import free_translate instead of googletrans ---
13
+ from free_translate import Translator
14
 
15
  # --- START: پیکربندی لاگینگ ---
16
  logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
 
41
  'انگلیسی (آفریقای جنوبی) - لیا (زن)': 'en-ZA-LeahNeural', 'انگلیسی (آفریقای جنوبی) - لوک (مرد)': 'en-ZA-LukeNeural',
42
  }
43
 
44
+ # --- تابع جدید برای ترجمه با free-translate ---
45
+ async def translate_text_free_translate(text_to_translate, target_language="English"):
46
  if not text_to_translate or not text_to_translate.strip():
47
  return "خطا: متنی برای ترجمه وارد نشده است.", None
48
 
49
+ # 'English' maps to 'en'. Assuming target is always English for this app.
 
 
50
  target_lang_code = "en"
51
 
52
+ logging.info(f"شروع ترجمه با Free Translate: '{text_to_translate[:50]}...' به '{target_lang_code}'")
53
 
54
  try:
55
+ # Instantiate Translator from free_translate
 
56
  translator = Translator()
57
 
58
  # Run the synchronous translate method in a thread pool executor.
 
60
  # and running it directly in an `async` function would block the entire
61
  # asyncio event loop, making the Gradio app unresponsive.
62
  loop = asyncio.get_event_loop()
63
+ translated_text = await loop.run_in_executor(
64
  None, # Use the default ThreadPoolExecutor
65
  translator.translate,
66
  text_to_translate,
67
+ target_language_code=target_lang_code,
68
+ source_language_code='fa' # Explicitly set source to Persian (Farsi)
69
  )
70
 
71
+ # The free_translate library directly returns the translated string
72
+ translated_text = translated_text.strip() # Ensure it's clean
73
+
74
+ if translated_text:
75
+ logging.info(f"ترجمه موفق با Free Translate: '{translated_text[:50]}...'")
76
  return "ترجمه موفق", translated_text
77
  else:
78
+ logging.error("ترجمه با Free Translate پاسخ خالی برگرداند.")
79
+ return "خطا: ترجمه خالی برگردانده شد.", None
80
  except Exception as e:
81
  error_type = type(e).__name__
82
+ logging.error(f"خطای Free Translate ({error_type}): {e}\n{traceback.format_exc()}")
83
+ return f"خطا در ترجمه با Free Translate ({error_type}): مشکلی در اتصال یا ترجمه پیش آمد.", None
84
 
85
  # --- تابع تولید صدا (بدون تغییر) ---
86
  async def text_to_speech_edge_async(text_to_speak, tts_voice_key, rate, volume, pitch):
 
108
  logging.error(f"TTS: خطای نامشخص برای '{voice_id}': {error_type} - {e}")
109
  return f"خطای TTS ({error_type}): مشکلی در تولید صدا پیش آمد.", None
110
 
111
+ # --- تابع اصلی Wrapper (با تغییر به تابع ترجمه free-translate) ---
112
  async def translate_and_speak_async_wrapper(persian_text, english_tts_voice_key, rate, volume, pitch):
113
  if not persian_text or not persian_text.strip():
114
  return "لط��اً متن فارسی را برای ترجمه وارد کنید.", None
115
 
116
+ # --- MAIN CHANGE: Call the new free-translate function ---
117
+ translation_status_msg, translated_text = await translate_text_free_translate(persian_text, target_language="English")
118
 
119
  if not translated_text:
120
  # If translated_text is None, translation_status_msg already contains the error message
 
222
  inputs=[input_text_persian, language_dropdown_tts_english, rate_slider, volume_slider, pitch_slider],
223
  outputs=[output_text_translated, output_audio],
224
  fn=translate_and_speak_async_wrapper,
225
+ cache_examples=os.getenv("GRADIO_CACHE_EXAMPLES", "False").lower() == "true",
 
226
  label="💡 نمونه‌های کاربردی"
227
  )
228