Logo Zéphyrnet

Analyse des taux de passage à zéro de différentes pistes de genre musical

Date :

Cet article a été publié dans le cadre du Blogathon sur la science des données.

Dans cet article, nous allons analyser les taux de passage à zéro (ZCR) de différents morceaux de genre musical. Ce billet est inspiré de celui de Valerio Valerdo actuellement. Je vous encourage vivement à consulter son la chaîne Youtube pour son travail exceptionnel dans le domaine du ML/DL pour l'audio.

Les outils utilisés

  • Python
  • Librosa (librosa.feature.zero_crossing)
  • Un clip audio de 30 secondes de chacun des 10 genres musicaux distincts (classique, blues, reggae, rock, jazz, pop, hip-hop, country, disco et métal) de GTZAN jeu de données

Introduction

Passage à zéro: Un passage par zéro est un point instantané auquel le le signe d'une fonction mathématique change (par exemple de positif à négatif). Il est représenté par un interception de l'axe (valeur nulle) dans le graphique de la fonction. 

Taux de passage à zéro
Un passage par zéro dans un graphique linéaire d'une forme d'onde représentant la tension dans le temps

 

Taux de passage à zéro : Le taux de passage par zéro (ZCR) est le taux auquel un signal passe de positif à zéro à négatif ou de négatif à zéro à positif. Sa valeur a été largement utilisée dans les deux reconnaissance de la parole et récupération d'informations musicales pour classer les sons percussifs.

Le ZCR est défini comme :

Taux de passage à zéro | Formule

Le taux de passage par zéro peut être utilisé comme algorithme de détection de hauteur de base pour les signaux tonals monophoniques. La détection d'activité vocale (VAD), qui détermine si la parole humaine est présente ou non dans un segment audio, utilise également des taux de passage par zéro.

Maintenant, regardons-le de plus près en utilisant la bibliothèque librosa. Pour commencer, nous allons importer toutes les bibliothèques requises et charger les fichiers audio de différents genres musicaux à l'aide de librosa.

Une brève analyse à l'aide de Librosa

#Importation de toutes les bibliothèques nécessaires import matplotlib.pyplot as plt import numpy as np import librosa import librosa.display import IPython.display as ipd %matplotlib inline
#Spécifier le chemin d'accès aux fichiers audio. /MyDrive/trytheseaudios/reggae.00000.wav" rock_music_file = "/content/drive/MyDrive/trytheseaudios/rock.00000.wav" jazz_music_file = "/content/drive/MyDrive/trytheseaudios/jazz.00000.wav" country_music_file =" /content/drive/MyDrive/trytheseaudios/country.00000.wav" disco_music_file = "/content/drive/MyDrive/trytheseaudios/disco.00000.wav" hiphop_music_file = "/content/drive/MyDrive/trytheseaudios/hiphop.00000.wav " metal_music_file = "/content/drive/MyDrive/trytheseaudios/metal.00000.wav" pop_music_file = "/content/drive/MyDrive/trytheseaudios/pop.00000.wav"
# charger des fichiers audio avec librosa classique, sr = librosa.load(classical_music_file, duration=30) blues, _ = librosa.load(blues_music_file,duration=30) reggae, _ = librosa.load(reggae_music_file, duration=30) rock, _ = librosa.load(rock_music_file, durée=30) jazz, _ = librosa.load(jazz_music_file, durée=30) pays,_ = librosa.load(country_music_file, durée=30) disco, _ = librosa.load(disco_music_file, durée=30) hiphop, _ = librosa.load(hiphop_music_file, durée=30) métal, _ = librosa.load(metal_music_file, durée=30) pop, _ = librosa.load(pop_music_file, durée=30)

Ensuite, nous évaluerons et comparerons les prix les plus bas et les plus élevés. valeurs ZCR instantanées, ainsi que le plus bas et le plus haut valeurs ZCR moyennes de divers échantillons de genres musicaux.

