Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,43 +1,114 @@
|
|
1 |
import gradio as gr
|
2 |
-
import
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
from pydub import AudioSegment
|
4 |
-
|
|
|
5 |
|
6 |
-
#
|
7 |
-
|
|
|
8 |
|
9 |
def convert_audio_to_wav(audio_path):
|
10 |
"""تحويل الملف الصوتي إلى صيغة WAV إذا لم يكن كذلك"""
|
11 |
-
audio_path
|
12 |
-
|
13 |
-
wav_path = audio_path.
|
14 |
-
audio =
|
15 |
-
|
16 |
-
|
17 |
-
return str(audio_path)
|
18 |
|
19 |
-
def
|
20 |
-
"""معالجة
|
|
|
|
|
|
|
|
|
|
|
21 |
try:
|
22 |
-
# تحويل الملف الصوتي إلى
|
23 |
-
wav_path = convert_audio_to_wav(
|
24 |
-
|
|
|
|
|
|
|
|
|
|
|
25 |
transcription = result["text"]
|
26 |
|
27 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
except Exception as e:
|
29 |
-
|
30 |
|
31 |
# إنشاء واجهة Gradio
|
32 |
iface = gr.Interface(
|
33 |
fn=process_audio,
|
34 |
-
inputs=[
|
35 |
-
|
36 |
-
|
37 |
-
|
|
|
|
|
|
|
|
|
|
|
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()
|