← Retour au portfolio English

realtime_latent_space_synthesis

Vue d'ensemble de l'architecture — projet : cbicari/latent_space_synthesis

Objectif

Synthèse audio en espace latent en temps réel sur un Raspberry Pi 5, utilisant nn~ (l'externe Pure Data d'IRCAM/ACIDS qui exécute un réseau de neurones, ici un modèle RAVE, à l'intérieur d'un patch audio). Les gestes de la main d'une personne — ou, en alternative, un petit contrôleur MIDI — pilotent en direct l'espace latent du modèle, de sorte que le timbre du synthétiseur neuronal réagit au mouvement ou à des boutons/touches en temps réel.

Vue d'ensemble du pipeline

Deux chemins de contrôle alternatifs convergent vers le même patch Pure Data, qui pilote le moteur de synthèse neuronale :

Dans les deux cas, les valeurs de contrôle résultantes atteignent un patch Pure Data fonctionnant sous JACK audio, qui les transmet à nn~ — le modèle RAVE chargé — pour la synthèse audio neuronale en temps réel, JACK gérant les entrées/sorties audio proprement dites sur le Raspberry Pi 5.

Structure du dépôt

CheminRôle
mediapipe_OSC/Script de suivi de main et son environnement virtuel Python ; diffuse les points de repère via OSC
wekinator/WekiMini.jar (Wekinator) inclus, exécuté sous un runtime Java 8
rave_models/Fichier(s) de modèle RAVE pré-entraîné chargé(s) par nn~ dans le patch Pure Data
nn_tildeRéférence à l'externe Pure Data nn~ utilisé pour la synthèse audio neuronale
latent_space_synthesis_OSC_control.pdPatch principal : reçoit l'OSC (de Wekinator) et pilote nn~
latent_space_synthesis_midiController_AkaiMPKmini.pdPatch alternatif : pilote nn~ directement depuis l'entrée MIDI de l'Akai MPK mini
launch_demo.shDémarre ensemble JACK, Pure Data, Wekinator, et le script de suivi de main
kill_all.shArrête tout ce que launch_demo.sh a démarré

Pipeline de données

Pipeline de données de latent_space_synthesis Deux sources de contrôle alternatives, le suivi gestuel de la main via Wekinator ou un contrôleur MIDI Akai MPK mini direct, alimentent toutes deux un patch Pure Data qui pilote le modèle audio neuronal RAVE via nn tilde, produisant un audio en temps réel via JACK. Contrôle gestuel Suivi de main → Wekinator, via OSC Contrôle MIDI (alternatif) Akai MPK mini, direct vers Pure Data Patch Pure Data Route l'OSC/MIDI vers les contrôles nn~ nn~ (modèle RAVE) Synthèse audio neuronale Sortie audio JACK Audio en temps réel sur Raspberry Pi 5
Deux chemins de contrôle convergeant vers Pure Data → nn~ → audio JACK

Lancer et arrêter la démo

launch_demo.sh démarre l'ensemble du pipeline de contrôle gestuel en une seule fois, dans cet ordre :

Séquence de démarrage de launch_demo.sh launch_demo.sh démarre quatre processus en arrière-plan dans l'ordre : l'audio JACK, le patch de contrôle OSC Pure Data, Wekinator, et le script de suivi de main, enregistrant chaque identifiant de processus dans un fichier afin que kill_all.sh puisse tous les arrêter plus tard. launch_demo.sh Démarre tous lesprocessus dans l'ordre Audio JACK (qjackctl) Démarre avec lecture automatique Pure Data (-jack) Patch de contrôle OSC Wekinator (WekiMini.jar) Runtime Java 8 Suivi de main (venv) mediapipe_OSC/hand_recognition.py Les 4 PID sont enregistrés dans process_pids.txt kill_all.sh lit ce fichier pour arrêter chaque processus
Ordre de démarrage de launch_demo.sh, défait par kill_all.sh

Le PID de chaque processus est ajouté à process_pids.txt. kill_all.sh lit ce fichier et tue chaque PID qu'il contient, puis supprime le fichier — l'arrêt correspondant à ce que launch_demo.sh a démarré.

Pour utiliser le chemin du contrôleur MIDI à la place, ouvrez directement latent_space_synthesis_midiController_AkaiMPKmini.pd dans Pure Data (sous JACK) plutôt que d'exécuter launch_demo.sh, puisque ce chemin n'a besoin ni de Wekinator ni du script de suivi de main.

Configuration (Raspberry Pi 5)

Condensé depuis le README ; voir install/raspberrypi.sh dans le dépôt et les instructions en amont de nn_tilde pour tous les détails.

1. Installer uv (si pas déjà présent)

curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env   # ou redémarrer votre shell

2. Créer un environnement virtuel Python 3.9 et installer les dépendances

uv venv nn_venv --python 3.9
uv pip install pip

sudo apt update
sudo apt install -y cmake build-essential git puredata puredata-dev python3 python3-pip
python3 -m pip install torch

LIBTORCH=/home/<utilisateur>/.../lib/python3.9/site-packages/torch/

3. Compiler et installer nn~, à la dernière version prise en charge sur Raspberry Pi

git clone https://github.com/acids-ircam/nn_tilde.git
cd nn_tilde/
git checkout v1.5.6

mkdir build && cd build
cmake ../src/ -DCMAKE_PREFIX_PATH=$LIBTORCH -DCMAKE_BUILD_TYPE=Release
make
sudo mkdir -p /usr/local/lib/pd-externals/
sudo cp frontend/puredata/nn_tilde/nn~.pd_linux /usr/local/lib/pd-externals/
cd ../../
rm -fr nn_tilde

4. Contourner l'exigence de version Java de Wekinator

WekiMini a spécifiquement besoin de Java 8 pour sauvegarder correctement les projets :

wget https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u402-b06/OpenJDK8U-jdk_aarch64_linux_hotspot_8u402b06.tar.gz
tar -xzf OpenJDK8U-jdk_aarch64_linux_hotspot_8u402b06.tar.gz
sudo mv jdk8u402-b06 /opt/java8

# Exécuter Wekinator avec :
/opt/java8/bin/java -jar /chemin/vers/WekiMini.jar

Construit avec