IA générative Intermédiaire schedule 45 min

music_note Génération audio avec Stable Audio

Générer de la musique et des effets sonores avec Stable Audio Open en Python — installation, prompting audio, et export WAV.

memory

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.

help_outline 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.

info

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).

build_circle Installation 02

terminalTerminal
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 :

terminalTerminal
huggingface-cli login
# Colle ton token quand demandé

music_note Générer ton premier audio 03

Crée generate_audio.py :

codegenerate_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")
terminalTerminal
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.

text_fields L'art du prompt audio 04

Les prompts audio ont leurs propres conventions. Voilà des exemples qui fonctionnent bien :

codeExemples de prompts efficaces
# 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"
lightbulb

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.

batch_prediction 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 :

codegenerate_variations.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

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é !")
info

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.