KIMOSSINO commited on
Commit
36abef4
·
verified ·
1 Parent(s): 37a7a82

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +85 -28
app.py CHANGED
@@ -1,12 +1,14 @@
1
  import os
2
  import json
 
3
  import tempfile
4
  import requests
5
  import gradio as gr
6
  import whisper
7
  import torch
8
- from gtts import gTTS
9
  from pathlib import Path
 
10
 
11
  # تهيئة النماذج
12
  DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
@@ -18,26 +20,66 @@ GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini
18
 
19
  # قاموس للغات المدعومة
20
  SUPPORTED_LANGUAGES = {
21
- "ar": "العربية",
22
- "en": "English",
23
- "fr": "Français",
24
- "es": "Español"
25
  }
26
 
27
  # قاموس لأنواع الأصوات
28
  VOICE_TYPES = {
29
- "رجل": {"speed": 0.9, "pitch": 0.8},
30
- "امرأة": {"speed": 1.0, "pitch": 1.2},
31
- "طفل": {"speed": 1.1, "pitch": 1.5}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  }
33
 
34
- def transcribe_audio(audio_file, source_lang):
35
- """تحويل الصوت إلى نص باستخدام Whisper"""
36
  try:
37
- result = whisper_model.transcribe(audio_file, language=source_lang)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  return result["text"]
39
  except Exception as e:
40
- return f"خطأ في التحويل: {str(e)}"
41
 
42
  def translate_text(text, source_lang, target_lang):
43
  """ترجمة النص باستخدام Gemini API"""
@@ -45,7 +87,7 @@ def translate_text(text, source_lang, target_lang):
45
  return text
46
 
47
  try:
48
- prompt = f"Translate the following text from {SUPPORTED_LANGUAGES[source_lang]} to {SUPPORTED_LANGUAGES[target_lang]}. Only provide the translation without any additional text or explanation:\n\n{text}"
49
 
