Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -7,28 +7,34 @@ import os
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 27 |
-
|
| 28 |
asr_pipeline = None
|
| 29 |
|
| 30 |
|
| 31 |
-
# 3. دالة النسخ الصوتي
|
| 32 |
def transcribe_audio(audio_path):
|
| 33 |
"""تحول ملف الصوت إلى نص باستخدام نموذج Whisper ASR، مع تقسيم للملفات الطويلة."""
|
| 34 |
if asr_pipeline is None:
|
|
@@ -40,18 +46,14 @@ def transcribe_audio(audio_path):
|
|
| 40 |
print(f"Processing audio file: {audio_path}")
|
| 41 |
|
| 42 |
try:
|
| 43 |
-
#
|
| 44 |
-
#
|
| 45 |
result = asr_pipeline(
|
| 46 |
audio_path,
|
| 47 |
-
|
| 48 |
-
stride=(5, 5), # تداخل 5 ثواني بين المقاطع
|
| 49 |
-
return_timestamps=True # هذا ضروري لتشغيل وضع التقسيم
|
| 50 |
)
|
| 51 |
|
| 52 |
-
#
|
| 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()
|
|
@@ -63,7 +65,6 @@ def transcribe_audio(audio_path):
|
|
| 63 |
return final_text
|
| 64 |
|
| 65 |
except Exception as e:
|
| 66 |
-
# قد يحدث هذا الخطأ إذا كان الملف غير صالح أو واجه النموذج مشكلة في الذاكرة
|
| 67 |
return f"حدث خطأ أثناء معالجة الصوت: {e}"
|
| 68 |
|
| 69 |
|
|
|
|
| 7 |
MODEL_ID = "MohamedRashad/Arabic-Whisper-CodeSwitching-Edition"
|
| 8 |
|
| 9 |
# تحديد الجهاز المستخدم (GPU أو CPU)
|
|
|
|
| 10 |
device = 0 if torch.cuda.is_available() else "cpu"
|
| 11 |
print(f"Device set to use: {device}")
|
| 12 |
|
| 13 |
+
# 2. تحميل النموذج عبر الـ Pipeline (مع تحديد وسائط التقسيم عند التحميل)
|
| 14 |
try:
|
| 15 |
+
print("Loading ASR pipeline (Whisper) with chunking parameters...")
|
| 16 |
+
|
| 17 |
+
# تحديد وسائط التقسيم هنا لتجنب تمريرها كـ model_kwargs غير مستخدمة
|
| 18 |
+
pipeline_kwargs = {
|
| 19 |
+
"chunk_length_s": 30, # طول المقطع الأقصى (30 ثانية)
|
| 20 |
+
"stride": (5, 5), # تداخل 5 ثواني بين المقاطع
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
asr_pipeline = pipeline(
|
| 24 |
"automatic-speech-recognition",
|
| 25 |
model=MODEL_ID,
|
| 26 |
device=device,
|
| 27 |
+
**pipeline_kwargs # تمرير وسائط التقسيم هنا
|
| 28 |
)
|
| 29 |
+
print("Pipeline loaded successfully with chunking enabled.")
|
| 30 |
|
| 31 |
except Exception as e:
|
| 32 |
+
print(f"Error loading pipeline: {e}.")
|
| 33 |
+
# إذا فشل التحميل، نستخدم pipeline فارغ لمنع تعطل التطبيق
|
| 34 |
asr_pipeline = None
|
| 35 |
|
| 36 |
|
| 37 |
+
# 3. دالة النسخ الصوتي
|
| 38 |
def transcribe_audio(audio_path):
|
| 39 |
"""تحول ملف الصوت إلى نص باستخدام نموذج Whisper ASR، مع تقسيم للملفات الطويلة."""
|
| 40 |
if asr_pipeline is None:
|
|
|
|
| 46 |
print(f"Processing audio file: {audio_path}")
|
| 47 |
|
| 48 |
try:
|
| 49 |
+
# 💡 التعديل هنا: نزيل 'chunk_length_s' و 'stride' ونبقي فقط 'return_timestamps'
|
| 50 |
+
# وسائط التقسيم تم تحديدها بالفعل في خطوة التحميل (Initialisation)
|
| 51 |
result = asr_pipeline(
|
| 52 |
audio_path,
|
| 53 |
+
return_timestamps=True # ضروري لعملية التقسيم
|
|
|
|
|
|
|
| 54 |
)
|
| 55 |
|
| 56 |
+
# استخراج النص من النتيجة (النتيجة تحتوي على 'chunks' عند استخدام return_timestamps=True)
|
|
|
|
|
|
|
| 57 |
if 'chunks' in result and isinstance(result['chunks'], list):
|
| 58 |
segments_text = [seg['text'] for seg in result['chunks']]
|
| 59 |
final_text = " ".join(segments_text).strip()
|
|
|
|
| 65 |
return final_text
|
| 66 |
|
| 67 |
except Exception as e:
|
|
|
|
| 68 |
return f"حدث خطأ أثناء معالجة الصوت: {e}"
|
| 69 |
|
| 70 |
|