import gradio as gr import numpy as np import librosa import soundfile as sf import noisereduce as nr from pydub import AudioSegment from pydub.effects import normalize, compress_dynamic_range import os def apply_pitch_correction(y, sr, correction_strength=0.5): """تعديل التون (Auto-Tune) بشكل يتناسب مع الغناء العربي""" # استخراج الترددات (F0) pitches, magnitudes = librosa.piptrack(y=y, sr=sr) # تحديد النوتة الغالبة لكل إطار زمني new_y = y.copy() # ملاحظة: التصحيح الكامل للربع تون برمجياً معقد، لذا سنعتمد على # تصحيح النوتات الأساسية مع ترك هامش للإحساس العربي if correction_strength > 0: # تقنية Pitch Shifting خفيفة لتنعيم الأداء steps = correction_strength * 0.5 new_y = librosa.effects.pitch_shift(y, sr=sr, n_steps=steps) return new_y def process_audio_pro_arabic(vocal_file, music_file, tune_strength, vocal_boost, noise_level): try: if vocal_file is None or music_file is None: return None, "⚠️ يرجى رفع الملفات أولاً." # 1️⃣ تحميل الصوت وتحويله لمعالجة الذكاء الاصطناعي y, sr = librosa.load(vocal_file.name, sr=None) # 2️⃣ تنظيف الضوضاء (AI Noise Reduction) y_clean = nr.reduce_noise(y=y, sr=sr, prop_decrease=noise_level) # 3️⃣ تصحيح التون (Professional Auto-Tune) # تم ضبطه ليكون سلسلاً حتى لا يفسد "المقامات" العربية y_tuned = apply_pitch_correction(y_clean, sr, tune_strength) # حفظ الملف المؤقت للمعالجة النهائية temp_vocal = "temp_vocal_processed.wav" sf.write(temp_vocal, y_tuned, sr) # 4️⃣ المعالجة بـ Pydub (Vocal Chain) vocal_seg = AudioSegment.from_file(temp_vocal) # De-Esser & EQ: تنظيف الحروف الحادة وإضافة دفء (Warmth) vocal_seg = vocal_seg.high_pass_filter(120) # تنظيف القاعدة vocal_seg = vocal_seg.low_pass_filter(15000) # تنظيف الحدة الزائدة # ضغط احترافي مزدوج لإبراز تفاصيل الصوت العربي vocal_seg = compress_dynamic_range(vocal_seg, threshold=-16.0, ratio=4.0) vocal_seg = vocal_seg + vocal_boost # تعزيز الحضور # 5️⃣ معالجة الموسيقى والمكساج music = AudioSegment.from_file(music_file.name) if len(music) < len(vocal_seg): music = music * ((len(vocal_seg) // len(music)) + 1) music = music[:len(vocal_seg) + 2000] - 15 # خفض الموسيقى للخلفية # دمج الصوت (Center) مع الموسيقى final_mix = music.overlay(vocal_seg, position=0) # 6️⃣ الماسترينغ النهائي (Final Polish) final_mix = normalize(final_mix, headroom=0.1) final_mix = final_mix.fade_out(3000) output_path = "Arabic_Pro_Studio_Master.mp3" final_mix.export(output_path, format="mp3", bitrate="320k") return output_path, "✅ تم إنتاج الأغنية بجودة الاستوديو العالمية!" except Exception as e: return None, f"❌ حدث خطأ: {str(e)}" # --- واجهة المستخدم (Gradio UI) --- with gr.Blocks(theme=gr.themes.Soft(), title="Arabic AI Studio") as demo: gr.Markdown(""" # 🎤 استوديو الأغاني العربية المطور (AI) **معالج احترافي مصمم خصيصاً للأصوات العربية: تصحيح تون، عزل ضوضاء، وماسترينغ استوديو.** """) with gr.Row(): with gr.Column(): vocal_input = gr.File(label="🎤 سجل صوتك (بدون موسيقى)") music_input = gr.File(label="🎵 الموسيقى (اللحن)") with gr.Column(): gr.Markdown("### 🎚️ لوحة التحكم للمنتج (Producer Panel)") tune_slider = gr.Slider(0, 1, value=0.3, label="قوة الأوتوتيون (نوصي بـ 0.3 للأغاني العربية)") vocal_slider = gr.Slider(0, 15, value=5, label="قوة بروز الصوت البشري (dB)") noise_slider = gr.Slider(0.5, 1.0, value=0.85, label="مستوى تنقية الصوت من الضوضاء") btn = gr.Button("🎨 إخراج الأغنية بأعلى جودة", variant="primary") with gr.Row(): out_audio = gr.Audio(label="🎧 النتيجة النهائية", type="filepath") out_msg = gr.Textbox(label="حالة المعالجة") btn.click( process_audio_pro_arabic, inputs=[vocal_input, music_input, tune_slider, vocal_slider, noise_slider], outputs=[out_audio, out_msg] ) demo.launch()