Retour à l'accueil

PyTorch Hooks pour l'audio à partir des activations LLM

L'article décrit deux expériences : assemblage direct des latents visuels SigLIP avec MusicGen via monkey patching et génération ambiante à partir des activations Qwen2.5 en utilisant des PyTorch forward hooks. Le code est fourni pour intercepter les états neuronaux et la modulation DSP. Adapté pour créer de l'audio unique sans prompts textuels.

Génération de sons à partir des « pensées » de l'IA sans prompts
Advertisement 728x90

# Piratage des activations LLM pour la génération audio avec les hooks PyTorch

Dans l'expérience PaleoSonic Engine, les patches visuels de SigLIP sont directement transformés en latents audio de MusicGen. Au lieu du pipeline classique Image -> Texte -> Audio, une couche linéaire (nn.Linear) projette 196 patches de taille 196 en vecteurs sonores. Les modèles sont convertis en bfloat16 pour tourner sur 16 Go de RAM.

L'étape clé consiste à monkey-patcher l'encodeur de texte de MusicGen. Le générateur attend 196 tokens texte mais reçoit de la géométrie d'image à la place. Une initialisation aléatoire du pont produit un bruit brut : du crachouillis harsh simulant un choc d'architecture sans fine-tuning.

# Sauvegarder le "cerveau" original
original_text_encoder = self.audio_decoder.text_encoder.forward

# Créer une classe factice
class VisualThoughts:
    def __init__(self, hidden_states):
        self.last_hidden_state = hidden_states
    def __getitem__(self, idx):
        return [self.last_hidden_state][idx]
        
def spoofed_text_encoder(*args, **kwargs):
    # Glisser des tenseurs visuels à la place du texte !
    return VisualThoughts(audio_conditioning)
    
# Infecter le générateur
self.audio_decoder.text_encoder.forward = spoofed_text_encoder

Cette approche expose une traduction brute de la géométrie des pixels en acoustique, en contournant la sémantique textuelle.

Google AdInline article slot

Hooks PyTorch pour extraire les 'pensées' LLM en temps réel

Dans la seconde expérience, Neural-Analog Engine utilise Qwen2.5-1.5B-Instruct pour piloter un oscillateur DSP. Un hook forward est enregistré sur la couche 15 — le noyau des représentations abstraites. Les activations sont détachées, converties en float32, et compressées par moyenne sur l'axe batch.

neural_activations = []

# Fonction espionne pour voler les pensées
def steal_thoughts_hook(module, input, output):
    # Saisir l'état actuel des neurones
    current_thought = output[0].detach().cpu().to(torch.float32).numpy()
    compressed_thought = np.mean(current_thought, axis=1)[0] 
    neural_activations.append(compressed_thought)

# Injecter l'"aiguille" dans la 15e couche de Qwen
hook_handle = model.model.layers[15].register_forward_hook(steal_thoughts_hook)

Les vecteurs bruts alimentent un oscillateur NumPy et des filtres SciPy. Le LLM génère un prompt comme "Silence d'une étoile quantique gelée", mais le son est modulé par des impulsions d'activation : fréquences, phases et décréescence pilotées par les valeurs neuronales. Le résultat est un dark ambient pur sans générateurs audio neuronaux.

Détails techniques du pont cross-modal

  • Backbone vision : google/siglip-base-patch16-224 produit 196 patches après self-attention.
  • Cible audio : facebook/musicgen-small attend un text_encoder avec hidden_state [1, 196, dim].
  • Pont : nn.Linear(196dim_vision, 196dim_audio) avec init aléatoire ; pas de fine-tuning pour garder le 'grit'.
  • Mécanique des hooks : register_forward_hook capture la sortie après MLP en couche 15 ; detach évite les gradients.
  • Pipeline DSP : np.sin pour les oscillateurs + scipy.signal.butter pour les filtres passe-bas ; modulation d'amplitude via activations.

Différences sonores :

Google AdInline article slot
  • PaleoSonic — bruit chaotique des collisions de latents.
  • Neural-Analog — ambient structuré issu d'ondes physiques.

Scaling et optimisations pour la production

Les deux approches tournent dans Hugging Face Spaces. Pour scaler :

  • Utiliser torch.compile pour accélérer les hooks.
  • Quantiser Qwen en 4-bit avec bitsandbytes pour réduire la mémoire.
  • Paralléliser les activations via DataParallel sur plusieurs GPU.

Potentiel : Intégrer en temps réel audio (JACK/WASAPI) pour des performances live. Expérimenter d'autres couches — les premières donnent des features bas-niveau, les dernières de la sémantique.

Points clés

  • Le monkey patching contourne generate() sans réentraînement, en swapant l'encodeur à la volée.
  • Les hooks forward PyTorch sont standards pour l'interprétabilité ; detach est essentiel en inférence.
  • Compression d'activation (moyenne axis=1) réduit la dimensionnalité sans perdre la dynamique.
  • bfloat16 est crucial pour les setups low-RAM ; éviter float16 sur CPU.
  • DSP NumPy/SciPy surpasse torch.nn pour les oscillateurs simples.

— Editorial Team

Google AdInline article slot
Advertisement 728x90

Lire ensuite