MusicGen / app.py
thomson99's picture
Upload 3 files
9ebc77b verified
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()