KIMOSSINO commited on
Commit
c23c554
·
verified ·
1 Parent(s): 2a32769

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -105
app.py CHANGED
@@ -1,10 +1,9 @@
1
  import gradio as gr
2
  import whisper
3
  import os
4
- import torch
5
- import torchaudio
6
- from transformers import pipeline, AutoProcessor, AutoModelForCausalLM
7
- from transformers import SpeechT5Model, SpeechT5Processor
8
  from deep_translator import GoogleTranslator
9
  from docx import Document
10
  import tempfile
@@ -32,57 +31,18 @@ SUPPORTED_LANGUAGES = {
32
  'de': 'Deutsch'
33
  }
34
 
35
- # تعيين نماذج الصوت
36
- TTS_MODELS = {
37
- 'ar': {
38
- 'male': "facebook/mms-tts-ara",
39
- 'female': "facebook/mms-tts-ara"
40
- },
41
- 'en': {
42
- 'male': "microsoft/speecht5_tts",
43
- 'female': "microsoft/speecht5_tts"
44
- },
45
- 'fr': {
46
- 'male': "facebook/mms-tts-fra",
47
- 'female': "facebook/mms-tts-fra"
48
- },
49
- 'es': {
50
- 'male': "facebook/mms-tts-spa",
51
- 'female': "facebook/mms-tts-spa"
52
- },
53
- 'de': {
54
- 'male': "facebook/mms-tts-deu",
55
- 'female': "facebook/mms-tts-deu"
56
- }
57
- }
58
-
59
- # تعريف أنماط الصوت
60
- VOICE_STYLES = {
61
- 'normal': {'speed_factor': 1.0, 'pitch_shift': 0},
62
- 'excited': {'speed_factor': 1.2, 'pitch_shift': 2},
63
- 'calm': {'speed_factor': 0.9, 'pitch_shift': -1},
64
- 'angry': {'speed_factor': 1.1, 'pitch_shift': -2},
65
- 'broadcaster': {'speed_factor': 1.1, 'pitch_shift': 1}
66
  }
67
 
68
  # تحديد اللغات RTL
69
  RTL_LANGUAGES = ['ar']
70
 
71
- class TTSGenerator:
72
- def __init__(self):
73
- self.models = {}
74
- self.processors = {}
75
-
76
- def get_model(self, lang, gender):
77
- key = f"{lang}_{gender}"
78
- if key not in self.models:
79
- model_name = TTS_MODELS[lang][gender]
80
- self.processors[key] = AutoProcessor.from_pretrained(model_name)
81
- self.models[key] = AutoModelForTextToSpeech.from_pretrained(model_name)
82
- return self.processors[key], self.models[key]
83
-
84
- tts_generator = TTSGenerator()
85
-
86
  async def generate_speech(text, lang):
87
  """توليد الصوت باستخدام edge-tts"""
88
  try:
@@ -137,27 +97,22 @@ def text_to_speech(text, lang, progress=gr.Progress()):
137
  # دمج الملفات الصوتية إذا كان هناك أكثر من جزء
138
  from pydub import AudioSegment
139
 
140
- try:
141
- final_audio = AudioSegment.from_mp3(audio_files[0])
142
- for audio_file in audio_files[1:]:
143
- final_audio += AudioSegment.from_mp3(audio_file)
144
-
145
- final_path = tempfile.mktemp(suffix='.mp3')
146
- final_audio.export(final_path, format="mp3")
147
-
148
- # تنظيف الملفات المؤقتة
149
- for file in audio_files:
150
- try:
151
- os.remove(file)
152
- except:
153
- pass
154
-
155
- progress(1.0, desc="تم إنشاء الصوت بنجاح!")
156
- return final_path
157
 
158
- except Exception as e:
159
- logger.error(f"خطأ في دمج الملفات الصوتية: {str(e)}")
160
- return None
 
 
 
 
 
 
 
 
 
161
 
162
  except Exception as e:
163
  logger.error(f"خطأ في تحويل النص إلى صوت: {str(e)}")
