File size: 6,247 Bytes
f79c89e
d5f394e
 
f79c89e
 
 
d5f394e
f79c89e
 
 
d5f394e
f79c89e
d5f394e
f79c89e
 
 
 
d5f394e
 
f79c89e
 
 
 
 
 
 
 
d5f394e
 
f79c89e
 
d5f394e
f79c89e
 
d5f394e
f79c89e
d5f394e
f79c89e
 
d5f394e
 
618c56b
f79c89e
d5f394e
f79c89e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
618c56b
f79c89e
d5f394e
 
 
f79c89e
 
d5f394e
f79c89e
 
618c56b
f79c89e
 
 
618c56b
f79c89e
 
618c56b
f79c89e
d5f394e
f79c89e
d5f394e
f79c89e
 
 
 
 
618c56b
f79c89e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
618c56b
f79c89e
 
618c56b
 
f79c89e
 
 
 
 
 
 
 
 
 
 
 
 
618c56b
f79c89e
 
 
 
 
618c56b
f79c89e
 
 
 
 
 
 
 
 
 
 
 
 
 
618c56b
f79c89e
 
618c56b
d5f394e
f79c89e
 
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import os
import gradio as gr
import whisper
from transformers import MarianMTModel, MarianTokenizer
import torch
from TTS.api import TTS

# تهيئة النماذج
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
whisper_model = whisper.load_model("base")

# قاموس للغات المدعومة
SUPPORTED_LANGUAGES = {
    "ar": "العربية",
    "en": "English",
    "fr": "Français",
    "es": "Español"
}

# قاموس لنماذج الترجمة
TRANSLATION_MODELS = {
    "ar-en": "Helsinki-NLP/opus-mt-ar-en",
    "en-ar": "Helsinki-NLP/opus-mt-en-ar",
    "fr-en": "Helsinki-NLP/opus-mt-fr-en",
    "en-fr": "Helsinki-NLP/opus-mt-en-fr",
    "es-en": "Helsinki-NLP/opus-mt-es-en",
    "en-es": "Helsinki-NLP/opus-mt-en-es"
}

def transcribe_audio(audio_file, source_lang):
    """تحويل الصوت إلى نص باستخدام Whisper"""
    try:
        result = whisper_model.transcribe(audio_file, language=source_lang)
        return result["text"]
    except Exception as e:
        return f"خطأ في التحويل: {str(e)}"

def translate_text(text, source_lang, target_lang):
    """ترجمة النص بين اللغات"""
    if source_lang == target_lang:
        return text
    
    model_key = f"{source_lang}-en" if source_lang != "en" else f"en-{target_lang}"
    try:
        model_name = TRANSLATION_MODELS[model_key]
        model = MarianMTModel.from_pretrained(model_name)
        tokenizer = MarianTokenizer.from_pretrained(model_name)
        
        inputs = tokenizer(text, return_tensors="pt", padding=True)
        translated = model.generate(**inputs)
        result = tokenizer.decode(translated[0], skip_special_tokens=True)
        
        # إذا كانت اللغة المصدر ليست الإنجليزية والهدف ليس الإنجليزية
        if source_lang != "en" and target_lang != "en":
            # ترجمة إضافية من الإنجليزية إلى اللغة الهدف
            model_name = TRANSLATION_MODELS[f"en-{target_lang}"]
            model = MarianMTModel.from_pretrained(model_name)
            tokenizer = MarianTokenizer.from_pretrained(model_name)
            
            inputs = tokenizer(result, return_tensors="pt", padding=True)
            translated = model.generate(**inputs)
            result = tokenizer.decode(translated[0], skip_special_tokens=True)
        
        return result
    except Exception as e:
        return f"خطأ في الترجمة: {str(e)}"

def text_to_speech(text, target_lang, gender, style):
    """تحويل النص إلى صوت"""
    try:
        # اختيار النموذج المناسب بناءً على اللغة والجنس
        tts = TTS(model_name="tts_models/multilingual/multi-dataset/your_tts", progress_bar=False)
        
        # تعيين معرف المتحدث والنمط
        speaker_id = "female" if gender == "أنثى" else "male"
        speed = 1.0 if style == "عادي" else 1.3 if style == "سريع" else 0.8
        
        output_path = "output.wav"
        tts.tts_to_file(text=text, speaker=speaker_id, speed=speed, file_path=output_path)
        
        return output_path
    except Exception as e:
        return f"خطأ في تحويل النص إلى صوت: {str(e)}"

# إنشاء واجهة Gradio
with gr.Blocks(title="معالج الصوت والترجمة", theme=gr.themes.Soft()) as demo:
    gr.Markdown("# معالج الصوت والترجمة متعدد اللغات")
    
    with gr.Tab("تحويل الصوت إلى نص"):
        with gr.Row():
            audio_input = gr.Audio(type="filepath", label="الملف الصوتي")
            source_lang = gr.Dropdown(choices=list(SUPPORTED_LANGUAGES.keys()), 
                                    value="ar", 
                                    label="لغة الملف الصوتي")
        
        transcribe_btn = gr.Button("تحويل إلى نص")
        transcribed_text = gr.Textbox(label="النص المستخرج", lines=5)
        
        transcribe_btn.click(
            fn=transcribe_audio,
            inputs=[audio_input, source_lang],
            outputs=transcribed_text
        )
    
    with gr.Tab("ترجمة النص"):
        with gr.Row():
            input_text = gr.Textbox(label="النص المراد ترجمته", lines=5)
            translated_text = gr.Textbox(label="النص المترجم", lines=5)
        
        with gr.Row():
            trans_source_lang = gr.Dropdown(choices=list(SUPPORTED_LANGUAGES.keys()),
                                          value="ar",
                                          label="اللغة المصدر")
            trans_target_lang = gr.Dropdown(choices=list(SUPPORTED_LANGUAGES.keys()),
                                          value="en",
                                          label="اللغة الهدف")
        
        translate_btn = gr.Button("ترجمة")
        
        translate_btn.click(
            fn=translate_text,
            inputs=[input_text, trans_source_lang, trans_target_lang],
            outputs=translated_text
        )
    
    with gr.Tab("تحويل النص إلى صوت"):
        with gr.Row():
            tts_text = gr.Textbox(label="النص المراد تحويله إلى صوت", lines=5)
            tts_output = gr.Audio(label="الصوت الناتج")
        
        with gr.Row():
            tts_lang = gr.Dropdown(choices=list(SUPPORTED_LANGUAGES.keys()),
                                 value="ar",
                                 label="لغة النص")
            tts_gender = gr.Radio(choices=["ذكر", "أنثى"],
                                value="ذكر",
                                label="جنس المتحدث")
            tts_style = gr.Radio(choices=["سريع", "عادي", "تعليق صوتي"],
                               value="عادي",
                               label="نمط الإلقاء")
        
        tts_btn = gr.Button("تحويل إلى صوت")
        
        tts_btn.click(
            fn=text_to_speech,
            inputs=[tts_text, tts_lang, tts_gender, tts_style],
            outputs=tts_output
        )

# تشغيل التطبيق
demo.launch()