Skip to content

Commit d1b38bf

Browse files
author
Vincent Timofti
committed
rapport update
1 parent 062de0f commit d1b38bf

File tree

7 files changed

+49
-15
lines changed

7 files changed

+49
-15
lines changed

build_db_shazam.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
if os.path.isfile(current_dir + "/database.sqlite"):
1313
os.remove(current_dir + "/database.sqlite")
1414

15-
database = Database()
15+
database = Database('database.sqlite')
1616
database.create()
1717

1818
for file in os.listdir(music_dir):

db.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
class Database:
44

5-
def __init__(self):
6-
self.connection = sqlite3.connect('database.sqlite')
5+
def __init__(self, filename):
6+
self.connection = sqlite3.connect(filename)
77
self.connection.text_factory = str
88
self.cursor = self.connection.cursor()
99

exp1.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@
1717

1818
# Music library
1919
current_dir = os.path.dirname(os.path.abspath(__file__))
20-
music_dir = current_dir + "/music"
20+
music_dir = current_dir + "/music_modif1"
2121
music_list = []
2222
for file in os.listdir(music_dir):
2323
if file.endswith(".mp3"):
2424
music_list.append(file)
2525

2626
shaz = Shazam(100)
2727

28-
duration = 0.2
28+
duration = 2
2929

3030
# pour chaque musique de la bdd on prend 3 extraits
3131
extracts_k = [1./4, 2./4, 3./4]

rapport/images/shazam4.png

38 KB
Loading

rapport/images/shazam5.png

33.3 KB
Loading

rapport/rapport.tex

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ \subsection{Couplage des pics}
206206
\subsection{Construction de la base de données}
207207

208208
Pour chaque musique de notre bibliothèque musicale (100 musiques), nous appliquons les méthodes précédentes et extrayons les clés, que nous enregistrons dans la base de données. Le processus est répété 5 fois, tout en faisant varier le seuil d (seuil de distance admissible entre les pics). Nous obtenons pour la méthode Shazam 5 base de données distinctes :
209+
\vspace{0.4cm}
209210

210211
\begin{tabular}{|c|c|c|}
211212
\hline
@@ -222,15 +223,44 @@ \subsection{Couplage des pics}
222223
5 & 100,2 & 102,8 \\
223224
\hline
224225
\end{tabular}
226+
\vspace{0.4cm}
225227

226-
La construction de la base de données pour 100 musique (et pour une durée totale de 8,1 heures de musique) prend entre 12 et 15 minutes.
228+
La construction d'une base de données pour 100 musique (et pour une durée totale de 8,1 heures de musique) prend entre 12 et 15 minutes.
227229

228-
%\emph{italique}
229-
%\textbf{gras}
230-
%\begin{itemize}
231-
% \item élément 1
232-
% \item élément 2
233-
%\end{itemize}
230+
\subsection{Efficacité de la méthode Shazam}
231+
232+
La première expérimentation consiste à prendre 3 extraits de durée variable pour chaque musique de notre bibliothèque musicale et de les tester sur chaque base de données.
233+
234+
\begin{figure}[htbp]
235+
\center
236+
\includegraphics[width=13cm]{shazam4.png}
237+
\caption{Expérimentation de la méthode Shazam sur des extraits non modifiés}
238+
\label{test1shaz}
239+
\end{figure}
240+
241+
On remarque (\ref{test1shaz}) que notre implémentation assure un taux de reconnaissance musicale supérieure à 99\% lorsque les extraits sont d'une durée supérieure à 2 secondes. Ce taux est de 100\% pour des extraits de 5 secondes. Les performances entre les différentes bases de données se valent, mais il est évident que plus le nombre de clés par seconde est grand, plus le taux de reconnaissance le sera aussi.
242+
\vspace{0.4cm}
243+
244+
Pour la deuxième expérimentation la bibliothèque musicale est modifiée de la façon suivante : on ajoute à chaque musique du bruit blanc ($\sigma^2=0.005$), de la réverberation et un applique un passe-haut (fréquence de coupure : 500 Hz) de façon à obtenir un effet microphone. Ces modifications sont réalisées avec l'outil en ligne de commande SoX :
245+
246+
\texttt{sox input\_file.wav ouput\_file.wav highpass 500 reverb whitenoise vol 0.005}
247+
248+
Nous effectuons ensuite des tests identifques à la première expérimentation mais sur la bibliothèque modifiée.
249+
250+
\begin{figure}[htbp]
251+
\center
252+
\includegraphics[width=13cm]{shazam5.png}
253+
\caption{Expérimentation de la méthode Shazam sur des extraits modifiés}
254+
\label{test2shaz}
255+
\end{figure}
256+
257+
Cette fois-ci (\ref{test2shaz}), on assure un taux de reconnaissance de 100\% lorsque les extraits sont d'une durée supérieur à 10 secondes (sauf pour la base de donnée n°1).
258+
\vspace{0.4cm}
259+
260+
De ces deux expérimentations nous pouvons choisir un nombre de clés par seconde satisfaisant pour la construction de la base de données. La base de données n°1 (22,6 clés/seconde) est exclue, car on remarque que sa courbe de taux de reconnaissance se démarque trop des autres. Les autres bases ont des performances semblables, et comme le poids de la base de données est important (il faut imaginer une application réelle avec une bibliothèque musicale comportant des millions de titres), on choisit la base la plus légère : la base n°2 (39,6 clés/seconde).
261+
\vspace{0.4cm}
262+
263+
En conclusion, le valeur de \textbf{40 clés par seconde} semble être un bon compromis pour la construction d'une base de donnée avec la méthode Shazam
234264

235265

236266
\end{document}

shazam.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,15 @@ def __init__(self, max_distance, window_size = 1024, frame_duration = 5):
1111
self.min_real = 0.0000000001
1212
self.max_distance = max_distance
1313

14-
def processTrack(self, wavdata):
14+
def processTrack(self, wavdata, forced_lenght = -1):
1515

1616
fs = wavdata.getframerate()
17-
track_size = wavdata.getnframes()
17+
18+
if forced_lenght == -1:
19+
track_size = wavdata.getnframes()
20+
else:
21+
track_size = forced_lenght
22+
1823
frame_size = fs * self.frame_duration
1924
frame_number = int(track_size / frame_size)
2025
total_pairs = []
@@ -39,7 +44,6 @@ def processTrack(self, wavdata):
3944

4045
return total_pairs
4146

42-
4347
def spectrogram(self, x):
4448

4549
window_number = int((x.size - self.window_size) / self.hop)

0 commit comments

Comments
 (0)