@@ -171,15 +126,19 @@ def create_document(original_text, translated_text, source_lang, target_lang, pr
171
  doc.add_heading('النص الأصلي والترجمة', 0)
172
 
173
  progress(0.3, desc="جاري إضافة المحتوى...")
 
174
  doc.add_paragraph(f'تم الإنشاء في: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
175
 
 
176
  doc.add_heading(f'النص الأصلي ({SUPPORTED_LANGUAGES[source_lang]})', level=1)
177
  doc.add_paragraph(original_text)
178
 
179
  progress(0.6, desc="جاري إضافة الترجمة...")
 
180
  doc.add_heading(f'الترجمة ({SUPPORTED_LANGUAGES[target_lang]})', level=1)
181
  doc.add_paragraph(translated_text)
182
 
 
183
  progress(0.9, desc="جاري حفظ المستند...")
184
  temp_path = tempfile.mktemp(suffix='.docx')
185
  doc.save(temp_path)
@@ -203,7 +162,7 @@ def translate_text(text, source_lang, target_lang, progress=gr.Progress()):
203
 
204
  translator = GoogleTranslator(source=source_lang, target=target_lang)
205
 
206
- # تقسيم النص إلى أجزاء
207
  max_length = 5000
208
  text_parts = [text[i:i+max_length] for i in range(0, len(text), max_length)]
209
 
@@ -233,21 +192,26 @@ def process_video(video, source_lang="en", target_lang="ar", progress=gr.Progres
233
  }
234
 
235
  try:
 
236
  progress(0.1, desc="جاري تحميل الفيديو...")
237
  temp_path = video.name
238
  logger.info(f"تم استلام ملف فيديو: {temp_path}")
239
 
 
240
  progress(0.3, desc="جاري تحميل نموذج التعرف على الكلام...")
241
  model = whisper.load_model("base")
242
 
 
243
  progress(0.5, desc="جاري استخراج النص من الفيديو...")
244
  result = model.transcribe(temp_path, language=source_lang)
245
  transcribed_text = result["text"]
246
  logger.info("تم استخراج النص بنجاح")
247
 
 
248
  progress(0.7, desc="جاري ترجمة النص...")
249
  translated_text = translate_text(transcribed_text, source_lang, target_lang)
250
 
 
251
  progress(0.9, desc="جاري إنشاء المستند...")
252
  doc_path = create_document(transcribed_text, translated_text, source_lang, target_lang)
253
 
@@ -312,22 +276,8 @@ def create_ui():
312
  elem_classes=["ltr"]
313
  )
314
  with gr.Row():
315
- with gr.Column():
316
- original_gender = gr.Radio(
317
- choices=["male", "female"],
318
- value="male",
319
- label="🧑 جنس المتحدث",
320
- info="اختر جنس المتحدث"
321
- )
322
- original_style = gr.Dropdown(
323
- choices=list(VOICE_STYLES.keys()),
324
- value="normal",
325
- label="🎭 نمط الصوت",
326
- info="اختر نمط الصوت المناسب"
327
- )
328
- with gr.Column():
329
- generate_original_audio = gr.Button("🔊 توليد الصوت", variant="secondary")
330
- original_audio = gr.Audio(label="الصوت", visible=True)
331
 
332
  with gr.TabItem("🔄 النص المترجم"):
333
  translated_text = gr.Textbox(
@@ -336,22 +286,8 @@ def create_ui():
336
  elem_classes=["rtl"]
337
  )
338
  with gr.Row():
339
- with gr.Column():
340
- translated_gender = gr.Radio(
341
- choices=["male", "female"],
342
- value="male",
343
- label="🧑 جنس المتحدث",
344
- info="اختر جنس المتحدث"
345
- )
346
- translated_style = gr.Dropdown(
347
- choices=list(VOICE_STYLES.keys()),
348
- value="normal",
349
- label="🎭 نمط الصوت",
350
- info="اختر نمط الصوت المناسب"
351
- )
352
- with gr.Column():
353
- generate_translated_audio = gr.Button("🔊 توليد الصوت", variant="secondary")
354
- translated_audio = gr.Audio(label="الصوت", visible=True)
355
 
356
  with gr.Row():
357
  download_btn = gr.File(
@@ -362,6 +298,7 @@ def create_ui():
362
  def update_ui(video, src_lang, tgt_lang):
363
  result = process_video(video, src_lang, tgt_lang)
364
 
 
365
  original_classes = "rtl" if src_lang in RTL_LANGUAGES else "ltr"
366
  translated_classes = "rtl" if tgt_lang in RTL_LANGUAGES else "ltr"
367
 
@@ -372,6 +309,7 @@ def create_ui():
372
  download_btn: result["document"]
373
  }
374
 
 
375
  process_btn.click(
376
  fn=update_ui,
377
  inputs=[video_input, source_lang, target_lang],
@@ -380,13 +318,13 @@ def create_ui():
380
 
381
  generate_original_audio.click(
382
  fn=text_to_speech,
383
- inputs=[original_text, source_lang, original_gender, original_style],
384
  outputs=[original_audio]
385
  )
386
 
387
  generate_translated_audio.click(
388
  fn=text_to_speech,
389
- inputs=[translated_text, target_lang, translated_gender, translated_style],
390
  outputs=[translated_audio]
391
  )
392
 
 
1
  import gradio as gr
2
  import whisper
3
  import os
4
+ import asyncio
5
+ import edge_tts
6
+ from transformers import pipeline
 
7
  from deep_translator import GoogleTranslator
8
  from docx import Document
9
  import tempfile
 
31
  'de': 'Deutsch'
32
  }
33
 
34
+ # تعيين أصوات لكل لغة
35
+ VOICE_MAPPINGS = {
36
+ 'ar': 'ar-EG-ShakirNeural',
37
+ 'en': 'en-US-EricNeural',
38
+ 'fr': 'fr-FR-HenriNeural',
39
+ 'es': 'es-ES-AlvaroNeural',
40
+ 'de': 'de-DE-ConradNeural'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  }
42
 
43
  # تحديد اللغات RTL
44
  RTL_LANGUAGES = ['ar']
45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  async def generate_speech(text, lang):
47
  """توليد الصوت باستخدام edge-tts"""
48
  try:
 
97
  # دمج الملفات الصوتية إذا كان هناك أكثر من جزء
98
  from pydub import AudioSegment
99
 
100
+ final_audio = AudioSegment.from_mp3(audio_files[0])
101
+ for audio_file in audio_files[1:]:
102
+ final_audio += AudioSegment.from_mp3(audio_file)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
 
104
+ final_path = tempfile.mktemp(suffix='.mp3')
105
+ final_audio.export(final_path, format="mp3")
106
+
107
+ # تنظيف الملفات المؤقتة
108
+ for file in audio_files:
109
+ try:
110
+ os.remove(file)
111
+ except:
112
+ pass
113
+
114
+ progress(1.0, desc="تم إنشاء الصوت بنجاح!")
115
+ return final_path
116
 
117
  except Exception as e:
118
  logger.error(f"خطأ في تحويل النص إلى صوت: {str(e)}")
 
126
  doc.add_heading('النص الأصلي والترجمة', 0)
127
 
128
  progress(0.3, desc="جاري إضافة المحتوى...")
129
+ # إضافة التاريخ والوقت
130
  doc.add_paragraph(f'تم الإنشاء في: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
131
 
132
+ # إضافة النص الأصلي
133
  doc.add_heading(f'النص الأصلي ({SUPPORTED_LANGUAGES[source_lang]})', level=1)
134
  doc.add_paragraph(original_text)
135
 
136
  progress(0.6, desc="جاري إضافة الترجمة...")
137
+ # إضافة الترجمة
138
  doc.add_heading(f'الترجمة ({SUPPORTED_LANGUAGES[target_lang]})', level=1)
139
  doc.add_paragraph(translated_text)
140
 
141
+ # حفظ الملف
142
  progress(0.9, desc="جاري حفظ المستند...")
143
  temp_path = tempfile.mktemp(suffix='.docx')
144
  doc.save(temp_path)
 
162
 
163
  translator = GoogleTranslator(source=source_lang, target=target_lang)
164
 
165
+ # تقسيم النص إلى أجزاء إذا كان طويلاً
166
  max_length = 5000
167
  text_parts = [text[i:i+max_length] for i in range(0, len(text), max_length)]
168
 
 
192
  }
193
 
194
  try:
195
+ # حفظ الفيديو مؤقتاً
196
  progress(0.1, desc="جاري تحميل الفيديو...")
197
  temp_path = video.name
198
  logger.info(f"تم استلام ملف فيديو: {temp_path}")
199
 
200
+ # تحميل نموذج Whisper
201
  progress(0.3, desc="جاري تحميل نموذج التعرف على الكلام...")
202
  model = whisper.load_model("base")
203
 
204
+ # استخراج النص
205
  progress(0.5, desc="جاري استخراج النص من الفيديو...")
206
  result = model.transcribe(temp_path, language=source_lang)
207
  transcribed_text = result["text"]
208
  logger.info("تم استخراج النص بنجاح")
209
 
210
+ # ترجمة النص
211
  progress(0.7, desc="جاري ترجمة النص...")
212
  translated_text = translate_text(transcribed_text, source_lang, target_lang)
213
 
214
+ # إنشاء ملف Word
215
  progress(0.9, desc="جاري إنشاء المستند...")
216
  doc_path = create_document(transcribed_text, translated_text, source_lang, target_lang)
217
 
 
276
  elem_classes=["ltr"]
277
  )
