GPU recommandé. Stable Audio Open fonctionne sur CPU mais la génération prendra plusieurs minutes. Avec un GPU NVIDIA (8 Go VRAM recommandés), c'est environ 10-30 secondes pour 30 secondes d'audio.
C'est quoi Stable Audio Open ? 01
Stable Audio Open est un modèle de génération audio de Stability AI, open-source et utilisable localement. Il génère de l'audio à partir d'une description textuelle (prompt) : musique, ambiances, effets sonores, loops.
Contrairement à la version commerciale, la version Open est téléchargeable et utilisable gratuitement, y compris pour des projets créatifs personnels.
Stable Audio Open génère des samples stéréo jusqu'à 47 secondes à 44.1 kHz. C'est parfait pour des loops de musique, des ambiances, des effets sonores. Ce n'est pas un modèle de chanson (pas de voix chantée).
Installation 02
mkdir stable-audio-tuto
cd stable-audio-tuto
python -m venv venv
venv\Scripts\activate # Windows
source venv/bin/activate # macOS / Linux
# PyTorch avec CUDA (adapter la version à ton setup sur pytorch.org)
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu121
# stable-audio-tools : la bibliothèque officielle de Stability AI
pip install stable-audio-tools
# soundfile : pour sauvegarder l'audio en WAV
pip install soundfile huggingface_hub
Le modèle est sur HuggingFace et nécessite d'accepter une licence. Trois étapes rapides :
Crée un compte gratuit sur huggingface.co
Va sur stabilityai/stable-audio-open-1.0 et accepte la licence
Génère un token dans Settings → Access Tokens, puis connecte-toi :
huggingface-cli login
# Colle ton token quand demandé
Générer ton premier audio 03
Crée generate_audio.py :
import torch
import soundfile as sf
from stable_audio_tools import get_pretrained_model
from stable_audio_tools.inference.generation import generate_diffusion_cond
# ── Charger le modèle ─────────────────────────────────────────────────────────
# La première exécution télécharge ~3.5 Go depuis HuggingFace.
# Les fois suivantes, il est en cache local (~/.cache/huggingface).
print("Chargement du modèle Stable Audio Open...")
device = "cuda" if torch.cuda.is_available() else "cpu"
model, model_config = get_pretrained_model("stabilityai/stable-audio-open-1.0")
model = model.to(device)
sample_rate = model_config["sample_rate"] # 44100 Hz
sample_size = model_config["sample_size"] # taille max du sample
print(f"Modèle chargé sur : {device}")
# ── Prompt ────────────────────────────────────────────────────────────────────
# Décris : style, instruments, BPM, ambiance.
# Les prompts en anglais donnent de meilleurs résultats.
prompt = (
"atmospheric dark ambient music, slow evolving pads, "
"deep bass drone, cinematic tension, no drums, 130 BPM"
)
negative_prompt = "low quality, noise, distortion, vocals, speech"
duree_secondes = 30 # durée souhaitée (max ~47s)
print(f"Génération de {duree_secondes} secondes d'audio...")
# ── Générer ───────────────────────────────────────────────────────────────────
conditioning = [
{
"prompt": prompt,
"seconds_start": 0,
"seconds_total": duree_secondes,
}
]
negative_conditioning = [
{
"prompt": negative_prompt,
"seconds_start": 0,
"seconds_total": duree_secondes,
}
]
with torch.no_grad():
audio = generate_diffusion_cond(
model,
steps=100, # étapes de diffusion (50-200)
cfg_scale=7.0, # guidance scale
conditioning=conditioning,
negative_conditioning=negative_conditioning,
batch_size=1,
sample_size=sample_size,
sigma_min=0.3,
sigma_max=500,
sampler_type="dpmpp-3m-sde", # algorithme d'échantillonnage
device=device,
seed=42,
)
# ── Sauvegarder ───────────────────────────────────────────────────────────────
# audio shape : [batch, channels, samples] → on prend [0] et on transpose
audio_numpy = audio[0].cpu().float().numpy().T # [samples, channels]
n_samples = int(duree_secondes * sample_rate)
audio_numpy = audio_numpy[:n_samples] # rogner à la durée voulue
sf.write("output_audio.wav", audio_numpy, sample_rate)
print("✓ Audio sauvegardé : output_audio.wav")
python generate_audio.py
Le fichier output_audio.wav apparaît dans ton dossier projet. Ouvre-le avec n'importe quel lecteur audio ou importe-le directement dans ta DAW.
L'art du prompt audio 04
Les prompts audio ont leurs propres conventions. Voilà des exemples qui fonctionnent bien :
# Loop de batterie hip-hop
prompt = "punchy drum loop, hip hop, 90 BPM, crispy snare, deep kick, vinyl crackle"
# Ambiance nature
prompt = "forest ambience, birds chirping, light wind through leaves, distant stream, peaceful, morning"
# Techno
prompt = "techno music loop, 140 BPM, driving kick drum, acid bassline, hypnotic, dark warehouse"
# Cinématique
prompt = "epic orchestral music, strings, brass, choir, building tension, cinematic"
# Effet sonore sci-fi
prompt = "sci-fi interface beep, futuristic UI sound, short, clean, sterile"
# Jazz lo-fi
prompt = "lo-fi jazz, piano, double bass, brushed drums, 80 BPM, warm, nostalgic, vinyl noise"
# Guitare modale (tu vois ce que c'est...)
prompt = "modal guitar improvisation, open tuning, atmospheric, reverb, slow, meditative, no drums"
Les éléments les plus impactants dans un prompt audio : genre/style, instruments, BPM, ambiance. Mentionner "no drums" ou "no vocals" dans le negative prompt évite les artéfacts rythmiques indésirables.
Générer plusieurs variations 05
Comme pour les images, on génère plusieurs seeds pour explorer les possibilités d'un même prompt :
import torch
import soundfile as sf
from stable_audio_tools import get_pretrained_model
from stable_audio_tools.inference.generation import generate_diffusion_cond
device = "cuda" if torch.cuda.is_available() else "cpu"
model, model_config = get_pretrained_model("stabilityai/stable-audio-open-1.0")
model = model.to(device)
sample_rate = model_config["sample_rate"]
sample_size = model_config["sample_size"]
prompt = "atmospheric ambient drone, evolving textures, deep space, no rhythm"
duree = 20
seeds = [42, 123, 456, 789]
for seed in seeds:
print(f"Génération seed {seed}...")
conditioning = [{"prompt": prompt, "seconds_start": 0, "seconds_total": duree}]
negative_conditioning = [{"prompt": "low quality, noise", "seconds_start": 0, "seconds_total": duree}]
with torch.no_grad():
audio = generate_diffusion_cond(
model, steps=80, cfg_scale=7.0,
conditioning=conditioning,
negative_conditioning=negative_conditioning,
batch_size=1, sample_size=sample_size,
sigma_min=0.3, sigma_max=500,
sampler_type="dpmpp-3m-sde", device=device, seed=seed,
)
audio_np = audio[0].cpu().float().numpy().T
audio_np = audio_np[:int(duree * sample_rate)]
sf.write(f"variation_seed_{seed}.wav", audio_np, sample_rate)
print(f" → variation_seed_{seed}.wav sauvegardé")
print("Terminé !")
Les fichiers WAV générés s'importent directement dans n'importe quelle DAW (Bitwig, Ableton, Logic…). Tu peux les utiliser comme samples, les slicer, les layerer. Dans le tuto suivant, on passe à la transcription audio avec Whisper.cpp.