đŒ 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 :
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
Chargement :
L'audio est chargé.
Rééchantillonnage :
L'audio est rééchantillonné à $16000\text{ Hz}$.
Tronquage/Padding :
L'audio est tronqué ou complété pour atteindre exactement $10$ secondes.
Spectrogramme Mel :
Le spectrogramme Mel à $128$ bandes est calculé.
Conversion Logarithmique :
Conversion en décibels (
librosa.power_to_db
).
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)