287 lines
10 KiB
Markdown
287 lines
10 KiB
Markdown
# 🎙️ 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|localhost:7860:7860:/:AudioCraft|localhost:1111:11111:/:Portal |
|
|
| `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
|
|
|
|
```bash
|
|
#!/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.
|
|
|
|
```bash
|
|
#!/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
|
|
|
|
```bash
|
|
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.
|