diff --git a/provisioning_script.sh b/provisioning_script.sh index e69de29..264bd43 100644 --- a/provisioning_script.sh +++ b/provisioning_script.sh @@ -0,0 +1,146 @@ +#!/bin/bash +# ============================================================= +# Studio IA - Design Sonore & Composition +# Provisioning Script pour RTX 5060 Ti / CUDA 12.1 +# ============================================================= + +set -eo pipefail +echo "🎙️ Démarrage du provisioning Studio Audio IA..." + +# --- 1. MISE À JOUR SYSTÈME & DÉPENDANCES --- +apt-get update -y && apt-get install -y \ + python3.10 python3.10-venv python3-pip \ + ffmpeg libsndfile1 sox \ + ca-certificates curl gnupg lsb-release \ + git wget nano screen + +# --- 2. INSTALLATION DOCKER (si non présent) --- +if ! command -v docker &> /dev/null; then + echo "📦 Installation de Docker..." + curl -fsSL https://get.docker.com | bash +fi + +# --- 3. LANCEMENT OPEN WEBUI --- +echo "🖥️ Lancement d'Open WebUI sur le port 3000..." +docker pull ghcr.io/open-webui/open-webui:main + +docker run -d \ + --name open-webui \ + --restart always \ + --gpus all \ + -p 3000:8080 \ + -v open-webui:/app/backend/data \ + -e WEBUI_SECRET_KEY="vastai-studio-secret-$(date +%s)" \ + -e DEFAULT_MODELS="" \ + -e ENABLE_SIGNUP=true \ + ghcr.io/open-webui/open-webui:main + +echo "✅ Open WebUI lancé sur le port 3000" + +# --- 4. ENVIRONNEMENT PYTHON POUR AUDIOCRAFT --- +echo "🐍 Création de l'environnement Python AudioCraft..." +python3.10 -m venv /workspace/venv-audiocraft +source /workspace/venv-audiocraft/bin/activate + +pip install --upgrade pip + +# PyTorch compatible CUDA 12.1 +pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 + +# AudioCraft (MusicGen + AudioGen) +pip install git+https://github.com/facebookresearch/audiocraft.git + +# Serveur API Gradio +pip install gradio fastapi uvicorn pydantic scipy soundfile + +echo "✅ AudioCraft installé" + +# --- 5. API AUDIOCRAFT (script serveur) --- +echo "🎵 Création du serveur API AudioCraft..." + +mkdir -p /workspace/audiocraft-api + +cat > /workspace/audiocraft-api/server.py << 'PYEOF' +import gradio as gr +import torch +import scipy.io.wavfile +import numpy as np +import tempfile, os +from audiocraft.models import MusicGen, AudioGen + +# Chargement des modèles (une seule fois) +print("🔄 Chargement de MusicGen...") +music_model = MusicGen.get_pretrained("facebook/musicgen-small") +music_model.set_generation_params(duration=10) + +print("🔄 Chargement d'AudioGen...") +audio_model = AudioGen.get_pretrained("facebook/audiogen-medium") +audio_model.set_generation_params(duration=5) + +def generate_music(prompt: str, duration: int = 10): + """Génère de la musique à partir d'un prompt textuel.""" + music_model.set_generation_params(duration=duration) + wav = music_model.generate([prompt]) + wav_np = wav[0, 0].cpu().numpy() + sr = music_model.sample_rate + with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f: + scipy.io.wavfile.write(f.name, sr, (wav_np * 32767).astype(np.int16)) + return f.name + +def generate_sound(prompt: str, duration: int = 5): + """Génère des bruitages et ambiances sonores.""" + audio_model.set_generation_params(duration=duration) + wav = audio_model.generate([prompt]) + wav_np = wav[0, 0].cpu().numpy() + sr = audio_model.sample_rate + with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f: + scipy.io.wavfile.write(f.name, sr, (wav_np * 32767).astype(np.int16)) + return f.name + +# Interface Gradio +with gr.Blocks(title="🎙️ Studio Audio IA") as demo: + gr.Markdown("## 🎙️ Studio Audio IA — AudioCraft API") + + with gr.Tab("🎵 Musique (MusicGen)"): + music_prompt = gr.Textbox(label="Prompt", placeholder="Calm piano music with soft strings, 120bpm...") + music_duration = gr.Slider(5, 30, value=10, step=5, label="Durée (secondes)") + music_btn = gr.Button("🎵 Générer la musique") + music_output = gr.Audio(label="Résultat") + music_btn.click(generate_music, inputs=[music_prompt, music_duration], outputs=music_output) + + with gr.Tab("🔊 Bruitages (AudioGen)"): + sound_prompt = gr.Textbox(label="Prompt", placeholder="Wood cracking, cathedral reverb, horror atmosphere...") + sound_duration = gr.Slider(2, 15, value=5, step=1, label="Durée (secondes)") + sound_btn = gr.Button("🔊 Générer le son") + sound_output = gr.Audio(label="Résultat") + sound_btn.click(generate_sound, inputs=[sound_prompt, sound_duration], outputs=sound_output) + +demo.launch(server_name="0.0.0.0", server_port=7860, share=False) +PYEOF + +echo "✅ Serveur API AudioCraft créé" + +# --- 6. LANCEMENT DU SERVEUR AUDIOCRAFT EN ARRIÈRE-PLAN --- +echo "🚀 Démarrage du serveur AudioCraft..." +source /workspace/venv-audiocraft/bin/activate +cd /workspace/audiocraft-api + +# Lancement dans un écran screen pour persistance +screen -dmS audiocraft bash -c " + source /workspace/venv-audiocraft/bin/activate + cd /workspace/audiocraft-api + python server.py 2>&1 | tee /workspace/audiocraft.log +" + +echo "✅ AudioCraft lancé sur le port 7860 (écran: 'audiocraft')" + +# --- 7. PERSISTANCE DES VARIABLES --- +env >> /etc/environment + +echo "" +echo "🎉 =============================================" +echo " Studio IA - Design Sonore prêt !" +echo " Open WebUI → port 3000" +echo " AudioCraft → port 7860" +echo " Logs → /workspace/audiocraft.log" +echo "=============================================" \ No newline at end of file