278
  with gr.Row():
279
+ generate_original_audio = gr.Button("🔊 توليد الصوت", variant="secondary")
280
+ original_audio = gr.Audio(label="الصوت", visible=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
281
 
282
  with gr.TabItem("🔄 النص المترجم"):
283
  translated_text = gr.Textbox(
 
286
  elem_classes=["rtl"]
287
  )
288
  with gr.Row():
289
+ generate_translated_audio = gr.Button("🔊 توليد الصوت", variant="secondary")
290
+ translated_audio = gr.Audio(label="الصوت", visible=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
291
 
292
  with gr.Row():
293
  download_btn = gr.File(
 
298
  def update_ui(video, src_lang, tgt_lang):
299
  result = process_video(video, src_lang, tgt_lang)
300
 
301
+ # تحديث اتجاه النص
302
  original_classes = "rtl" if src_lang in RTL_LANGUAGES else "ltr"
303
  translated_classes = "rtl" if tgt_lang in RTL_LANGUAGES else "ltr"
304
 
 
309
  download_btn: result["document"]
310
  }
311
 
312
+ # ربط الأحداث
313
  process_btn.click(
314
  fn=update_ui,
315
  inputs=[video_input, source_lang, target_lang],
 
318
 
319
  generate_original_audio.click(
320
  fn=text_to_speech,
321
+ inputs=[original_text, source_lang],
322
  outputs=[original_audio]
323
  )
324
 
325
  generate_translated_audio.click(
326
  fn=text_to_speech,
327
+ inputs=[translated_text, target_lang],
328
  outputs=[translated_audio]
329
  )
330