C
File size: 3,997 Bytes
da027a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import gradio as gr
from transformers import VitsModel, AutoTokenizer
import torch
import scipy.io.wavfile

# تحميل النموذج و "tokenizer"
model_name = "wasmdashai/vits-ar-sa-huba-v2"
try:
    model = VitsModel.from_pretrained(model_name)
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model_loaded_successfully = True
    print(f"تم تحميل النموذج '{model_name}' بنجاح.")
except Exception as e:
    model_loaded_successfully = False
    error_message = f"حدث خطأ أثناء تحميل النموذج '{model_name}': {e}"
    print(error_message)
    # يمكنك اختيار إيقاف التطبيق هنا أو عرض رسالة خطأ في الواجهة

# دالة التنبؤ (تحويل النص إلى كلام)
def text_to_speech(text):
    if not model_loaded_successfully:
        return None, f"خطأ: لم يتم تحميل النموذج. {error_message}"
    if not text:
        return None, "الرجاء إدخال نص."
    try:
        inputs = tokenizer(text, return_tensors="pt")
        with torch.no_grad():
            output = model(**inputs).waveform

        # التأكد من أن المخرجات هي 1D tensor
        if output.ndim > 1:
            # إذا كانت متعددة الأبعاد، جرب أخذ القناة الأولى أو المتوسط
            # هنا نفترض أن القناة الأولى هي الصوت المطلوب
            waveform = output[0].cpu().numpy()
        else:
            waveform = output.cpu().numpy()

        # معدل أخذ العينات للنموذج (عادة ما يكون مذكورًا في بطاقة النموذج أو تكوينه)
        # إذا لم يكن متاحًا بشكل مباشر، قد تحتاج إلى التحقق من config النموذج
        # القيمة الشائعة لنماذج VITS هي 22050 أو 16000
        # بالنظر إلى بطاقة النموذج، يبدو أنها لا تحدد صراحةً، سنجرب 22050
        sampling_rate = model.config.sampling_rate if hasattr(model.config, 'sampling_rate') else 22050

        # حفظ الملف الصوتي مؤقتًا
        output_path = "output_audio.wav"
        scipy.io.wavfile.write(output_path, rate=sampling_rate, data=waveform)
        return output_path, None  # لا يوجد رسالة خطأ
    except Exception as e:
        print(f"حدث خطأ أثناء تحويل النص إلى كلام: {e}")
        return None, f"حدث خطأ أثناء المعالجة: {str(e)}"

# إنشاء واجهة Gradio
iface = gr.Interface(
    fn=text_to_speech,
    inputs=gr.Textbox(lines=3, placeholder="أدخل النص العربي هنا...", label="النص العربي"),
    outputs=[
        gr.Audio(label="الصوت الناتج", type="filepath"),
        gr.Textbox(label="رسالة الخطأ (إن وجدت)") # لإظهار رسائل الخطأ بشكل واضح
    ],
    title="تحويل النص إلى كلام باللغة العربية (نموذج vits-ar-sa-huda-v2)",
    description="أدخل نصًا باللغة العربية ليتم تحويله إلى كلام باستخدام نموذج VITS المدرب على اللهجة السعودية . النموذج من تطوير `wasmdashai`.",
    allow_flagging="never",
    examples=[
        ["السلام عليكم ورحمة الله وبركاته."],
        ["كيف حالك اليوم؟"],
        ["أهلاً وسهلاً بكم في هذه المساحة."],
    ]
)

# تشغيل الواجهة
if __name__ == "__main__":
    if model_loaded_successfully:
        iface.launch()
    else:
        # إذا لم يتم تحميل النموذج، قم بتشغيل واجهة بسيطة تعرض الخطأ
        def error_interface():
            with gr.Blocks() as demo:
                gr.Markdown(f"# خطأ في تحميل النموذج\n{error_message}")
            return demo
        error_interface().launch()