#Déterminer le genre musical avec la valeur instantanée la plus basse de ZCR min([librosa.feature.zero_crossing_rate(classical).min(), librosa.feature.zero_crossing_rate(blues).min(), librosa.feature.zero_crossing_rate(reggae). min(), librosa.feature.zero_crossing_rate(rock).min(), librosa.feature.zero_crossing_rate(jazz).min(), librosa.feature.zero_crossing_rate(country).min(), librosa.feature.zero_crossing_rate(disco ).min(), librosa.feature.zero_crossing_rate(hiphop).min(), librosa.feature.zero_crossing_rate(metal).min(), librosa.feature.zero_crossing_rate(pop).min()])

Sortie : 0.00585 -> qui est pour la piste de genre musical Jazz !

#Déterminer le genre musical avec la valeur instantanée la plus élevée de ZCR max([librosa.feature.zero_crossing_rate(classical).max(), librosa.feature.zero_crossing_rate(blues).max(), librosa.feature.zero_crossing_rate(reggae). max(), librosa.feature.zero_crossing_rate(rock).max(), librosa.feature.zero_crossing_rate(jazz).max(), librosa.feature.zero_crossing_rate(country).max(), librosa.feature.zero_crossing_rate(disco ).max(), librosa.feature.zero_crossing_rate(hiphop).max(), librosa.feature.zero_crossing_rate(metal).max(), librosa.feature.zero_crossing_rate(pop).max()])

Sortie : 0.67675 —-> piste de genre de musique pop !

#Déterminer le genre musical avec la valeur MOYENNE LA PLUS BASSE de ZCR min([librosa.feature.zero_crossing_rate(classical).mean(), librosa.feature.zero_crossing_rate(blues).mean(), librosa.feature.zero_crossing_rate(reggae). moyenne(), librosa.feature.zero_crossing_rate(rock).mean(), librosa.feature.zero_crossing_rate(jazz).mean(), librosa.feature.zero_crossing_rate(country).mean(), librosa.feature.zero_crossing_rate(disco ).mean(), librosa.feature.zero_crossing_rate(hiphop).mean(), librosa.feature.zero_crossing_rate(metal).mean(), librosa.feature.zero_crossing_rate(pop).mean()])

Sortie : 0.07846 -> Piste de genre de musique jazz !

#Déterminer le genre musical avec la valeur MOYENNE LA PLUS ÉLEVÉE de ZCR max([librosa.feature.zero_crossing_rate(classical).mean(), librosa.feature.zero_crossing_rate(blues).mean(), librosa.feature.zero_crossing_rate(reggae). moyenne(), librosa.feature.zero_crossing_rate(rock).mean(), librosa.feature.zero_crossing_rate(jazz).mean(), librosa.feature.zero_crossing_rate(country).mean(), librosa.feature.zero_crossing_rate(disco ).mean(), librosa.feature.zero_crossing_rate(hiphop).mean(), librosa.feature.zero_crossing_rate(metal).mean(), librosa.feature.zero_crossing_rate(pop).mean()])

Sortie : 0.18307 -> Piste de genre de musique métal !

De plus, après une enquête plus approfondie, il a été constaté que la piste d'échantillon audio de genre classique a un faible ZCR.

print(f"ZCR instantané minimum pour une chanson de genre classique :{librosa.feature.zero_crossing_rate(classical).min()}, ZCR instantané maximum pour une chanson de genre classique :{librosa.feature.zero_crossing_rate(classical).max()}, ZCR moyen pour une chanson de genre classique : {librosa.feature.zero_crossing_rate(classical).mean()}")

Sortie : ZCR instantané minimum pour une chanson de genre classique : 0.02685, ZCR instantané maximum pour une chanson de genre classique : 0.1767, ZCR moyen pour une chanson de genre classique : 0.0982

#Détermination du ZCR instantané minimum, instantané maximum et moyen pour une piste de genre de musique pop print(f"ZCR instantané minimum pour une chanson de genre pop :{librosa.feature.zero_crossing_rate(pop).min()}, ZCR instantané maximum pour une chanson de genre pop : {librosa.feature.zero_crossing_rate(pop).max()}, ZCR moyen pour une chanson de genre pop : {librosa.feature.zero_crossing_rate(pop).mean()}")

