제퍼넷 로고

다양한 음악 장르의 제로 크로싱 레이트 분석

시간

이 기사는 데이터 과학 Blogathon.

이 기사에서는 다양한 음악 장르 트랙의 ZCR(Zero-crossing rate)을 분석할 것입니다. 이 게시물은 Valerio Valerdo의 영감을 받았습니다. . 나는 당신이 그의 유튜브 채널 오디오용 ML/DL 분야에서 뛰어난 업적을 인정받았습니다.

사용되는 도구

  • Python
  • 천칭자리(librosa.feature.zero_crossing)
  • 30개의 고유한 음악 장르(클래식, 블루스, 레게, 록, 재즈, 팝, 힙합, 컨트리, 디스코, 메탈) 각각의 10초 오디오 클립 XNUMX개 GTZAN 데이터 세트

개요

제로 크로싱: 제로 크로싱(Zero-Crossing)은 수학 함수의 부호가 변경됩니다(예: 양수에서 음수로). 로 표현된다 축의 절편 (영 값) 함수의 그래프. 

제로 교차율
시간에 따른 전압을 나타내는 파형의 선 그래프에서 제로 크로싱

 

제로 크로싱 비율: ZCR(제로 크로싱 속도)은 신호가 양수에서 XNUMX으로, 음수에서 XNUMX으로, 양수로 전환되는 속도입니다. 그 가치는 두 가지 모두에서 광범위하게 사용되었습니다. 음성 인식음악 정보 검색 타악기 소리를 분류합니다.

ZCR은 다음과 같이 정의됩니다.

제로 교차 비율 | 공식

제로 크로싱 레이트는 모노포닉 톤 신호에 대한 기본 피치 감지 알고리즘으로 활용될 수 있습니다. 오디오 세그먼트에 사람의 음성이 있는지 여부를 결정하는 VAD(음성 활동 감지)도 제로 크로싱 속도를 사용합니다.

이제 librosa 라이브러리를 사용하여 자세히 살펴보겠습니다. 시작하려면 필요한 모든 라이브러리를 가져오고 librosa를 사용하여 다양한 음악 장르의 오디오 파일을 로드합니다.

Librosa를 사용한 간략한 분석

# 필요한 모든 라이브러리 가져오기 import matplotlib.pyplot as plt import numpy as np import librosa import librosa.display import IPython.display as ipd %matplotlib 인라인
#오디오 파일 경로 지정 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"
# librosa classic으로 오디오 파일 로드, 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, duration=30) 재즈, _ = librosa.load(jazz_music_file, duration=30) 국가,_ = librosa.load(country_music_file, duration=30) 디스코, _ = librosa.load(disco_music_file, duration=30) 힙합, _ = librosa.load(hiphop_music_file, duration=30) 메탈, _ = librosa.load(metal_music_file, duration=30) 팝, _ = librosa.load(pop_music_file, duration=30)

그 다음, 우리는 가장 낮은 것과 가장 높은 것을 평가하고 비교할 것입니다. 순간 ZCR 값, 뿐만 아니라 최저 및 최고 평균 ZCR 값 다양한 음악 장르 샘플.

#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(팝).min()])

출력: 0.00585 —> 재즈 음악 장르 트랙입니다!

# 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(힙합).max(), librosa.feature.zero_crossing_rate(금속).max(), librosa.feature.zero_crossing_rate(팝).max()])

출력: 0.67675 --> 팝 음악 장르 트랙!

#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(힙합).mean(), librosa.feature.zero_crossing_rate(금속).mean(), librosa.feature.zero_crossing_rate(팝).mean()])

출력: 0.07846 —> 재즈 음악 장르 트랙!

# ZCR max([librosa.feature.zero_crossing_rate(classical).mean(), librosa.feature.zero_crossing_rate(blues).mean(), librosa.feature.zero_crossing_rate(reggae)의 HIGHEST AVERAGE 값으로 음악 장르 결정. 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(힙합).mean(), librosa.feature.zero_crossing_rate(금속).mean(), librosa.feature.zero_crossing_rate(팝).mean()])

출력: 0.18307 —> 메탈 음악 장르 트랙!

또한 추가 조사를 통해 클래식 장르의 오디오 샘플 트랙의 ZCR이 낮은 것으로 나타났습니다.

print(f"클래식 장르 노래에 대한 최소 순간 ZCR:{librosa.feature.zero_crossing_rate(classical).min()}, 클래식 장르 노래에 대한 최대 순간 ZCR:{librosa.feature.zero_crossing_rate(classical).max()}, 클래식 장르 노래의 평균 ZCR: {librosa.feature.zero_crossing_rate(classical).mean()}")

출력: 클래식 장르 노래에 대한 최소 순간 ZCR: 0.02685, 클래식 장르 노래에 대한 최대 순간 ZCR: 0.1767, 클래식 장르 노래에 대한 평균 ZCR: 0.0982

#팝 음악 장르 트랙에 대한 최소 순간, 최대 순간 및 평균 ZCR 결정 print(f"팝 장르 노래에 대한 최소 순간 ZCR:{librosa.feature.zero_crossing_rate(pop).min()}, 팝 장르 노래에 대한 최대 순간 ZCR: {librosa.feature.zero_crossing_rate(pop).max()}, 팝 장르 노래의 평균 ZCR: {librosa.feature.zero_crossing_rate(pop).mean()}")

