aboudcode's picture
Update app.py
660e004 verified
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()