Logotipo de Zephyrnet

Análisis de las tasas de cruce por cero de diferentes pistas de género musical

Fecha:

Este artículo fue publicado como parte del Blogatón de ciencia de datos.

En este artículo, vamos a analizar las tasas de cruce por cero (ZCR) de diferentes pistas de géneros musicales. Este post está inspirado en el de Valerio Valerdo trabajo. Te animo mucho a que le eches un vistazo a su Canal de Youtube por su destacado trabajo en el campo de ML/DL para audio.

Herramientas utilizadas

  • Python
  • Librosa (librosa.feature.zero_crossing)
  • Un clip de audio de 30 segundos de cada uno de los 10 géneros musicales distintos (clásica, blues, reggae, rock, jazz, pop, hip-hop, country, disco y metal) de GTZAN datos

Introducción

No hay paso: Un cruce por cero es un punto instantáneo en el que el cambia el signo de una función matemática (por ejemplo, de positivo a negativo). Está representado por un intersección del eje (valor cero) en la gráfica de la función. 

Tasas de cruce por cero
Un cruce por cero en un gráfico de líneas de una forma de onda que representa el voltaje a lo largo del tiempo

 

Tasa de cruce por cero: La tasa de cruce por cero (ZCR) es la tasa a la que una señal pasa de positivo a cero a negativo o de negativo a cero a positivo. Su valor ha sido ampliamente utilizado tanto en reconocimiento de voz y recuperación de información musical para clasificar los sonidos de percusión.

ZCR se define como:

Tasas de cruce por cero | Fórmula

La tasa de cruce por cero se puede utilizar como un algoritmo de detección de tono básico para señales tonales monofónicas. La detección de actividad de voz (VAD), que determina si el habla humana está presente o no en un segmento de audio, también utiliza tasas de cruce por cero.

Ahora, echemos un vistazo más de cerca usando la biblioteca librosa. Para comenzar, importaremos todas las bibliotecas requeridas y cargaremos los archivos de audio de diferentes géneros musicales con la ayuda de librosa.

Un breve análisis usando Librosa

#Importación de todas las bibliotecas necesarias import matplotlib.pyplot as plt import numpy as np import librosa import librosa.display import IPython.display as ipd %matplotlib inline
#Especificación de la ruta a los archivos de audioclassic_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"
# cargar archivos de audio con librosa clásica, sr = librosa.load(archivo_musica_clasica, duracion=30) blues, _ = librosa.load(archivo_musica_blues,duracion=30) reggae, _ = librosa.load(archivo_musica_reggae, duracion=30) rock, _ = librosa.load(archivo_musica_rock, duracion=30) jazz, _ = librosa.load(archivo_musica_jazz, duracion=30) country,_ = librosa.load(archivo_musica_country, duracion=30) disco, _ = librosa.load(archivo_musica_disco, duración=30) hiphop, _ = librosa.load(archivo_musica_hiphop, duracion=30) metal, _ = librosa.load(archivo_musica_metal, duracion=30) pop, _ = librosa.load(archivo_musica_pop, duracion=30)

Después de eso, evaluaremos y compararemos el más bajo y el más alto. valores instantáneos de ZCR, así como el más bajo y el más alto valores medios de ZCR de varias muestras de géneros musicales.

#Determinación del género musical con el valor instantáneo más bajo 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()])

Salida: 0.00585 —> ¡que es para la pista del género musical Jazz!

#Determinación del género musical con el valor instantáneo más alto 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()])

Salida: 0.67675 —-> ¡pista de género de música pop!

#Determinación del género musical con el valor PROMEDIO MÁS BAJO de 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()])

Salida: 0.07846 —> ¡Pista de género de música jazz!

#Determinación del género musical con el valor PROMEDIO MÁS ALTO de 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()])

Salida: 0.18307 —> ¡Pista del género de música metal!

Además, en una investigación más profunda, se encontró que la pista de muestra de audio del género clásico tiene un ZCR bajo.

print(f"ZCR instantáneo mínimo para canción de género clásico:{librosa.feature.zero_crossing_rate(classical).min()}, ZCR instantáneo máximo para canción de género clásico:{librosa.feature.zero_crossing_rate(classical).max()}, ZCR promedio para una canción de género clásico: {librosa.feature.zero_crossing_rate(classical).mean()}")

Salida: ZCR instantáneo mínimo para canción de género clásico: 0.02685, ZCR instantáneo máximo para canción de género clásico: 0.1767, ZCR promedio para canción de género clásico: 0.0982

#Determinación del ZCR instantáneo mínimo, instantáneo máximo y promedio para la impresión de pista de género de música pop (f"ZCR instantáneo mínimo para canción de género pop: {librosa.feature.zero_crossing_rate(pop).min()}, ZCR instantáneo máximo para canción de género pop: {librosa.feature.zero_crossing_rate(pop).max()}, promedio de ZCR para canciones de género pop: {librosa.feature.zero_crossing_rate(pop).mean()}")

