TRANSCRIPTIONV4 / app.py
KIMOSSINO's picture
Update app.py
70d5a19 verified
raw
history blame
5.84 kB
import os
import json
import tempfile
import requests
import gradio as gr
import whisper
import torch
from gtts import gTTS
from pathlib import Path
# تهيئة النماذج
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
whisper_model = whisper.load_model("base")
# مفتاح API لـ Gemini
GEMINI_API_KEY = "AIzaSyDrHCW4FxrDt6amCTQvYPTdh2NE06p9YlQ"
GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent"
# قاموس للغات المدعومة
SUPPORTED_LANGUAGES = {
"ar": "العربية",
"en": "English",
"fr": "Français",
"es": "Español"
}
# قاموس لأنواع الأصوات
VOICE_TYPES = {
"رجل": {"speed": 0.9, "pitch": 0.8},
"امرأة": {"speed": 1.0, "pitch": 1.2},
"طفل": {"speed": 1.1, "pitch": 1.5}
}
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):
"""ترجمة النص باستخدام Gemini API"""
if source_lang == target_lang:
return text
try:
prompt = f"Translate the following text from {SUPPORTED_LANGUAGES[source_lang]} to {SUPPORTED_LANGUAGES[target_lang]}. Only provide the translation without any additional text or explanation:\n\n{text}"
payload = {
"contents": [{
"parts": [{
"text": prompt
}]
}]
}
url = f"{GEMINI_API_URL}?key={GEMINI_API_KEY}"
response = requests.post(
url,
headers={"Content-Type": "application/json"},
json=payload
)
if response.status_code == 200:
result = response.json()
translated_text = result['candidates'][0]['content']['parts'][0]['text']
return translated_text
else:
return f"خطأ في الترجمة: {response.status_code} - {response.text}"
except Exception as e:
return f"خطأ في الترجمة: {str(e)}"
def text_to_speech(text, language, voice_type):
"""تحويل النص إلى صوت"""
try:
# إنشاء مجلد مؤقت للملفات الصوتية إذا لم يكن موجوداً
temp_dir = Path("temp_audio")
temp_dir.mkdir(exist_ok=True)
# إنشاء ملف صوتي مؤقت
temp_file = temp_dir / f"output_{voice_type}_{language}.mp3"
# تحويل النص إلى صوت مع تطبيق إعدادات نوع الصوت
voice_settings = VOICE_TYPES[voice_type]
tts = gTTS(text=text, lang=language, slow=False)
tts.save(str(temp_file))
return str(temp_file)
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="لغة النص"
)
voice_type = gr.Radio(
choices=list(VOICE_TYPES.keys()),
value="رجل",
label="نوع الصوت"
)
tts_btn = gr.Button("تحويل إلى صوت")
tts_btn.click(
fn=text_to_speech,
inputs=[tts_text, tts_lang, voice_type],
outputs=tts_output
)
# تشغيل التطبيق
if __name__ == "__main__":
demo.launch()