|
import gradio as gr |
|
import torch |
|
from audiocraft.models import MusicGen |
|
from audiocraft.data.audio import audio_write |
|
import numpy as np |
|
import tempfile |
|
import os |
|
|
|
|
|
device = "cuda" if torch.cuda.is_available() else "cpu" |
|
model = MusicGen.get_pretrained('facebook/musicgen-small', device=device) |
|
model.set_generation_params(duration=8) |
|
|
|
|
|
MUSIC_STYLES = { |
|
"موسيقى كلاسيكية": "classical orchestra music, peaceful and harmonious", |
|
"موسيقى عربية": "traditional arabic music with oud and percussion", |
|
"بوب": "upbeat pop music with catchy melody", |
|
"روك": "electric guitar rock music with drums", |
|
"جاز": "smooth jazz with saxophone and piano", |
|
"إلكترونية": "electronic dance music with synthesizer", |
|
"هادئة": "calm ambient music with soft melodies", |
|
"حماسية": "energetic music with strong beats", |
|
"حزينة": "emotional sad music with piano", |
|
"سعيدة": "happy cheerful music with positive vibes" |
|
} |
|
|
|
|
|
INSTRUMENTS = { |
|
"بيانو": "piano", |
|
"جيتار": "guitar", |
|
"عود": "oud", |
|
"كمان": "violin", |
|
"طبول": "drums", |
|
"ساكسفون": "saxophone", |
|
"ناي": "flute", |
|
"سينثيسايزر": "synthesizer" |
|
} |
|
|
|
def generate_music(style, mood, instruments, melody_complexity=0.7, rhythm_strength=0.7, harmony_richness=0.7): |
|
""" |
|
توليد مقطع موسيقي باستخدام المعلمات المحددة |
|
""" |
|
try: |
|
|
|
style_prompt = MUSIC_STYLES[style] |
|
instruments_prompt = ", ".join([INSTRUMENTS[i] for i in instruments]) |
|
|
|
|
|
prompt = f"{style_prompt} with {instruments_prompt}, " |
|
prompt += f"{'complex' if melody_complexity > 0.7 else 'simple'} melody, " |
|
prompt += f"{'strong' if rhythm_strength > 0.7 else 'soft'} rhythm, " |
|
prompt += f"{'rich' if harmony_richness > 0.7 else 'basic'} harmony" |
|
|
|
|
|
model.set_generation_params( |
|
use_sampling=True, |
|
top_k=250, |
|
top_p=0.0, |
|
temperature=1.0, |
|
cfg_coef=3.0, |
|
duration=8 |
|
) |
|
|
|
output = model.generate([prompt], progress=True) |
|
|
|
|
|
with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_file: |
|
audio_write( |
|
temp_file.name, |
|
output[0].cpu(), |
|
model.sample_rate, |
|
strategy="loudness", |
|
loudness_compressor=True |
|
) |
|
return temp_file.name, prompt |
|
|
|
except Exception as e: |
|
return None, f"حدث خطأ: {str(e)}" |
|
|
|
|
|
with gr.Blocks(title="مولد الموسيقى الذكي 🎵", theme=gr.themes.Soft()) as iface: |
|
gr.Markdown(""" |
|
# 🎵 مولد الموسيقى الذكي |
|
|
|
قم بتوليد مقاطع موسيقية فريدة باستخدام الذكاء الاصطناعي! |
|
|
|
### 📝 التعليمات: |
|
1. اختر نمط الموسيقى |
|
2. حدد المزاج المطلوب |
|
3. اختر الآلات الموسيقية |
|
4. اضبط معلمات التوليد |
|
5. انقر على "توليد" وانتظر النتيجة |
|
""") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
style_dropdown = gr.Dropdown( |
|
choices=list(MUSIC_STYLES.keys()), |
|
value=list(MUSIC_STYLES.keys())[0], |
|
label="نمط الموسيقى" |
|
) |
|
|
|
mood_radio = gr.Radio( |
|
choices=["سعيد", "حزين", "هادئ", "حماسي"], |
|
value="سعيد", |
|
label="المزاج" |
|
) |
|
|
|
instruments_dropdown = gr.Dropdown( |
|
choices=list(INSTRUMENTS.keys()), |
|
value=[list(INSTRUMENTS.keys())[0]], |
|
multiselect=True, |
|
label="الآلات الموسيقية" |
|
) |
|
|
|
with gr.Row(): |
|
melody_slider = gr.Slider( |
|
minimum=0.1, |
|
maximum=1.0, |
|
value=0.7, |
|
step=0.1, |
|
label="تعقيد اللحن" |
|
) |
|
|
|
rhythm_slider = gr.Slider( |
|
minimum=0.1, |
|
maximum=1.0, |
|
value=0.7, |
|
step=0.1, |
|
label="قوة الإيقاع" |
|
) |
|
|
|
harmony_slider = gr.Slider( |
|
minimum=0.1, |
|
maximum=1.0, |
|
value=0.7, |
|
step=0.1, |
|
label="ثراء التناغم" |
|
) |
|
|
|
generate_btn = gr.Button("توليد 🎵", variant="primary") |
|
|
|
with gr.Column(): |
|
audio_output = gr.Audio( |
|
label="الموسيقى المولدة", |
|
type="filepath" |
|
) |
|
|
|
prompt_output = gr.Textbox( |
|
label="النص الوصفي المستخدم", |
|
interactive=False |
|
) |
|
|
|
with gr.Row(): |
|
gr.Markdown(""" |
|
### 💡 نصائح: |
|
- جرب مزج أنماط مختلفة من الموسيقى |
|
- استخدم آلات موسيقية متنوعة |
|
- اضبط المعلمات للحصول على النتيجة المطلوبة |
|
|
|
### ℹ️ معلومات: |
|
- يستخدم هذا التطبيق نموذج MusicGen من Meta |
|
- مدة المقطع الموسيقي 8 ثوانٍ |
|
- جودة الصوت 44.1 كيلوهرتز |
|
""") |
|
|
|
|
|
generate_btn.click( |
|
generate_music, |
|
inputs=[ |
|
style_dropdown, |
|
mood_radio, |
|
instruments_dropdown, |
|
melody_slider, |
|
rhythm_slider, |
|
harmony_slider |
|
], |
|
outputs=[audio_output, prompt_output] |
|
) |
|
|
|
|
|
iface.launch() |
|
|