Mahmoudmody777 commited on
Commit
5e20b77
·
verified ·
1 Parent(s): d625393

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +94 -23
app.py CHANGED
@@ -1,43 +1,114 @@
1
  import gradio as gr
2
- import whisper
 
 
 
 
 
 
3
  from pydub import AudioSegment
4
- from pathlib import Path
 
5
 
6
- # تحميل نموذج Whisper (يمكنك اختيار 'base' أو 'small' أو 'medium' أو 'large')
7
- model = whisper.load_model("base")
 
8
 
9
  def convert_audio_to_wav(audio_path):
10
  """تحويل الملف الصوتي إلى صيغة WAV إذا لم يكن كذلك"""
11
- audio_path = Path(audio_path)
12
- if audio_path.suffix.lower() != '.wav':
13
- wav_path = audio_path.with_suffix('.wav')
14
- audio = AudioSegment.from_file(str(audio_path))
15
- audio.export(str(wav_path), format='wav')
16
- return str(wav_path)
17
- return str(audio_path)
18
 
19
- def process_audio(audio_file):
20
- """معالجة الملف الصوتي واستخراج النص"""
 
 
 
 
 
21
  try:
22
- # تحويل الملف الصوتي إلى النص باستخدام Whisper
23
- wav_path = convert_audio_to_wav(audio_file) # استخدم المسار مباشرة
24
- result = model.transcribe(wav_path)
 
 
 
 
 
25
  transcription = result["text"]
26
 
27
- return transcription
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  except Exception as e:
29
- return f"حدث خطأ أثناء المعالجة: {str(e)}"
30
 
31
  # إنشاء واجهة Gradio
32
  iface = gr.Interface(
33
  fn=process_audio,
34
- inputs=[gr.Audio(type="filepath", label="قم بتحميل ملف صوتي (MP3 أو WAV)")],
35
- outputs=[gr.Textbox(label="النص المستخرج")],
36
- title="محول الصوت إلى نص",
37
- description="قم بتحميل ملف صوتي لاستخراج النص من الصوت. يدعم اللغتين العربية والإنجليزية.",
 
 
 
 
 
38
  examples=[],
39
  cache_examples=False
40
  )
41
 
42
  if __name__ == "__main__":
43
- iface.launch()
 
1
  import gradio as gr
2
+ from transformers import pipeline
3
+ import torch
4
+ import librosa
5
+ import numpy as np
6
+ from moviepy.editor import VideoFileClip, AudioFileClip, TextClip, CompositeVideoClip, ColorClip
7
+ import tempfile
8
+ import os
9
  from pydub import AudioSegment
10
+ import arabic_reshaper
11
+ from bidi.algorithm import get_display
12
 
13
+ # تهيئة نموذج التعرف على الكلام متعدد اللغات
14
+ transcriber = pipeline("automatic-speech-recognition",
15
+ model="facebook/wav2vec2-large-xlsr-53-arabic")
16
 
17
  def convert_audio_to_wav(audio_path):
18
  """تحويل الملف الصوتي إلى صيغة WAV إذا لم يكن كذلك"""
19
+ if audio_path.endswith('.mp3'):
20
+ audio = AudioSegment.from_mp3(audio_path)
21
+ wav_path = audio_path.rsplit('.', 1)[0] + '.wav'
22
+ audio.export(wav_path, format='wav')
23
+ return wav_path
24
+ return audio_path
 
25
 
26
+ def format_arabic_text(text):
27
+ """معالجة النص العربي للعرض الصحيح"""
28
+ reshaped_text = arabic_reshaper.reshape(text)
29
+ bidi_text = get_display(reshaped_text)
30
+ return bidi_text
31
+
32
+ def create_text_video(audio_path):
33
  try:
34
+ # تحويل الملف الصوتي إلى WAV إذا كان بصيغة MP3
35
+ wav_path = convert_audio_to_wav(audio_path)
36
+
37
+ # قراءة الملف الصوتي
38
+ audio, sr = librosa.load(wav_path, sr=16000)
39
+
40
+ # استخراج النص من الصوت
41
+ result = transcriber({"sampling_rate": sr, "raw": audio})
42
  transcription = result["text"]
43
 
44
+ # معالجة النص العربي
45
+ formatted_text = format_arabic_text(transcription)
46
+
47
+ # إنشاء مقطع الصوت
48
+ audio_clip = AudioFileClip(wav_path)
49
+ duration = audio_clip.duration
50
+
51
+ # إنشاء مقطع النص
52
+ txt_clip = TextClip(
53
+ formatted_text,
54
+ fontsize=30,
55
+ color='white',
56
+ bg_color='black',
57
+ size=(720, 480),
58
+ method='caption',
59
+ font='Arial' # يمكن استخدام خط يدعم العربية
60
+ ).set_duration(duration)
61
+
62
+ # إنشاء خلفية سوداء
63
+ background = ColorClip(size=(720, 480), color=(0, 0, 0)).set_duration(duration)
64
+
65
+ # دمج المقاطع
66
+ video = CompositeVideoClip([background, txt_clip.set_position('center')])
67
+ video = video.set_audio(audio_clip)
68
+
69
+ # إنشاء ملف مؤقت للفيديو
70
+ temp_output = tempfile.NamedTemporaryFile(delete=False, suffix='.mp4')
71
+ video_path = temp_output.name
72
+
73
+ # كتابة ملف الفيديو
74
+ video.write_videofile(video_path, fps=24, codec='libx264',
75
+ audio_codec='aac')
76
+
77
+ # تنظيف الملفات المؤقتة
78
+ if wav_path != audio_path:
79
+ os.remove(wav_path)
80
+
81
+ return video_path, transcription
82
+
83
+ except Exception as e:
84
+ raise gr.Error(f"حدث خطأ أثناء المعالجة: {str(e)}")
85
+
86
+ def process_audio(audio_file):
87
+ """معالجة الملف الصوتي في واجهة Gradio"""
88
+ if audio_file is None:
89
+ raise gr.Error("الرجاء تحميل ملف صوتي")
90
+
91
+ try:
92
+ video_path, transcription = create_text_video(audio_file)
93
+ return video_path, transcription
94
  except Exception as e:
95
+ raise gr.Error(f"حدث خطأ أثناء المعالجة: {str(e)}")
96
 
97
  # إنشاء واجهة Gradio
98
  iface = gr.Interface(
99
  fn=process_audio,
100
+ inputs=[
101
+ gr.Audio(type="filepath", label="قم بتحميل ملف صوتي (MP3 أو WAV)")
102
+ ],
103
+ outputs=[
104
+ gr.Video(label="الفيديو المُنشأ"),
105
+ gr.Textbox(label="النص المستخرج")
106
+ ],
107
+ title="محول الصوت إلى فيديو مع النص",
108
+ description="قم بتحميل ملف صوتي لإنشاء فيديو مع النص المستخرج متزامناً",
109
  examples=[],
110
  cache_examples=False
111
  )
112
 
113
  if __name__ == "__main__":
114
+ iface.launch()