출력: 팝 장르 노래의 최소 순간 ZCR: 0.00683, 팝 장르 노래의 최대 순간 ZCR: 0.6767, 팝 장르 노래의 평균 ZCR: 0.12676

관측: 그 결과, 재즈 음악 장르의 트랙이 순시 및 평균 ZCR이 가장 낮았다. 추가 분석에 따르면 클래식 음악 장르의 노래도 ZCR 값이 매우 낮습니다. 그 결과 재즈 음악 장르의 곡이 ZCR이 가장 낮다고 일반화하고 단언할 수는 없다. 곡 구성에 따라 관찰이 달라지기 때문이다. 또한 메탈 및 팝 음악 오디오 샘플 트랙의 평균 ZCR이 가장 높습니다.

시각화를 통한 신비화

이제 시각적인 도움을 받아 조금 더 이해하기 쉽게 해 보겠습니다. 이와 관련하여 먼저 Librosa를 사용하여 각 음악 장르 트랙에 대한 영교차율을 추출한 다음 각 음악 장르에 대해 정규화된 ZCR을 플롯한 다음 각 음악 장르에 대한 실제(비정규화된) ZCR을 플롯합니다.

#프레임 크기 및 홉 길이 지정
FRAME_SIZE = 1024 HOP_LENGTH = 512
#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, hop_THSlength=E) )[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) 특징 FRAME_SIZE, hop_length=HOP_LENGTH)[0] zcr_hiphop = librosa.feature.zero_crossing_rate(힙합, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0] zcr_metal = librosa.feature.zero_crossing_length=Emetal , hop_length=HOP_LENGTH)[0] zcr_pop = librosa.feature.zero_crossing_rate(팝, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0]
프레임 = 범위(len(zcr_classical)) t = librosa.frames_to_time(프레임, hop_length=HOP_LENGTH)
#다양한 음악 장르 노래의 정규화된 ZCR(Zero Crossing Rate) 시각화 plt.figure(figsize=(20, 20))
ax = plt.subplot(5, 2, 1) librosa.display.waveplot(클래식, 알파=0.5) plt.plot(t, zcr_classical, color="b") plt.ylim((-1, 1)) plt .title("클래식 음악 장르곡")
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 ("블루스 음악 장르 노래")
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 ("레게음악 장르송")
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("록 음악 장르 노래")
plt.subplot(5, 2, 5) librosa.display.waveplot(재즈, 알파=0.5) plt.plot(t, zcr_jazz, color="m") plt.ylim((-1, 1)) plt.title ("재즈 음악 장르 노래")
plt.subplot(5, 2, 6) librosa.display.waveplot(국가, 알파=0.5) plt.plot(t, zcr_country, color="y") plt.ylim((-1, 1)) plt.title ("컨트리 음악 장르 노래")
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 ("디스코 음악 장르 노래")
plt.subplot(5, 2, 8) librosa.display.waveplot(힙합, 알파=0.5) plt.plot(t, zcr_hiphop, color="#7FFF00") plt.ylim((-1, 1)) plt. title("힙합 음악 장르곡")
plt.subplot(5, 2, 9) librosa.display.waveplot(금속, 알파=0.5) plt.plot(t, zcr_metal, color="#FFB90F") plt.ylim((-1, 1)) plt. title("메탈 음악 장르 곡")
plt.subplot(5, 2, 10) librosa.display.waveplot(팝, 알파=0.5) plt.plot(t, zcr_pop, color="#458B00") plt.ylim((-1, 1)) plt. title("팝 음악 장르 노래") plt.subplots_adjust(hspace = 0.75)
제로 교차율
다양한 음악 장르 트랙의 제로 크로싱 비율을 보여주는 파형도

#Visualizing NORMALIZED NORMALIZED 다양한 음악 장르 트랙의 제로 크로싱 비율

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, 색상 ="#458B00") plt.ylim(0, 1)
제로 교차율
다양한 음악 장르 트랙의 NORMALIZED Zero-crossing 비율을 나타내는 그래프

#Visualizing ACTUAL (NON-NORMALIZED) 다양한 음악 장르 트랙의 교차율 제로

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)
제로 교차율
다양한 음악 장르 트랙의 실제(NON-NORMALIZED) 제로 크로싱 비율을 나타내는 그래프

결론

수학적, 시각적으로 살펴보면 재즈와 클래식 장르의 곡들은 ZCR 값이 낮다고 할 수 있다. 그리고 팝이나 메탈 장르의 곡들은 ZCR이 높다. 그러나 우리는 작은 표본 크기를 기반으로 이러한 결과를 전체 그룹으로 외삽할 수 없습니다. 반면에 앞의 분석은 뚜렷한 유형의 음악 장르에 대한 간결한 요약, 직관의 한 형태를 제공할 수 있습니다.

읽어 주셔서 감사합니다. 질문이나 우려 사항이 있으면 아래 의견 섹션에 남겨주세요. 행복하다 학습!

우리의 기사 더 읽기 블로그.

GitHub 리포지토리 링크: 여기를 클릭하세요.!

참조 : 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

이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다. 

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

spot_img

최신 인텔리전스

spot_img