Spaces:
Sleeping
Sleeping
| 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() |