Files changed (1) hide show
  1. README.md +195 -1
README.md CHANGED
@@ -11,4 +11,198 @@ tags:
11
  - classification
12
  - decalage
13
  - problème de rythme
14
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  - classification
12
  - decalage
13
  - problème de rythme
14
+ ---
15
+
16
+ # 🩷🌸 Musica 🌸🩷
17
+
18
+ ![Musica](http://www.image-heberg.fr/files/17601659081539728277.jpg)
19
+
20
+ ## 🦋 **c'est quoi** ?
21
+
22
+ Musica est un projet de machine learning,
23
+ de type classification d'audio,
24
+ il a été conçu pour classifier les chansons au niveau de leur rythme (calé ou décalé),
25
+ C'est-à-dire de percevoir les décalages rythmiques dans les chansons.
26
+
27
+ ## ❤️ Comment utiliser ?
28
+
29
+ Pour utiliser Musica,
30
+ Qui a été crée from scratch sur la dataset Clemylia/Tempo,
31
+ Vous devez reconstruire le code d'inférence,
32
+ Voici un exemple de code d'utilisation :
33
+
34
+ ```
35
+ import torch
36
+ import torch.nn as nn
37
+ import torch.nn.functional as F
38
+ import torchaudio
39
+ import numpy as np
40
+ from huggingface_hub import hf_hub_download
41
+ from datasets import load_dataset, Audio # On garde l'import au cas où
42
+
43
+ # =============================================================================
44
+ # PARTIE 1 : DÉFINITION DE L'ARCHITECTURE (inchangée)
45
+ # =============================================================================
46
+
47
+ NUM_CLASSES = 2
48
+ N_MELS = 128
49
+
50
+ class AudioClassifier(nn.Module):
51
+ """Réseau de Neurones Convolutionnels (CNN) que nous avons entraîné."""
52
+ def __init__(self):
53
+ super(AudioClassifier, self).__init__()
54
+ self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=(5, 5), padding=2)
55
+ self.bn1 = nn.BatchNorm2d(32)
56
+ self.pool1 = nn.MaxPool2d(kernel_size=(2, 2))
57
+ self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=(3, 3), padding=1)
58
+ self.bn2 = nn.BatchNorm2d(64)
59
+ self.pool2 = nn.MaxPool2d(kernel_size=(2, 2))
60
+ self.conv3 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=(3, 3), padding=1)
61
+ self.bn3 = nn.BatchNorm2d(128)
62
+ self.pool3 = nn.MaxPool2d(kernel_size=(2, 2))
63
+ self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
64
+ self.fc1 = nn.Linear(128 * 1 * 1, NUM_CLASSES)
65
+
66
+ def forward(self, x):
67
+ x = self.pool1(F.relu(self.bn1(self.conv1(x))))
68
+ x = self.pool2(F.relu(self.bn2(self.conv2(x))))
69
+ x = self.pool3(F.relu(self.bn3(self.conv3(x))))
70
+ x = self.avgpool(x)
71
+ x = torch.flatten(x, 1)
72
+ return self.fc1(x)
73
+
74
+
75
+ # =============================================================================
76
+ # PARTIE 2 : FONCTIONS DE PRÉPARATION POUR L'INFÉRENCE (inchangée)
77
+ # =============================================================================
78
+
79
+ SAMPLING_RATE = 16000
80
+ N_FFT = 400
81
+ HOP_LENGTH = 160
82
+ MAX_TIME_STEPS = 300
83
+
84
+ def prepare_spectrogram(audio_path):
85
+ """
86
+ Charge un fichier audio, calcule le Log-Mel Spectrogramme, et le prépare
87
+ pour le modèle.
88
+ """
89
+ # 1. Charger et Rééchantillonner
90
+ waveform, sr = torchaudio.load(audio_path)
91
+ if sr != SAMPLING_RATE:
92
+ resampler = torchaudio.transforms.Resample(orig_freq=sr, new_freq=SAMPLING_RATE)
93
+ waveform = resampler(waveform)
94
+
95
+ if waveform.shape[0] > 1:
96
+ waveform = torch.mean(waveform, dim=0, keepdim=True)
97
+
98
+ # 2. Calculer le Log-Mel Spectrogramme
99
+ mel_spectrogram_transform = torchaudio.transforms.MelSpectrogram(
100
+ sample_rate=SAMPLING_RATE,
101
+ n_fft=N_FFT,
102
+ hop_length=HOP_LENGTH,
103
+ n_mels=N_MELS,
104
+ )
105
+ mel_spectrogram = mel_spectrogram_transform(waveform.squeeze(0))
106
+ log_mel_spectrogram = torchaudio.transforms.AmplitudeToDB()(mel_spectrogram)
107
+
108
+ # 3. Tronquer
109
+ if log_mel_spectrogram.shape[1] > MAX_TIME_STEPS:
110
+ log_mel_spectrogram = log_mel_spectrogram[:, :MAX_TIME_STEPS]
111
+
112
+ # 4. Ajouter les dimensions Batch et Channel : [1, 1, N_MELS, Time_Steps]
113
+ input_tensor = log_mel_spectrogram.unsqueeze(0).unsqueeze(0)
114
+
115
+ return input_tensor
116
+
117
+
118
+ def predict_audio(model, audio_tensor):
119
+ """
120
+ Effectue la prédiction et retourne l'étiquette.
121
+ """
122
+ model.eval()
123
+ device = next(model.parameters()).device
124
+
125
+ with torch.no_grad():
126
+ audio_tensor = audio_tensor.to(device)
127
+ outputs = model(audio_tensor)
128
+
129
+ probabilities = F.softmax(outputs, dim=1)
130
+ predicted_index = torch.argmax(probabilities, dim=1).item()
131
+
132
+ # Décodeur des classes (assumant 0 = Calé, 1 = Décalé)
133
+ class_labels = {0: "Calé (On Beat)", 1: "Décalé (Off Beat)"}
134
+
135
+ return class_labels[predicted_index], probabilities[0].cpu().numpy()
136
+
137
+
138
+ # =============================================================================
139
+ # PARTIE 3 : CHARGEMENT DU MODÈLE ET EXÉCUTION DU TEST (CORRIGÉE)
140
+ # =============================================================================
141
+
142
+ # --- Configuration Hugging Face ---
143
+ REPO_ID = "Clemylia/Musica"
144
+ MODEL_FILENAME = "pytorch_model.bin"
145
+
146
+ # 1. Télécharger les poids du modèle
147
+ print(f"1. Téléchargement des poids du modèle depuis {REPO_ID}...")
148
+ try:
149
+ model_path = hf_hub_download(repo_id=REPO_ID, filename=MODEL_FILENAME)
150
+ except Exception as e:
151
+ print(f"Erreur de téléchargement : {e}. Vérifiez le nom du dépôt et les permissions.")
152
+ exit()
153
+
154
+ # 2. Charger le modèle
155
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
156
+ model = AudioClassifier()
157
+
158
+ try:
159
+ model.load_state_dict(torch.load(model_path, map_location=device))
160
+ model.to(device)
161
+ print(f"2. Modèle chargé avec succès sur {device}.")
162
+ except Exception as e:
163
+ print(f"Erreur lors du chargement des poids : {e}")
164
+ exit()
165
+
166
+ # 3. Préparer une donnée de test
167
+
168
+ # *** CORRECTION MAJEURE ***
169
+ # Veuillez remplacer le chemin ci-dessous par un chemin valide sur votre système !
170
+ # Exemple : "C:/Users/Clemylia/Desktop/mes_sons/calé_test.wav" ou "./data/audio_test.mp3"
171
+ # ----------------------------------------------------------------------------------
172
+ AUDIO_TEST_FILE = input("Veuillez entrer le chemin complet d'un fichier audio (ex: /path/to/test.wav): ")
173
+ # ----------------------------------------------------------------------------------
174
+
175
+ print(f"\n3. Préparation d'un échantillon de test à partir de: {AUDIO_TEST_FILE}...")
176
+
177
+ try:
178
+ input_tensor = prepare_spectrogram(AUDIO_TEST_FILE)
179
+ audio_test_path = AUDIO_TEST_FILE # Pour l'affichage final
180
+
181
+ except Exception as e:
182
+ print(f"Erreur lors de la préparation de l'échantillon de test (le fichier existe-t-il ? le format est-il pris en charge par torchaudio ?) : {e}")
183
+ input_tensor = None
184
+
185
+
186
+ # 4. Exécuter la prédiction
187
+ if input_tensor is not None:
188
+ print(f"\n4. Exécution de la prédiction sur l'échantillon...")
189
+
190
+ prediction, probabilities = predict_audio(model, input_tensor)
191
+
192
+ # Affichage des résultats
193
+ print("\n-------------------------------------------")
194
+ print(f"FICHIER TESTÉ: {audio_test_path}")
195
+ print(f"PRÉDICTION: {prediction}")
196
+ print(f"PROBABILITÉS: Calé={probabilities[0]:.4f}, Décalé={probabilities[1]:.4f}")
197
+ print("-------------------------------------------")
198
+ else:
199
+ print("Test annulé faute de pouvoir traiter le fichier audio.")
200
+ ```
201
+ ## ❤️🔥 Informations sur Musica
202
+
203
+ **nom** : Musica
204
+ **version** : 1 (entraînement sur un tout petit dataset)
205
+ **développeur** : Clemylia
206
+ **Tache** : détecter si une chanson est dans le rythme où pas
207
+
208
+ ❤️**amusez vous bien à détecter si vos chansons d'anniversaire, vos bruits de bouches, vos cover de chansons ou autre sont calé et si vous avez le rythme !**❤️