Spaces:
Sleeping
Sleeping
File size: 5,073 Bytes
149499a 660e004 149499a 660e004 adf9331 660e004 adf9331 660e004 adf9331 660e004 adf9331 660e004 adf9331 660e004 adf9331 660e004 adf9331 660e004 adf9331 660e004 adf9331 149499a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | 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() |