Actualiser provisioning_script.sh
This commit is contained in:
@ -1,74 +1,40 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# =============================================================
|
# =============================================================
|
||||||
# Studio IA - Design Sonore & Composition
|
# Studio IA - Design Sonore & Composition
|
||||||
# Provisioning Script pour RTX 5060 Ti / CUDA 12.1
|
# Version sans Docker - natif dans le container Vast.ai
|
||||||
# =============================================================
|
# =============================================================
|
||||||
|
|
||||||
set -eo pipefail
|
set -eo pipefail
|
||||||
echo "🎙️ Démarrage du provisioning Studio Audio IA..."
|
echo "🎙️ Démarrage du provisioning Studio Audio IA..."
|
||||||
|
|
||||||
# --- 1. MISE À JOUR SYSTÈME & DÉPENDANCES ---
|
# --- 1. DÉPENDANCES SYSTÈME ---
|
||||||
apt-get update -y && apt-get install -y \
|
apt-get update -y && apt-get install -y \
|
||||||
python3.10 python3.10-venv python3-pip \
|
|
||||||
ffmpeg libsndfile1 sox \
|
ffmpeg libsndfile1 sox \
|
||||||
ca-certificates curl gnupg lsb-release \
|
git wget nano screen python3-pip
|
||||||
git wget nano screen
|
|
||||||
|
|
||||||
# --- 2. INSTALLATION DOCKER (si non présent) ---
|
# --- 2. OPEN WEBUI (pip depuis GitHub) ---
|
||||||
if ! command -v docker &> /dev/null; then
|
echo "🖥️ Installation d'Open WebUI..."
|
||||||
echo "📦 Installation de Docker..."
|
pip install 'open-webui==0.5.20' --extra-index-url https://pypi.org/simple/
|
||||||
curl -fsSL https://get.docker.com | bash
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- 3. LANCEMENT OPEN WEBUI ---
|
# --- 3. PYTORCH + AUDIOCRAFT ---
|
||||||
echo "🖥️ Lancement d'Open WebUI sur le port 3000..."
|
echo "🐍 Installation de PyTorch CUDA 12.1..."
|
||||||
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
|
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
|
||||||
|
|
||||||
# AudioCraft (MusicGen + AudioGen)
|
echo "🎵 Installation d'AudioCraft..."
|
||||||
pip install git+https://github.com/facebookresearch/audiocraft.git
|
pip install git+https://github.com/facebookresearch/audiocraft.git
|
||||||
|
pip install gradio scipy soundfile
|
||||||
|
|
||||||
# Serveur API Gradio
|
# --- 4. CRÉATION DU SERVEUR AUDIOCRAFT ---
|
||||||
pip install gradio fastapi uvicorn pydantic scipy soundfile
|
mkdir -p /root/audiocraft-api
|
||||||
|
|
||||||
echo "✅ AudioCraft installé"
|
cat > /root/audiocraft-api/server.py << 'PYEOF'
|
||||||
|
|
||||||
# --- 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 gradio as gr
|
||||||
import torch
|
import torch
|
||||||
import scipy.io.wavfile
|
import scipy.io.wavfile
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import tempfile, os
|
import tempfile
|
||||||
from audiocraft.models import MusicGen, AudioGen
|
from audiocraft.models import MusicGen, AudioGen
|
||||||
|
|
||||||
# Chargement des modèles (une seule fois)
|
|
||||||
print("🔄 Chargement de MusicGen...")
|
print("🔄 Chargement de MusicGen...")
|
||||||
music_model = MusicGen.get_pretrained("facebook/musicgen-small")
|
music_model = MusicGen.get_pretrained("facebook/musicgen-small")
|
||||||
music_model.set_generation_params(duration=10)
|
music_model.set_generation_params(duration=10)
|
||||||
@ -77,70 +43,49 @@ print("🔄 Chargement d'AudioGen...")
|
|||||||
audio_model = AudioGen.get_pretrained("facebook/audiogen-medium")
|
audio_model = AudioGen.get_pretrained("facebook/audiogen-medium")
|
||||||
audio_model.set_generation_params(duration=5)
|
audio_model.set_generation_params(duration=5)
|
||||||
|
|
||||||
def generate_music(prompt: str, duration: int = 10):
|
def generate_music(prompt, duration=10):
|
||||||
"""Génère de la musique à partir d'un prompt textuel."""
|
|
||||||
music_model.set_generation_params(duration=duration)
|
music_model.set_generation_params(duration=duration)
|
||||||
wav = music_model.generate([prompt])
|
wav = music_model.generate([prompt])
|
||||||
wav_np = wav[0, 0].cpu().numpy()
|
wav_np = wav[0, 0].cpu().numpy()
|
||||||
sr = music_model.sample_rate
|
|
||||||
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
|
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
|
||||||
scipy.io.wavfile.write(f.name, sr, (wav_np * 32767).astype(np.int16))
|
scipy.io.wavfile.write(f.name, music_model.sample_rate, (wav_np * 32767).astype(np.int16))
|
||||||
return f.name
|
return f.name
|
||||||
|
|
||||||
def generate_sound(prompt: str, duration: int = 5):
|
def generate_sound(prompt, duration=5):
|
||||||
"""Génère des bruitages et ambiances sonores."""
|
|
||||||
audio_model.set_generation_params(duration=duration)
|
audio_model.set_generation_params(duration=duration)
|
||||||
wav = audio_model.generate([prompt])
|
wav = audio_model.generate([prompt])
|
||||||
wav_np = wav[0, 0].cpu().numpy()
|
wav_np = wav[0, 0].cpu().numpy()
|
||||||
sr = audio_model.sample_rate
|
|
||||||
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
|
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
|
||||||
scipy.io.wavfile.write(f.name, sr, (wav_np * 32767).astype(np.int16))
|
scipy.io.wavfile.write(f.name, audio_model.sample_rate, (wav_np * 32767).astype(np.int16))
|
||||||
return f.name
|
return f.name
|
||||||
|
|
||||||
# Interface Gradio
|
|
||||||
with gr.Blocks(title="🎙️ Studio Audio IA") as demo:
|
with gr.Blocks(title="🎙️ Studio Audio IA") as demo:
|
||||||
gr.Markdown("## 🎙️ Studio Audio IA — AudioCraft API")
|
gr.Markdown("## 🎙️ Studio Audio IA")
|
||||||
|
with gr.Tab("🎵 Musique"):
|
||||||
with gr.Tab("🎵 Musique (MusicGen)"):
|
p1 = gr.Textbox(label="Prompt")
|
||||||
music_prompt = gr.Textbox(label="Prompt", placeholder="Calm piano music with soft strings, 120bpm...")
|
d1 = gr.Slider(5, 30, value=10, step=5, label="Durée (s)")
|
||||||
music_duration = gr.Slider(5, 30, value=10, step=5, label="Durée (secondes)")
|
b1 = gr.Button("Générer")
|
||||||
music_btn = gr.Button("🎵 Générer la musique")
|
o1 = gr.Audio(label="Résultat")
|
||||||
music_output = gr.Audio(label="Résultat")
|
b1.click(generate_music, inputs=[p1, d1], outputs=o1)
|
||||||
music_btn.click(generate_music, inputs=[music_prompt, music_duration], outputs=music_output)
|
with gr.Tab("🔊 Bruitages"):
|
||||||
|
p2 = gr.Textbox(label="Prompt")
|
||||||
with gr.Tab("🔊 Bruitages (AudioGen)"):
|
d2 = gr.Slider(2, 15, value=5, label="Durée (s)")
|
||||||
sound_prompt = gr.Textbox(label="Prompt", placeholder="Wood cracking, cathedral reverb, horror atmosphere...")
|
b2 = gr.Button("Générer")
|
||||||
sound_duration = gr.Slider(2, 15, value=5, step=1, label="Durée (secondes)")
|
o2 = gr.Audio(label="Résultat")
|
||||||
sound_btn = gr.Button("🔊 Générer le son")
|
b2.click(generate_sound, inputs=[p2, d2], outputs=o2)
|
||||||
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)
|
demo.launch(server_name="0.0.0.0", server_port=7860, share=False)
|
||||||
PYEOF
|
PYEOF
|
||||||
|
|
||||||
echo "✅ Serveur API AudioCraft créé"
|
# --- 5. LANCEMENT DES SERVICES ---
|
||||||
|
echo "🚀 Lancement d'Open WebUI sur le port 3000..."
|
||||||
|
screen -dmS openwebui bash -c "open-webui serve --port 3000 2>&1 | tee /root/openwebui.log"
|
||||||
|
|
||||||
# --- 6. LANCEMENT DU SERVEUR AUDIOCRAFT EN ARRIÈRE-PLAN ---
|
echo "🚀 Lancement d'AudioCraft sur le port 7860..."
|
||||||
echo "🚀 Démarrage du serveur AudioCraft..."
|
screen -dmS audiocraft bash -c "python /root/audiocraft-api/server.py 2>&1 | tee /root/audiocraft.log"
|
||||||
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
|
env >> /etc/environment
|
||||||
|
|
||||||
echo ""
|
echo "🎉 Studio Audio IA prêt !"
|
||||||
echo "🎉 ============================================="
|
|
||||||
echo " Studio IA - Design Sonore prêt !"
|
|
||||||
echo " Open WebUI → port 3000"
|
echo " Open WebUI → port 3000"
|
||||||
echo " AudioCraft → port 7860"
|
echo " AudioCraft → port 7860"
|
||||||
echo " Logs → /workspace/audiocraft.log"
|
|
||||||
echo "============================================="
|
|
||||||
Reference in New Issue
Block a user