Files
VASTAI-STUDIO-AUDIO/vastai-template-studio-audio.md
2026-02-23 13:26:43 +00:00

10 KiB

🎙️ Template Vast.ai — Studio IA Design Sonore

Configuration complète pour RTX 5060 Ti (16 Go VRAM) / 130 Go de stockage


📋 Paramètres du Template

Champ Valeur
Template Name Studio IA - Design Sonore & Composition
Template Description Studio de génération audio IA pour novices. Interface web ChatGPT-like alimentée par AudioCraft (MusicGen + AudioGen). Accès navigateur uniquement, aucune compétence technique requise.
Image Path:Tag nvidia/cuda:12.1.1-devel-ubuntu22.04
Launch Mode Jupyter + SSH
Disk Space 130 Go
Visibility Privé

🔌 Ports à déclarer

Port interne Protocole Usage
3000 TCP Open WebUI (interface utilisateur)
7860 TCP AudioCraft / Gradio API
22 TCP SSH (auto-ajouté en mode Jupyter+SSH)
8080 TCP Jupyter (auto-ajouté en mode Jupyter+SSH)

🌐 Variables d'environnement

Variable Valeur
PROVISIONING_SCRIPT https://git.syoul.fr/nicoboy/VASTAI-STUDIO-AUDIO/raw/branch/main/provisioning_script.sh?token=980621d1d7f71f71a403b6c31078bf8f3734441c
PORTAL_CONFIG localhost:3000:3000:/:OpenWebUI
CUDA_VISIBLE_DEVICES 0
PYTORCH_CUDA_ALLOC_CONF max_split_size_mb:512

⚠️ Ne jamais mettre de clés API ou mots de passe ici si le template est public.


⚙️ On-start Script

#!/bin/bash
# Persister les variables d'environnement
env >> /etc/environment

Le gros du travail est dans le PROVISIONING_SCRIPT ci-dessous.


📜 PROVISIONING_SCRIPT (contenu complet)

Héberger ce script sur GitHub/Gist et pointer PROVISIONING_SCRIPT vers l'URL raw.

#!/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 "============================================="

🤖 System Prompt Open WebUI (à importer manuellement)

Après connexion à Open WebUI (port 3000), créer un nouveau modèle/assistant avec ce prompt :

Tu es un Ingénieur du Son expert et pédagogue. Ton rôle est d'aider des novices complets à créer des sons et de la musique grâce à l'IA.

RÈGLES FONDAMENTALES :
1. Utilise un langage simple, jamais de jargon technique sans explication.
2. Si l'utilisateur est vague (ex: "un son de forêt"), pose des questions précises :
   - Veut-il de la pluie ? Des oiseaux ? Une ambiance nocturne ?
   - Quel usage ? (jeu vidéo, film, méditation, musique...)
   - Quelle durée ? (quelques secondes, une boucle de 30s...)
3. Traduis les envies en descriptions techniques claires pour AudioCraft.
4. Propose toujours 2-3 variations du prompt pour offrir des choix.
5. Explique ce que tu vas générer AVANT de le faire.

EXEMPLES DE TRADUCTION :
- "Un son qui fait peur" → "Deep drone with low rumble, distant whispers, reverb, horror cinematic atmosphere"
- "Musique joyeuse pour enfants" → "Playful xylophone melody, cheerful, bright, 120bpm, children cartoon style"
- "Ambiance de forêt" → "Dense forest ambience, birds chirping, wind through leaves, morning atmosphere, gentle stream"

FORMAT DE RÉPONSE :
1. Reformule ce que l'utilisateur veut (pour valider)
2. Propose le prompt technique que tu vas utiliser
3. Demande confirmation avant de lancer la génération
4. Après génération : propose des ajustements (plus d'écho, plus grave, etc.)

Tu es patient, encourageant, et passionné par le design sonore. Chaque création est une collaboration artistique.

🔁 PORTAL_CONFIG — Accès simplifié

localhost:3000:3000:/:Open WebUI|localhost:7860:7860:/:AudioCraft API|localhost:1111:11111:/:Instance Portal|localhost:8080:18080:/:Jupyter

Checklist de déploiement

  • Héberger le provisioning script sur GitHub/Gist et copier l'URL raw
  • Coller l'URL dans la variable PROVISIONING_SCRIPT
  • Vérifier que les ports 3000 et 7860 sont bien ajoutés
  • Sauvegarder avec Create & Use
  • Attendre ~10-15 min (téléchargement des modèles AudioCraft ~8 Go)
  • Accéder à l'interface via le port mappé 3000
  • Créer un compte admin dans Open WebUI
  • Importer le System Prompt ci-dessus
  • Tester une génération audio

Commande CLI équivalente

vastai create instance \
  --image "nvidia/cuda:12.1.1-devel-ubuntu22.04" \
  --disk 130 \
  --ports "3000/tcp 7860/tcp 8080/tcp 22/tcp" \
  --env "PROVISIONING_SCRIPT=https://raw.githubusercontent.com/VOTRE_REPO/main/studio-audio-provisioning.sh" \
  --env "PORTAL_CONFIG=localhost:3000:3000:/:Open WebUI|localhost:7860:7860:/:AudioCraft API|localhost:1111:11111:/:Instance Portal" \
  --env "CUDA_VISIBLE_DEVICES=0" \
  --env "PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512"

📝 Notes RTX 5060 Ti

  • 16 Go VRAM : suffisant pour faire tourner MusicGen-small + AudioGen-medium simultanément.
  • Si manque de VRAM : passer à musicgen-melody et charger les modèles à la demande (unload entre générations).
  • Les modèles AudioCraft totalisent ~6-8 Go sur disque — les 130 Go sont confortables.
  • Temps de génération estimé : 5-15 secondes pour 10s de musique sur RTX 5060 Ti.