Salida: ZCR instantáneo mínimo para canción de género pop: 0.00683, ZCR instantáneo máximo para canción de género pop: 0.6767, ZCR medio para canción de género pop: 0.12676

Observación: De acuerdo con los resultados, la pista del género de música jazz tiene el ZCR instantáneo y promedio más bajo. Un análisis posterior reveló que incluso la canción del género de música clásica tiene valores de ZCR extremadamente bajos. Como resultado, no podemos generalizar y declarar que las canciones del género musical de jazz tienen el ZCR más bajo, porque la observación varía según la composición de la canción. Además, las pistas de muestra de audio de metal y música pop tienen el ZCR promedio más alto.

Desmitificación a través de la visualización

Desmitifiquemos ahora un poco más con la ayuda de imágenes. En este sentido, primero usaremos Librosa para extraer la tasa de cruce por cero para cada pista de género musical y luego trazaremos el ZCR normalizado para cada género musical, seguido del ZCR real (no normalizado) para cada género musical.

#Especificando el tamaño del marco y la longitud del salto
TAMAÑO_DE_CUADRO = 1024 LONGITUD_DE SALTO = 512
#Extracción de la tasa de cruce por cero para cada canción de género musical usando 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= TAMAÑO_CUADRO, longitud_salto=LONGITUD_SALTO)[0] zcr_hiphop = librosa.feature.zero_crossing_rate(hiphop, longitud_cuadro=TAMAÑO_CUADRO, longitud_salto=Longitud_salto)[0] zcr_metal = librosa.característica.tasa_cruce_cero(metal, longitud_cuadro=TAMAÑO_CUADRO) , hop_length=HOP_LENGTH)[0] zcr_pop = librosa.feature.zero_crossing_rate(pop, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0]
fotogramas = range(len(zcr_classical)) t = librosa.frames_to_time(frames, hop_length=HOP_LENGTH)
#Visualización de la tasa de cruce por cero (ZCR) normalizada de diferentes canciones de géneros musicales plt.figure(figsize=(20, 20))
ax = plt.subplot(5, 2, 1) librosa.display.waveplot(clásico, alpha=0.5) plt.plot(t, zcr_classical, color="b") plt.ylim((-1, 1)) plt .title("Canción del género de música clásica")
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 ("Canción del género 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 ("Canción del género 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 ("canción del género de música 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 ("Canción del género 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 ("Canción de género de música 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 ("Canción del género musical disco")
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("Canción del género musical Hiphop")
plt.subplot(5, 2, 9) librosa.display.waveplot(metal, alpha=0.5) plt.plot(t, zcr_metal, color="#FFB90F") plt.ylim((-1, 1)) plt. title("Canción del género de música metal")
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("Canción del género de música pop") plt.subplots_adjust(hspace = 0.75)
Tasas de cruce por cero
Gráficos de ondas que ilustran las tasas de cruce por cero de varias pistas de géneros musicales

#Visualización NORMALIZADO Tasas de cruce por cero de diferentes pistas de género 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)
Tasas de cruce por cero
Gráfico que representa las tasas de cruce por cero NORMALIZADAS de diferentes pistas de género musical

#Visualizando la tasa de cruce por cero REAL (NO NORMALIZADA) de diferentes pistas de género 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*TAMAÑO_FOTOGRAMA, color="k") plt.plot(t, zcr_rock*TAMAÑO_FOTOGRAMA, color="#E9967A") plt.plot(t, zcr_jazz*TAMAÑO_FOTOGRAMA, color="m") plt.plot(t, zcr_country *TAMAÑO_CUADRO, color="y") plt.plot(t, zcr_disco*TAMAÑO_CUADRO, color="r") plt.plot(t, zcr_hiphop*TAMAÑO_CUADRO, color="#7FFF00") plt.plot(t, zcr_metal* TAMAÑO_CUADRO, color="#FFB90F") plt.plot(t, zcr_pop*TAMAÑO_CUADRO, color="#458B00") plt.ylim(0, 600)
Tasas de cruce por cero
Gráfico que representa las tasas de cruce por cero REALES (NO NORMALIZADAS) de diferentes pistas de género musical

Conclusión

Tras una inspección matemática y visual, podemos decir que las canciones de los géneros de música clásica y jazz tienen valores bajos de ZCR. Y las canciones de los géneros musicales Pop y Metal tienen un alto ZCR. Sin embargo, no podemos extrapolar estos hallazgos a todo el grupo en base al pequeño tamaño de la muestra. El análisis anterior, por otro lado, puede ofrecernos un resumen conciso, una forma de intuición, sobre distintos tipos de géneros musicales.

Gracias por leer. Si tiene alguna pregunta o inquietud, déjela en la sección de comentarios a continuación. Feliz ¡Aprendizaje!

Lea más artículos en nuestro blog.

Enlace al repositorio de GitHub: Haga clic aquí!

Referencias: 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

Los medios que se muestran en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor. 

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

punto_img

café vc

vidacienciav

Información más reciente

punto_img