Sortie : ZCR instantané minimum pour une chanson de genre pop : 0.00683, ZCR instantané maximum pour une chanson de genre pop : 0.6767, ZCR moyen pour une chanson de genre pop : 0.12676

Observation: Selon les résultats, la piste de genre musical jazz a le ZCR instantané et moyen le plus bas. Une analyse plus approfondie a révélé que même la chanson de genre de musique classique a des valeurs ZCR extrêmement faibles. En conséquence, nous ne pouvons pas généraliser et déclarer que les chansons de genre musical jazz ont le ZCR le plus bas, car l'observation varie en fonction de la composition de la chanson. De plus, les pistes d'échantillons audio de musique métal et pop ont le ZCR moyen le plus élevé.

Démystification via la visualisation

Démystifions maintenant un peu plus à l'aide de visuels. À cet égard, nous utiliserons d'abord Librosa pour extraire le taux de passage par zéro pour chaque piste de genre musical, puis tracerons le ZCR normalisé pour chaque genre musical, suivi du ZCR réel (non normalisé) pour chaque genre musical.

#Spécification de la taille de trame et de la longueur de saut
FRAME_SIZE = 1024 HOP_LENGTH = 512
#Extraction du taux de passage à zéro pour chaque chanson de genre musical à l'aide de Librosa zcr_classical = librosa.feature.zero_crossing_rate(classical, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0] zcr_blues = librosa.feature.zero_crossing_rate(blues, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH )[0] zcr_reggae = librosa.feature.zero_crossing_rate(reggae, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0] zcr_rock = librosa.feature.zero_crossing_rate(rock, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0] zcr_jazz = librosa. feature.zero_crossing_rate(jazz, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0] zcr_country = librosa.feature.zero_crossing_rate(country, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0] zcr_disco = librosa.feature.zero_crossing_rate(disco, frame_length= FRAME_SIZE, hop_length=HOP_LENGTH)[0] zcr_hiphop = librosa.feature.zero_crossing_rate(hiphop, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0] zcr_metal = librosa.feature.zero_crossing_rate(métal, frame_length=FRAME_SIZE , hop_length=HOP_LENGTH)[0] zcr_pop = librosa.feature.zero_crossing_rate(pop, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0]
frames = range(len(zcr_classical)) t = librosa.frames_to_time(frames, hop_length=HOP_LENGTH)
#Visualisation du taux de passage à zéro normalisé (ZCR) de différentes chansons de genre musical plt.figure(figsize=(20, 20))
ax = plt.subplot(5, 2, 1) librosa.display.waveplot(classique, alpha=0.5) plt.plot(t, zcr_classical, color="b") plt.ylim((-1, 1)) plt .title("Chanson de genre de musique classique")
plt.subplot(5, 2, 2) librosa.display.waveplot(blues, alpha=0.5) plt.plot(t, zcr_blues, color="g") plt.ylim((-1, 1)) plt.title ("Chanson du genre musical Blues")
plt.subplot(5, 2, 3) librosa.display.waveplot(reggae, alpha=0.5) plt.plot(t, zcr_reggae, color="k") plt.ylim((-1, 1)) plt.title (" Chanson du genre musical reggae ")
plt.subplot(5, 2, 4) librosa.display.waveplot(rock, alpha=0.5) plt.plot(t, zcr_rock, color="#E9967A") plt.ylim((-1, 1)) plt. title("Chanson du genre musical rock")
plt.subplot(5, 2, 5) librosa.display.waveplot(jazz, alpha=0.5) plt.plot(t, zcr_jazz, color="m") plt.ylim((-1, 1)) plt.title (" Chanson du genre musical jazz ")
plt.subplot(5, 2, 6) librosa.display.waveplot(country, alpha=0.5) plt.plot(t, zcr_country, color="y") plt.ylim((-1, 1)) plt.title ("Chanson de genre de musique country")
plt.subplot(5, 2, 7) librosa.display.waveplot(disco, alpha=0.5) plt.plot(t, zcr_disco, color="r") plt.ylim((-1, 1)) plt.title ("Chanson Disco Music Genre")
plt.subplot(5, 2, 8) librosa.display.waveplot(hiphop, alpha=0.5) plt.plot(t, zcr_hiphop, color="#7FFF00") plt.ylim((-1, 1)) plt. title("Hiphop Musique Genre chanson")
plt.subplot(5, 2, 9) librosa.display.waveplot(métal, alpha=0.5) plt.plot(t, zcr_metal, color="#FFB90F") plt.ylim((-1, 1)) plt. title("Metal Music Genre song")
plt.subplot(5, 2, 10) librosa.display.waveplot(pop, alpha=0.5) plt.plot(t, zcr_pop, color="#458B00") plt.ylim((-1, 1)) plt. title("Chanson de genre de musique pop") plt.subplots_adjust(hspace = 0.75)
Taux de passage à zéro
Waveplots illustrant les taux de passage par zéro de divers morceaux de genre musical