50
  payload = {
51
  "contents": [{
@@ -73,45 +115,60 @@ def translate_text(text, source_lang, target_lang):
73
  except Exception as e:
74
  return f"خطأ في الترجمة: {str(e)}"
75
 
76
- def text_to_speech(text, language, voice_type):
77
- """تحويل النص إلى صوت"""
78
  try:
79
- # إنشاء مجلد مؤقت للملفات الصوتية إذا لم يكن موجوداً
80
  temp_dir = Path("temp_audio")
81
  temp_dir.mkdir(exist_ok=True)
82
 
 
 
 
 
 
 
 
83
  # إنشاء ملف صوتي مؤقت
84
- temp_file = temp_dir / f"output_{voice_type}_{language}.mp3"
85
 
86
- # تحويل النص إلى صوت مع تطبيق إعدادات نوع الصوت
87
- voice_settings = VOICE_TYPES[voice_type]
88
- tts = gTTS(text=text, lang=language, slow=False)
89
- tts.save(str(temp_file))
90
 
91
- return str(temp_file)
 
 
 
92
 
93
  except Exception as e:
94
  return f"خطأ في تحويل النص إلى صوت: {str(e)}"
95
 
 
 
 
 
96
  # إنشاء واجهة Gradio
97
  with gr.Blocks(title="معالج الصوت والترجمة", theme=gr.themes.Soft()) as demo:
98
  gr.Markdown("# معالج الصوت والترجمة متعدد اللغات")
99
 
100
- with gr.Tab("تحويل الصوت إلى نص"):
101
  with gr.Row():
102
- audio_input = gr.Audio(type="filepath", label="الملف الصوتي")
 
 
 
103
  source_lang = gr.Dropdown(
104
  choices=list(SUPPORTED_LANGUAGES.keys()),
105
  value="ar",
106
- label="لغة الملف الصوتي"
107
  )
108
 
109
  transcribe_btn = gr.Button("تحويل إلى نص")
110
  transcribed_text = gr.Textbox(label="النص المستخرج", lines=5)
111
 
112
  transcribe_btn.click(
113
- fn=transcribe_audio,
114
- inputs=[audio_input, source_lang],
115
  outputs=transcribed_text
116
  )
117
 
@@ -160,7 +217,7 @@ with gr.Blocks(title="معالج الصوت والترجمة", theme=gr.themes.S
160
  tts_btn = gr.Button("تحويل إلى صوت")
161
 
162
  tts_btn.click(
163
- fn=text_to_speech,
164
  inputs=[tts_text, tts_lang, voice_type],
165
  outputs=tts_output
166
  )
 
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"
 
20
 
21
  # قاموس للغات المدعومة
22
  SUPPORTED_LANGUAGES = {
23
+ "ar": {"name": "العربية", "code": "ar-SA"},
24
+ "en": {"name": "English", "code": "en-US"},
25
+ "fr": {"name": "Français", "code": "fr-FR"},
26
+ "es": {"name": "Español", "code": "es-ES"}
27
  }
28
 
29
  # قاموس لأنواع الأصوات
30
  VOICE_TYPES = {
31
+ "رجل": {
32
+ "ar": "ar-SA-HamedNeural",
33
+ "en": "en-US-ChristopherNeural",
34
+ "fr": "fr-FR-HenriNeural",
35
+ "es": "es-ES-AlvaroNeural"
36
+ },
37
+ "امرأة": {
38
+ "ar": "ar-SA-ZariyahNeural",
39
+ "en": "en-US-JennyNeural",
40
+ "fr": "fr-FR-DeniseNeural",
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"
48
+ }
49
  }
50
 
51
+ def extract_audio_from_video(video_path):
52
+ """استخراج الصوت من الفيديو"""
53
  try:
54
+ video = VideoFileClip(video_path)
55
+ temp_audio_path = tempfile.mktemp(suffix=".mp3")
56
+ video.audio.write_audiofile(temp_audio_path, codec='mp3')
57
+ video.close()
58
+ return temp_audio_path
59
+ except Exception as e:
60
+ raise Exception(f"خطأ في استخراج الصوت من الفيديو: {str(e)}")
61
+
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"]
81
  except Exception as e:
82
+ return f"خطأ في معالجة الملف: {str(e)}"
83
 
84
  def translate_text(text, source_lang, target_lang):
85
  """ترجمة النص باستخدام Gemini API"""
 
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": [{
 
115
  except Exception as e:
116
  return f"خطأ في الترجمة: {str(e)}"
117
 
118
+ async def text_to_speech(text, language, voice_type):
119
+ """تحويل النص إلى صوت باستخدام Edge TTS"""
120
  try:
121
+ # إنشاء مجلد مؤقت للملفات الصوتية
122
  temp_dir = Path("temp_audio")
123
  temp_dir.mkdir(exist_ok=True)
124
 
125
+ # اختيار الصوت المناسب
126
+ voice = VOICE_TYPES[voice_type][language]
127
+
128
+ # تعديل السرعة والنبرة حسب نوع الصوت
129
+ rate = "+0%" if voice_type != "طفل" else "+15%"
130
+ pitch = "+0Hz" if voice_type == "رجل" else "+50Hz" if voice_type == "امرأة" else "+100Hz"
131
+
132
  # إنشاء ملف صوتي مؤقت
133
+ output_file = temp_dir / f"output_{voice_type}_{language}.mp3"
134
 
135
+ # تكوين كائن communicate
136
+ communicate = edge_tts.Communicate(text, voice, rate=rate, pitch=pitch)
 
 
137
 
138
+ # حفظ الملف الصوتي
139
+ await communicate.save(str(output_file))
140
+
141
+ return str(output_file)
142
 
143
  except Exception as e:
144
  return f"خطأ في تحويل النص إلى صوت: {str(e)}"
145
 
146
+ def text_to_speech_wrapper(text, language, voice_type):
147
+ """wrapper function لتشغيل الدالة غير المتزامنة"""
148
+ return asyncio.run(text_to_speech(text, language, voice_type))
149
+
150
  # إنشاء واجهة Gradio
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=["audio/*", "video/*"]
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
 
169
  transcribe_btn.click(
170
+ fn=process_media_file,
171
+ inputs=[media_input, source_lang],
172
  outputs=transcribed_text
173
  )
174
 
 
217
  tts_btn = gr.Button("تحويل إلى صوت")
218
 
219
  tts_btn.click(
220
+ fn=text_to_speech_wrapper,
221
  inputs=[tts_text, tts_lang, voice_type],
222
  outputs=tts_output
223
  )