KIMOSSINO commited on
Commit
f670263
·
verified ·
1 Parent(s): ec3cde4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +56 -41
app.py CHANGED
@@ -1,23 +1,18 @@
1
  import os
2
- import json
3
  import asyncio
4
  import tempfile
5
- import requests
6
  import gradio as gr
7
  import whisper
8
  import torch
9
  import edge_tts
10
  from pathlib import Path
11
  from moviepy.editor import VideoFileClip
 
12
 
13
  # تهيئة النماذج
14
  DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
15
  whisper_model = whisper.load_model("base")
16
 
17
- # مفتاح API لـ Gemini
18
- GEMINI_API_KEY = "AIzaSyDrHCW4FxrDt6amCTQvYPTdh2NE06p9YlQ"
19
- GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent"
20
-
21
  # قاموس للغات المدعومة
22
  SUPPORTED_LANGUAGES = {
23
  "ar": {"name": "العربية", "code": "ar-SA"},
@@ -26,6 +21,16 @@ SUPPORTED_LANGUAGES = {
26
  "es": {"name": "Español", "code": "es-ES"}
27
  }
28
 
 
 
 
 
 
 
 
 
 
 
29
  # قاموس لأنواع الأصوات
30
  VOICE_TYPES = {
31
  "رجل": {
@@ -41,7 +46,7 @@ VOICE_TYPES = {
41
  "es": "es-ES-ElviraNeural"
42
  },
43
  "طفل": {
44
- "ar": "ar-SA-ZariyahNeural", # نستخدم صوت المرأة مع تعديل النبرة
45
  "en": "en-US-JennyNeural",
46
  "fr": "fr-FR-DeniseNeural",
47
  "es": "es-ES-ElviraNeural"
@@ -62,19 +67,24 @@ def extract_audio_from_video(video_path):
62
  def process_media_file(file_path, source_lang):
63
  """معالجة ملف الوسائط (صوت أو فيديو)"""
64
  try:
 
 
 
65
  # التحقق من نوع الملف
66
- if file_path.endswith(('.mp4', '.avi', '.mov', '.mkv')):
67
  # إذا كان فيديو، استخرج الصوت منه
68
- audio_path = extract_audio_from_video(file_path)
69
- else:
70
  # إذا كان ملف صوتي، استخدمه مباشرة
71
- audio_path = file_path
 
 
72
 
73
  # تحويل الصوت إلى نص
74
  result = whisper_model.transcribe(audio_path, language=source_lang)
75
 
76
  # حذف الملف المؤقت إذا كان فيديو
77
- if file_path.endswith(('.mp4', '.avi', '.mov', '.mkv')):
78
  os.remove(audio_path)
79
 
80
  return result["text"]
@@ -82,36 +92,36 @@ def process_media_file(file_path, source_lang):
82
  return f"خطأ في معالجة الملف: {str(e)}"
83
 
84
  def translate_text(text, source_lang, target_lang):
85
- """ترجمة النص باستخدام Gemini API"""
86
  if source_lang == target_lang:
87
  return text
88
 
89
  try:
90
- prompt = f"Translate the following text from {SUPPORTED_LANGUAGES[source_lang]['name']} to {SUPPORTED_LANGUAGES[target_lang]['name']}. Only provide the translation without any additional text or explanation:\n\n{text}"
91
-
92
- payload = {
93
- "contents": [{
94
- "parts": [{
95
- "text": prompt
96
- }]
97
- }]
98
- }
99
-
100
- url = f"{GEMINI_API_URL}?key={GEMINI_API_KEY}"
101
-
102
- response = requests.post(
103
- url,
104
- headers={"Content-Type": "application/json"},
105
- json=payload
106
- )
107
-
108
- if response.status_code == 200:
109
- result = response.json()
110
- translated_text = result['candidates'][0]['content']['parts'][0]['text']
111
- return translated_text
112
- else:
113
- return f"خطأ في الترجمة: {response.status_code} - {response.text}"
114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  except Exception as e:
116
  return f"خطأ في الترجمة: {str(e)}"
117
 
@@ -151,18 +161,23 @@ def text_to_speech_wrapper(text, language, voice_type):
151
  with gr.Blocks(title="معالج الصوت والترجمة", theme=gr.themes.Soft()) as demo:
152
  gr.Markdown("# معالج الصوت والترجمة متعدد اللغات")
153
 
154
- with gr.Tab("تحويل الوسائط إلى نص"):
 
 
 
 
 
 
155
  with gr.Row():
156
  media_input = gr.File(
157
- label="ملف صوتي أو فيديو",
158
- file_types=[".mp3", ".wav", ".m4a", ".mp4", ".avi", ".mov", ".mkv"]
159
  )
160
  source_lang = gr.Dropdown(
161
  choices=list(SUPPORTED_LANGUAGES.keys()),
162
  value="ar",
163
  label="لغة الملف"
164
  )
165
-
166
  transcribe_btn = gr.Button("تحويل إلى نص")
167
  transcribed_text = gr.Textbox(label="النص المستخرج", lines=5)
168
 
 
1
  import os
 
2
  import asyncio
3
  import tempfile
 
4
  import gradio as gr
5
  import whisper
6
  import torch
7
  import edge_tts
8
  from pathlib import Path
9
  from moviepy.editor import VideoFileClip
10
+ from transformers import MarianMTModel, MarianTokenizer
11
 
12
  # تهيئة النماذج
13
  DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
14
  whisper_model = whisper.load_model("base")
15
 
 
 
 
 
16
  # قاموس للغات المدعومة
17
  SUPPORTED_LANGUAGES = {
18
  "ar": {"name": "العربية", "code": "ar-SA"},
 
21
  "es": {"name": "Español", "code": "es-ES"}
22
  }
23
 
24
+ # قاموس لنماذج الترجمة
25
+ TRANSLATION_MODELS = {
26
+ "ar-en": "Helsinki-NLP/opus-mt-ar-en",
27
+ "en-ar": "Helsinki-NLP/opus-mt-en-ar",
28
+ "fr-en": "Helsinki-NLP/opus-mt-fr-en",
29
+ "en-fr": "Helsinki-NLP/opus-mt-en-fr",
30
+ "es-en": "Helsinki-NLP/opus-mt-es-en",
31
+ "en-es": "Helsinki-NLP/opus-mt-en-es"
32
+ }
33
+
34
  # قاموس لأنواع الأصوات
35
  VOICE_TYPES = {
36
  "رجل": {
 
46
  "es": "es-ES-ElviraNeural"
47
  },
48
  "طفل": {
49
+ "ar": "ar-SA-ZariyahNeural",
50
  "en": "en-US-JennyNeural",
51
  "fr": "fr-FR-DeniseNeural",
52
  "es": "es-ES-ElviraNeural"
 
67
  def process_media_file(file_path, source_lang):
68
  """معالجة ملف الوسائط (صوت أو فيديو)"""
69
  try:
70
+ if file_path is None:
71
+ return "الرجاء تحميل ملف صوتي أو فيديو"
72
+
73
  # التحقق من نوع الملف
74
+ if file_path.name.lower().endswith(('.mp4', '.avi', '.mov', '.mkv')):
75
  # إذا كان فيديو، استخرج الصوت منه
76
+ audio_path = extract_audio_from_video(file_path.name)
77
+ elif file_path.name.lower().endswith(('.mp3', '.wav', '.m4a')):
78
  # إذا كان ملف صوتي، استخدمه مباشرة
79
+ audio_path = file_path.name
80
+ else:
81
+ return "نوع الملف غير مدعوم. الأنواع المدعومة هي: MP3, WAV, M4A, MP4, AVI, MOV, MKV"
82
 
83
  # تحويل الصوت إلى نص
84
  result = whisper_model.transcribe(audio_path, language=source_lang)
85
 
86
  # حذف الملف المؤقت إذا كان فيديو
87
+ if file_path.name.lower().endswith(('.mp4', '.avi', '.mov', '.mkv')):
88
  os.remove(audio_path)
89
 
90
  return result["text"]
 
92
  return f"خطأ في معالجة الملف: {str(e)}"
93
 
94
  def translate_text(text, source_lang, target_lang):
95
+ """ترجمة النص باستخدام MarianMT"""
96
  if source_lang == target_lang:
97
  return text
98
 
99
  try:
100
+ # إذا كانت اللغة المصدر ليست الإنجليزية، نترجم أولاً إلى الإنجليزية
101
+ if source_lang != "en":
102
+ model_name = TRANSLATION_MODELS[f"{source_lang}-en"]
103
+ model = MarianMTModel.from_pretrained(model_name)
104
+ tokenizer = MarianTokenizer.from_pretrained(model_name)
105
+
106
+ inputs = tokenizer(text, return_tensors="pt", padding=True)
107
+ translated = model.generate(**inputs)
108
+ text = tokenizer.decode(translated[0], skip_special_tokens=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
 
110
+ # إذا كانت اللغة الهدف هي الإنجليزية، نتوقف هنا
111
+ if target_lang == "en":
112
+ return text
113
+
114
+ # ترجمة من الإنجليزية إلى اللغة الهدف
115
+ if target_lang != "en":
116
+ model_name = TRANSLATION_MODELS[f"en-{target_lang}"]
117
+ model = MarianMTModel.from_pretrained(model_name)
118
+ tokenizer = MarianTokenizer.from_pretrained(model_name)
119
+
120
+ inputs = tokenizer(text, return_tensors="pt", padding=True)
121
+ translated = model.generate(**inputs)
122
+ text = tokenizer.decode(translated[0], skip_special_tokens=True)
123
+
124
+ return text
125
  except Exception as e:
126
  return f"خطأ في الترجمة: {str(e)}"
127
 
 
161
  with gr.Blocks(title="معالج الصوت والترجمة", theme=gr.themes.Soft()) as demo:
162
  gr.Markdown("# معالج الصوت والترجمة متعدد اللغات")
163
 
164
+ with gr.Tab("تحويل الوسائط إلى نص"):
165
+ gr.Markdown("""
166
+ ### الملفات المدعومة:
167
+ - ملفات الصوت: MP3, WAV, M4A
168
+ - ملفات الفيديو: MP4, AVI, MOV, MKV
169
+ """)
170
+
171
  with gr.Row():
172
  media_input = gr.File(
173
+ label="ملف صوتي أو فيديو"
 
174
  )
175
  source_lang = gr.Dropdown(
176
  choices=list(SUPPORTED_LANGUAGES.keys()),
177
  value="ar",
178
  label="لغة الملف"
179
  )
180
+
181
  transcribe_btn = gr.Button("تحويل إلى نص")
182
  transcribed_text = gr.Textbox(label="النص المستخرج", lines=5)
183