GannaEslam38 commited on
Commit
e629d9f
·
verified ·
1 Parent(s): 3d3b19d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -22
app.py CHANGED
@@ -1,55 +1,72 @@
1
  import torch
2
  from transformers import pipeline
3
  import gradio as gr
 
4
 
5
  # 1. تحديد المعرف الخاص بالنموذج
6
  MODEL_ID = "MohamedRashad/Arabic-Whisper-CodeSwitching-Edition"
7
 
8
- # تحديد الجهاز المستخدم
 
9
  device = 0 if torch.cuda.is_available() else "cpu"
 
10
 
11
  # 2. تحميل النموذج عبر الـ Pipeline
12
- # استخدام "automatic-speech-recognition" pipeline
13
  try:
14
  print("Loading ASR pipeline (Whisper)...")
 
15
  asr_pipeline = pipeline(
16
  "automatic-speech-recognition",
17
  model=MODEL_ID,
18
  device=device,
19
- # يمكن استخدام torch_dtype=torch.float16 لو كان الجهاز يدعم GPU، ولكني سأبقيها بسيطة
20
  )
21
  print("Pipeline loaded successfully.")
22
 
23
  except Exception as e:
24
- # التحميل بطريقة يدوية بديلة إذا فشل الـ pipeline
25
- print(f"Error loading pipeline: {e}. Attempting manual load...")
26
- from transformers import WhisperForConditionalGeneration, WhisperProcessor
27
- processor = WhisperProcessor.from_pretrained(MODEL_ID)
28
- model = WhisperForConditionalGeneration.from_pretrained(MODEL_ID).to(device).eval()
29
- asr_pipeline = lambda audio_path: {
30
- "text": processor.batch_decode(
31
- model.generate(processor(audio_path, return_tensors="pt").input_features.to(device)),
32
- skip_special_tokens=True
33
- )[0]
34
- }
35
 
36
 
37
- # 3. دالة النسخ الصوتي
38
  def transcribe_audio(audio_path):
39
- """تحول ملف الصوت إلى نص باستخدام نموذج Whisper ASR."""
 
 
 
40
  if audio_path is None:
41
  return "يرجى تحميل ملف صوتي أولاً."
42
 
43
- # لا نحتاج إلى منطق التقسيم المعقد، ولكن نموذج Whisper يمكن أن يستفيد من تلميح اللغة
44
- # يتم تمرير ملف الصوت مباشرة إلى الـ pipeline
45
-
46
- # يتم التعامل مع التسجيلات الطويلة تلقائيًا بواسطة pipeline
47
  try:
48
- result = asr_pipeline(audio_path)
49
- return result["text"].strip()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  except Exception as e:
 
51
  return f"حدث خطأ أثناء معالجة الصوت: {e}"
52
 
 
53
  # 4. إعداد واجهة Gradio
54
  title = "👳 Arabic-Whisper-CodeSwitching-Edition"
55
  description = (
 
1
  import torch
2
  from transformers import pipeline
3
  import gradio as gr
4
+ import os
5
 
6
  # 1. تحديد المعرف الخاص بالنموذج
7
  MODEL_ID = "MohamedRashad/Arabic-Whisper-CodeSwitching-Edition"
8
 
9
+ # تحديد الجهاز المستخدم (GPU أو CPU)
10
+ # يفضل استخدام 0 للجهاز الأول (GPU) إذا كان متاحاً، وإلا نستخدم "cpu"
11
  device = 0 if torch.cuda.is_available() else "cpu"
12
+ print(f"Device set to use: {device}")
13
 
14
  # 2. تحميل النموذج عبر الـ Pipeline
 
15
  try:
16
  print("Loading ASR pipeline (Whisper)...")
17
+ # تحميل النموذج باستخدام pipeline
18
  asr_pipeline = pipeline(
19
  "automatic-speech-recognition",
20
  model=MODEL_ID,
21
  device=device,
 
22
  )
23
  print("Pipeline loaded successfully.")
24
 
25
  except Exception as e:
26
+ # هذا الجزء يمكن حذفه إذا كنت واثقاً من تحميل الـ pipeline
27
+ print(f"Error loading pipeline: {e}. Falling back to error message.")
28
+ asr_pipeline = None
 
 
 
 
 
 
 
 
29
 
30
 
31
+ # 3. دالة النسخ الصوتي (مع معالجة التقسيم للملفات الطويلة)
32
  def transcribe_audio(audio_path):
33
+ """تحول ملف الصوت إلى نص باستخدام نموذج Whisper ASR، مع تقسيم للملفات الطويلة."""
34
+ if asr_pipeline is None:
35
+ return "خطأ: لم يتم تحميل النموذج بنجاح عند بدء التشغيل."
36
+
37
  if audio_path is None:
38
  return "يرجى تحميل ملف صوتي أولاً."
39
 
40
+ print(f"Processing audio file: {audio_path}")
41
+
 
 
42
  try:
43
+ # استخدام التقسيم (Chunking) لمعالجة الملفات الطويلة (أفضل دقة واستقرار)
44
+ # تقسيم الصوت إلى مقاطع 30 ثانية، مع تداخل 5 ثواني لضمان عدم فقدان السياق
45
+ result = asr_pipeline(
46
+ audio_path,
47
+ chunk_length_s=30, # طول المقطع الأقصى (30 ثانية)
48
+ stride=(5, 5), # تداخل 5 ثواني بين المقاطع
49
+ return_timestamps=True # هذا ضروري لتشغيل وضع التقسيم
50
+ )
51
+
52
+ # النتيجة تحتوي على قاموس يضم key اسمه 'chunks' أو 'text'
53
+ # نجمع النصوص من جميع المقاطع لإنتاج النص النهائي
54
+
55
+ if 'chunks' in result and isinstance(result['chunks'], list):
56
+ segments_text = [seg['text'] for seg in result['chunks']]
57
+ final_text = " ".join(segments_text).strip()
58
+ elif 'text' in result:
59
+ final_text = result['text'].strip()
60
+ else:
61
+ final_text = "حدث خطأ في استخراج النص من نتيجة النموذج."
62
+
63
+ return final_text
64
+
65
  except Exception as e:
66
+ # قد يحدث هذا الخطأ إذا كان الملف غير صالح أو واجه النموذج مشكلة في الذاكرة
67
  return f"حدث خطأ أثناء معالجة الصوت: {e}"
68
 
69
+
70
  # 4. إعداد واجهة Gradio
71
  title = "👳 Arabic-Whisper-CodeSwitching-Edition"
72
  description = (