TRANSCRIPTIONV4 / app.py
KIMOSSINO's picture
Update app.py
f79c89e verified
raw
history blame
6.25 kB
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()