File size: 8,392 Bytes
9c584d5 679412b 3dd6af2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
---
license: mit
datasets:
- Clemylia/Rythme
language:
- fr
pipeline_tag: audio-classification
library_name: keras
tags:
- Rythme
- Décalage
- Calé ou décalé
- musique
- Audio classify
---
# 🎼 Musica2 : Détection de Rythme Audio (Calé ou Décalé)

## 🌟 Présentation
**Musica2** est un modèle d'apprentissage profond conçu pour analyser un clip audio (chanson) et déterminer s'il est **dans le rythme (calé)** ou **hors rythme (décalé)**. Ce modèle a été entraîné *from scratch* par **Clemylia** en utilisant la bibliothèque **Keras** et **TensorFlow**.
### 🎯 Tâche et Classes
| ID | Label | Description |
| :---: | :---: | :--- |
| **0** | **Calé** | L'audio est bien aligné sur le rythme. |
| **1** | **Décalé** | L'audio présente un désalignement ou un décalage rythmique. |
## ⚙️ Architecture et Entraînement
Musica2 est un modèle **Convolutionnel 2D (CNN)**, adapté à l'analyse d'images de spectrogrammes Mel, qui représentent la distribution de l'énergie audio dans le temps et la fréquence.
* **Framework d'Entraînement :** Keras (TensorFlow)
* **Données d'Entrée :** Spectrogrammes Mel (représentation visuelle de l'audio).
## 📥 Comment Utiliser Musica2
Le modèle est disponible en téléchargement et chargement direct depuis **Hugging Face Hub** en utilisant `huggingface_hub` et `tensorflow/keras`.
### 💻 Dépendances
Assurez-vous d'avoir installé les bibliothèques nécessaires :
```bash
pip install tensorflow keras numpy librosa huggingface_hub
```
### 🐍 Code d'Inférence (Exemple)
Le code d'inférence fourni est la méthode stable pour utiliser Musica2. Il gère le téléchargement, le chargement, le prétraitement de l'audio et la prédiction.
#### Paramètres Clés
| Paramètre | Valeur | Description |
| :--- | :---: | :--- |
| `HF_REPO_ID` | `"Clemylia/Musica2"` | Identifiant du dépôt sur Hugging Face. |
| `FULL_MODEL_FILENAME` | `"musica2_complete_model.keras"` | Nom du fichier Keras complet. |
| `SAMPLE_RATE` | `16000` | Taux d'échantillonnage cible (Hz). |
| `MAX_CLIP_DURATION` | `10` | Durée maximale des clips audio traités (secondes). |
| `N_MELS` | `128` | Nombre de bandes Mel pour le spectrogramme. |
#### 🛠️ Pipeline de Prétraitement
1. **Chargement :** L'audio est chargé.
2. **Rééchantillonnage :** L'audio est rééchantillonné à $16000\text{ Hz}$.
3. **Tronquage/Padding :** L'audio est tronqué ou complété pour atteindre exactement $10$ secondes.
4. **Spectrogramme Mel :** Le spectrogramme Mel à $128$ bandes est calculé.
5. **Conversion Logarithmique :** Conversion en décibels (`librosa.power_to_db`).
6. **Normalisation Z-Score :** Le spectrogramme est normalisé à $\mu=0$ et $\sigma=1$ pour l'entrée du modèle.
> **Note :** Le modèle attend une entrée de forme $(1, \text{Hauteur}, \text{Largeur}, 1)$, correspondant à un spectrogramme Mel normalisé.
### 📊 Interprétation des Résultats
Le modèle effectue une prédiction binaire, retournant une probabilité **$P$** entre $0.0$ et $1.0$ :
* Si $P < 0.5$, le verdict est **Calé** (Classe 0). La confiance est $1 - P$.
* Si $P \ge 0.5$, le verdict est **Décalé** (Classe 1). La confiance est $P$.
## ⚠️ Limitations et Avertissements
* **Durée du Clip :** Le modèle est optimisé pour des clips audio de **10 secondes**. L'analyse d'un clip plus long ou plus court pourrait affecter la précision.
* **Qualité Audio :** La performance peut être affectée par une mauvaise qualité d'enregistrement ou un bruit excessif.
* **Définition de Rythme :** Le modèle a appris à partir d'un ensemble de données spécifique ; sa généralisation à des genres musicaux ou des définitions de "rythme" très éloignées peut varier.
## 🤝 Contribution et Contact
Pour toute question, suggestion ou collaboration, veuillez contacter **Clemylia**.
**Exemple de code d'inférence fonctionnel**
```
import tensorflow as tf
from tensorflow import keras
import numpy as np
import librosa
from huggingface_hub import hf_hub_download
import os
import warnings
warnings.filterwarnings('ignore', category=FutureWarning)
warnings.filterwarnings('ignore', category=UserWarning)
# ----------------------------------------------------------------------------------
# PARTIE 1 : CONFIGURATION ET CHARGEMENT DU MODÈLE COMPLET
# ----------------------------------------------------------------------------------
# --- CONFIGURATION D'INFÉRENCE ---
SAMPLE_RATE = 16000
MAX_CLIP_DURATION = 10
N_MELS = 128
# >>> NOUVEAU NOM DE FICHIER DU MODÈLE COMPLET <<<
HF_REPO_ID = "Clemylia/Musica2"
FULL_MODEL_FILENAME = "musica2_complete_model.keras"
id_to_label = {0: "calé", 1: "décalé"}
model = None # Initialisation
print(f"⏳ Téléchargement et chargement du modèle complet depuis {HF_REPO_ID}...")
downloaded_model_path = None
try:
# 1. Télécharger le fichier .keras complet
downloaded_model_path = hf_hub_download(
repo_id=HF_REPO_ID,
filename=FULL_MODEL_FILENAME,
force_download=True
)
# 2. CHARGEMENT DU MODÈLE : Keras gère le fichier .keras complet en une seule fois
model = keras.models.load_model(downloaded_model_path)
print("✅ Modèle Musica2 chargé et prêt pour l'inférence.")
except Exception as e:
print(f"❌ ERREUR FATALE DE CHARGEMENT DU MODÈLE COMPLET : {e}")
print("Veuillez vérifier l'URL du dépôt ou le nom du fichier du modèle complet sur Hugging Face.")
model = None
# ----------------------------------------------------------------------------------
# PARTIE 2 : FONCTION DE PRÉTRAITEMENT
# ----------------------------------------------------------------------------------
def preprocess_audio_for_inference(audio_path):
"""
Pipeline de prétraitement pour l'audio.
"""
if not os.path.exists(audio_path):
raise FileNotFoundError(f"Fichier audio non trouvé à : {audio_path}")
print(f" -> Prétraitement de l'audio à : {audio_path}")
audio_data, current_sr = librosa.load(audio_path, sr=None)
if current_sr != SAMPLE_RATE:
audio_data = librosa.resample(audio_data, orig_sr=current_sr, target_sr=SAMPLE_RATE)
target_length = SAMPLE_RATE * MAX_CLIP_DURATION
if len(audio_data) > target_length:
audio_data = audio_data[:target_length]
elif len(audio_data) < target_length:
padding = target_length - len(audio_data)
audio_data = np.pad(audio_data, (0, padding), 'constant')
S = librosa.feature.melspectrogram(y=audio_data, sr=SAMPLE_RATE, n_mels=N_MELS)
S_dB = librosa.power_to_db(S, ref=np.max)
S_norm = (S_dB - np.mean(S_dB)) / np.std(S_dB)
S_final = S_norm[np.newaxis, ..., np.newaxis].astype(np.float32)
return S_final
# ----------------------------------------------------------------------------------
# PARTIE 3 : FONCTION DE PRÉDICTION ET EXÉCUTION
# ----------------------------------------------------------------------------------
def predict_rhythm(model, audio_file_path):
"""
Effectue la prédiction et affiche le résultat.
"""
if model is None:
print("\n❌ Impossible de prédire : Le modèle n'a pas été chargé.")
return None, None
try:
input_features = preprocess_audio_for_inference(audio_file_path)
except FileNotFoundError as e:
print(f"\n⚠️ {e}")
return None, None
print(f"\n🔬 Début de l'analyse pour le fichier : {audio_file_path}")
# Prédiction
probability = model.predict(input_features, verbose=0)[0][0]
# Verdict
predicted_id = int(probability >= 0.5)
predicted_label = id_to_label[predicted_id]
# Confiance
confidence = probability if predicted_id == 1 else (1.0 - probability)
# Affichage
print("\n--- Résultat de la Prédiction ---")
print(f"Probabilité de 'Décalé' (Classe 1) : **{probability:.4f}**")
print(f"Verdict : La musique est **{predicted_label.upper()}**")
print(f"Confiance : {confidence:.2f}")
return predicted_label, probability
## --- EXÉCUTION DU TEST ---
TEST_AUDIO_PATH = "cale-1.mp3"
predict_rhythm(model, TEST_AUDIO_PATH)
```
**site officiel** :
https://clem-beat.lovable.app/ |