Dit artikel is gepubliceerd als onderdeel van het Data Science-blogathon.
In dit artikel gaan we de Zero-crossing-percentages (ZCR's) van verschillende muziekgenres analyseren. Dit bericht is geïnspireerd op dat van Valerio Valerdo werk. Ik moedig je ten zeerste aan om de zijne te bekijken Youtube kanaal voor zijn uitmuntende werk op het gebied van ML/DL voor audio.
Gebruikte tools
- Python
- Librosa (librosa.feature.zero_crossing)
- Eén audiofragment van 30 seconden uit elk van de 10 verschillende muziekgenres (klassiek, blues, reggae, rock, jazz, pop, hiphop, country, disco en metal) uit GTZAN dataset
Introductie
Nuldoorgang: Een nuldoorgang is een momentaan punt waarop de teken van een wiskundige functie verandert (bijvoorbeeld van positief naar negatief). Het wordt vertegenwoordigd door een snijpunt van de as (nulwaarde) in de grafiek van de functie.
Nuldoorgangspercentage: De nuldoorgangssnelheid (ZCR) is de snelheid waarmee een signaal overgaat van positief naar nul naar negatief of van negatief naar nul naar positief. De waarde ervan is in beide gevallen op grote schaal gebruikt spraakherkenning en muziek informatie ophalen voor het classificeren van percussiegeluiden.
ZCR wordt gedefinieerd als:
De nuldoorgangssnelheid kan worden gebruikt als een basisalgoritme voor toonhoogtedetectie voor monofone toonsignalen. Voice Activity Detection (VAD), die bepaalt of er al dan niet menselijke spraak aanwezig is in een audiosegment, maakt ook gebruik van zero-crossing rates.
Laten we het nu eens nader bekijken met behulp van de librosa-bibliotheek. Om te beginnen zullen we alle benodigde bibliotheken importeren en de audiobestanden van verschillende muziekgenres laden met behulp van librosa.
Een korte analyse met Librosa
#Importeren van alle benodigde bibliotheken importeer matplotlib.pyplot als plt importeer numpy als np import librosa import librosa.display importeer IPython.display als ipd %matplotlib inline
#Specificatie van het pad naar audiobestanden classic_music_file = "/content/drive/MyDrive/trytheseaudios/classical.00000.wav" blues_music_file = "/content/drive/MyDrive/trytheseaudios/blues.00000.wav" reggae_music_file = "/content/drive /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"
# audiobestanden laden met librosa klassiek, sr = librosa.load(klassieke_muziek_bestand, duur=30) blues, _ = librosa.load(blues_muziek_bestand,duur=30) reggae, _ = librosa.load(reggae_muziek_bestand, duur=30) rock, _ = librosa.load(rock_muziekbestand, duur=30) jazz, _ = librosa.load(jazz_muziekbestand, duur=30) country,_ = librosa.load(country_muziekbestand, duur=30) disco, _ = librosa.load(disco_muziekbestand, duur=30) hiphop, _ = librosa.load(hiphop_muziekbestand, duur=30) metal, _ = librosa.load(metal_muziekbestand, duur=30) pop, _ = librosa.load(pop_muziekbestand, duur=30)
Daarna zullen we de laagste en de hoogste evalueren en vergelijken momentane ZCR-waarden, zowel de laagste als de hoogste gemiddelde ZCR-waarden van verschillende muziekgenre-samples.
#Bepalen van het muziekgenre met de laagste onmiddellijke waarde van 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()])
Output: 0.00585 —> dat is voor het jazzmuziekgenrenummer!
#Bepalen van het muziekgenre met de hoogste momentane waarde van 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()])
Output: 0.67675 —-> popmuziekgenretrack!
#Bepalen van het muziekgenre met de LAAGSTE GEMIDDELDE waarde van ZCR min([librosa.feature.zero_crossing_rate(classical).mean(), librosa.feature.zero_crossing_rate(blues).mean(), librosa.feature.zero_crossing_rate(reggae). mean(), 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()])
Output: 0.07846 —> Jazzmuziekgenretrack!
#Bepalen van het muziekgenre met de HOOGSTE GEMIDDELDE waarde van ZCR max([librosa.feature.zero_crossing_rate(classical).mean(), librosa.feature.zero_crossing_rate(blues).mean(), librosa.feature.zero_crossing_rate(reggae). mean(), 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()])
Output: 0.18307 —> Metalmuziekgenretrack!
Bij verder onderzoek bleek ook dat de audiovoorbeeldtrack van het klassieke genre een lage ZCR heeft.
print(f"Minimale onmiddellijke ZCR voor nummer uit het klassieke genre:{librosa.feature.zero_crossing_rate(classical).min()}, Maximale onmiddellijke ZCR voor nummer uit het klassieke genre:{librosa.feature.zero_crossing_rate(classical).max()}, Gemiddelde ZCR voor nummer uit het klassieke genre: {librosa.feature.zero_crossing_rate(classical).mean()}")
Output: Minimale onmiddellijke ZCR voor nummer uit het klassieke genre: 0.02685, Maximale onmiddellijke ZCR voor nummer uit het klassieke genre: 0.1767, Gemiddelde ZCR voor nummer uit het klassieke genre: 0.0982
#Determining Minimale onmiddellijke, maximale onmiddellijke en gemiddelde ZCR voor popmuziekgenretrack print(f"Minimum onmiddellijke ZCR voor popgenrenummer:{librosa.feature.zero_crossing_rate(pop).min()}, maximale onmiddellijke ZCR voor popgenrenummer: {librosa.feature.zero_crossing_rate(pop).max()}, gemiddelde ZCR voor popgenrenummer: {librosa.feature.zero_crossing_rate(pop).mean()}")
Output: Minimale onmiddellijke ZCR voor popgenrenummer: 0.00683, maximale onmiddellijke ZCR voor popgenrenummer: 0.6767, gemiddelde ZCR voor popgenrenummer: 0.12676
Observation: Volgens de resultaten heeft het jazzgenrenummer de laagste momentane en gemiddelde ZCR. Uit verdere analyse bleek dat zelfs het klassieke muziekgenre extreem lage ZCR-waarden heeft. Als gevolg hiervan kunnen we niet generaliseren en verklaren dat nummers uit het jazzmuziekgenre de laagste ZCR hebben, omdat de observatie varieert afhankelijk van de compositie van het nummer. Bovendien hebben de audiovoorbeeldtracks van metal en popmuziek de hoogste gemiddelde ZCR.
Demystificatie via visualisatie
Laten we nu wat meer demystificeren met behulp van beelden. In dit opzicht zullen we eerst Librosa gebruiken om het nuldoorgangspercentage voor elk muziekgenrenummer te extraheren, en vervolgens de genormaliseerde ZCR voor elk muziekgenre uitzetten, gevolgd door de feitelijke (niet-genormaliseerde) ZCR voor elk muziekgenre.
#Specificatie van framegrootte en spronglengte
FRAME_SIZE = 1024 HOP_LENGTE = 512
#Extraheren van nuldoorgangssnelheid voor elk muziekgenrenummer met 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(metal, 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 = bereik(len(zcr_classical)) t = librosa.frames_to_time(frames, hop_length=HOP_LENGTH)
#Visualiseren van de genormaliseerde Zero-crossing-snelheid (ZCR) van nummers uit verschillende muziekgenres plt.figure(figsize=(20, 20))
ax = plt.subplot(5, 2, 1) librosa.display.waveplot(klassiek, alpha=0.5) plt.plot(t, zcr_klassiek, kleur = "b") plt.ylim((-1, 1)) plt .title("Klassiek muziekgenrenummer")
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 ("Bluesmuziekgenrenummer")
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 ("Reggaemuziekgenrenummer")
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("Rockmuziekgenrenummer")
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 ("Jazzmuziekgenrenummer")
plt.subplot(5, 2, 6) librosa.display.waveplot(land, alpha=0.5) plt.plot(t, zcr_country, color="y") plt.ylim((-1, 1)) plt.title ("Countrymuziekgenrenummer")
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 ("Discomuziekgenrenummer")
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("Hiphopmuziekgenrenummer")
plt.subplot(5, 2, 9) librosa.display.waveplot(metaal, alpha=0.5) plt.plot(t, zcr_metal, color="#FFB90F") plt.ylim((-1, 1)) plt. title("Metal muziekgenrenummer")
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("Popmuziekgenrenummer") plt.subplots_adjust(hspace = 0.75)
#Visualiseren GENORMALISEERD Zero-crossing-snelheden van verschillende muziekgenres
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, kleur = "#458B00") plt.ylim(0, 1)
#Visualiseren van WERKELIJK (NIET-GENORMALISEERD) Nuldoorgangspercentage van verschillende muziekgenres
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, kleur = "y") plt.plot(t, zcr_disco*FRAME_SIZE, kleur = "r") plt.plot(t, zcr_hiphop*FRAME_SIZE, kleur = "#7FFF00") plt.plot(t, zcr_metal* FRAME_SIZE, kleur = "#FFB90F") plt.plot (t, zcr_pop * FRAME_SIZE, kleur = "#458B00") plt.ylim (0, 600)
Conclusie
Bij wiskundige en visuele inspectie kunnen we zeggen dat de nummers uit het jazz- en klassieke muziekgenre lage ZCR-waarden hebben. En nummers uit pop- en metalmuziekgenres hebben een hoge ZCR. We kunnen deze bevindingen echter niet extrapoleren naar de hele groep op basis van de kleine steekproefomvang. De voorgaande analyse daarentegen kan ons een beknopte samenvatting bieden, een vorm van intuïtie, over verschillende soorten muziekgenres.
Bedankt voor het lezen. Als u vragen of opmerkingen heeft, kunt u deze achterlaten in het opmerkingenveld hieronder. Gelukkig Aan het leren!
Lees meer artikelen op onze blog.
Link naar GitHub-repository: Klik hier!
Referenties: 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
De in dit artikel getoonde media zijn geen eigendom van Analytics Vidhya en worden naar goeddunken van de auteur gebruikt.