Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
# ال
|
| 25 |
-
print(f"Error loading pipeline: {e}.
|
| 26 |
-
|
| 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 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
# يتم التعامل مع التسجيلات الطويلة تلقائيًا بواسطة pipeline
|
| 47 |
try:
|
| 48 |
-
|
| 49 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 = (
|