# 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.
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 :
- 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
Aucun commentaire pour le moment.