#Visualisation des taux de passage à zéro NORMALISÉS de différentes pistes de genre musical

plt.figure(figsize=(25, 25)) plt.plot(t, zcr_classical, color="b") plt.plot(t, zcr_blues, color="g") plt.plot(t, zcr_reggae, color= "k") plt.plot(t, zcr_rock, color="#E9967A") plt.plot(t, zcr_jazz, color="m") plt.plot(t, zcr_country, color="y") plt.plot (t, zcr_disco, color="r") plt.plot(t, zcr_hiphop, color="#7FFF00") plt.plot(t, zcr_metal, color="#FFB90F") plt.plot(t, zcr_pop, color ="#458B00") plt.ylim(0, 1)
Taux de passage à zéro
Graphique illustrant les taux de passage à zéro NORMALISÉS de différentes pistes de genre musical

# Visualisation du taux de passage à zéro RÉEL (NON NORMALISÉ) de différentes pistes de genre musical

plt.figure(figsize=(25, 25)) plt.plot(t, zcr_classical*FRAME_SIZE, color="b") plt.plot(t, zcr_blues*FRAME_SIZE, color="g") plt.plot(t, zcr_reggae*FRAME_SIZE, color="k") plt.plot(t, zcr_rock*FRAME_SIZE, color="#E9967A") plt.plot(t, zcr_jazz*FRAME_SIZE, color="m") plt.plot(t, zcr_country *FRAME_SIZE, color="y") plt.plot(t, zcr_disco*FRAME_SIZE, color="r") plt.plot(t, zcr_hiphop*FRAME_SIZE, color="#7FFF00") plt.plot(t, zcr_metal* FRAME_SIZE, color="#FFB90F") plt.plot(t, zcr_pop*FRAME_SIZE, color="#458B00") plt.ylim(0, 600)
Taux de passage à zéro
Graphique illustrant les taux de passage à zéro RÉELS (NON NORMALISÉS) de différentes pistes de genre musical

Conclusion

Après inspection mathématique et visuelle, nous pouvons dire que les chansons de genre jazz et musique classique ont de faibles valeurs ZCR. Et les chansons de genre musical Pop et Metal ont un ZCR élevé. Cependant, nous ne pouvons pas extrapoler ces résultats à l'ensemble du groupe en raison de la petite taille de l'échantillon. L'analyse qui précède, en revanche, peut nous offrir un résumé concis, une forme d'intuition, sur des types distincts de genres musicaux.

Merci d'avoir lu. Si vous avez des questions ou des préoccupations, veuillez les laisser dans la section des commentaires ci-dessous. Joyeux Apprentissage!

Lire plus d'articles sur notre blogue.

Lien vers le dépôt GitHub : Cliquez ici!

Références: 1. https://www.youtube.com/watch?v=EycaSbIRx-0&t=1352s

2. https://en.wikipedia.org/wiki/Zero_crossing

3. https://en.wikipedia.org/wiki/Zero-crossing_rate

Les médias présentés dans cet article n'appartiennent pas à Analytics Vidhya et sont utilisés à la discrétion de l'auteur. 

Source : https://www.analyticsvidhya.com/blog/2022/01/analysis-of-zero-crossing-rates-of-different-music-genre-tracks/

spot_img

Dernières informations

spot_img

Discutez avec nous

Salut! Comment puis-je t'aider?