import numpy as np
import librosa
from scipy import signal
from scipy import ndimage
from matplotlib import pyplot as plt
import matplotlib
import matplotlib.gridspec as gridspec
import IPython.display as ipd
import pandas as pd
from utils.structure_tools import read_structure_annotation, compute_tempo_rel_set, \
compute_sm_from_filename, convert_structure_annotation, plot_feature_ssm, generate_ssm_from_annotationfrom utils.plot_tools import plot_signal, plot_segments_overlay, plot_matrix
5.4. 노벨티 기반 분할
Novelty-based Segmentation
음악 구조 섹션 사이의 전환을 표시할 수 있는 노벨티(novelty) 기반 분할을 소개하며, 노벨티를 감지하는 방법을 알아본다.
이 글은 FMP(Fundamentals of Music Processing) Notebooks을 참고로 합니다.
주요 참고자료: Jonathan Foote: Automatic audio segmentation using a measure of audio novelty. Proceedings of the IEEE International Conference on Multimedia and Expo (ICME), New York, NY, USA, 2000, pp. 452–455.
노벨티 분할 (Novelty Segmentation)
음악의 세그먼트 경계는 종종 악기 편성, 다이나믹, 하모니, 템포 또는 기타 특성의 변화를 수반한다. 새로움/노벨티(novelty) 기반 구조 분석의 목적은 이러한 음악적 변화가 발생하는 시점을 찾아 두 개의 연결된 구조 부분 사이의 전환을 표시하는 것이다.
이 포스트는 SSM(self-similarity matrices)의 구조적 속성을 기반으로 하는 고전적인 경계 탐지(boundary detection) 절차에 대해 설명한다.
기본 특징 시퀀스가 전체 섹션 기간 동안 어느 정도 일정하게 유지되는 경우, SSM은 블록-like 구조(block-like structure) 를 나타낸다. 종종 그러한 동종(homogeneous) 세그먼트 뒤에는 이전 세그먼트와 대조되는 또 다른 동종 세그먼트가 뒤따른다. 예를 들어, 현악기로 연주되는 부분 다음에 금관악기로 연주되는 부분이 나올 수 있다. 또는 두 개의 대조 섹션(contrasting sections) 이 있을 수 있으며 각각 하모니와 관련하여 동질적이며 이러한 섹션 간의 경계는 음악 키(key)의 변화로 특징지어진다. 대조적인 동종 섹션(contrasting homogeneous section)은 SSM의 로컬 바둑판 모양 블록 구조(checkerborad-like block structure) 에 의해 반영된다.
예를 들어 Johannes Brahms의 헝가리 무곡 5번 Ormandy 녹음을 보면 \(\mathrm{G}\) 마이너에 동종 \(A\) 부분 세그먼트가 있고 \(\mathrm{G}\) 메이저에 동종 \(C\) 부분 세그먼트가 있다.
SSM은 특징 스무딩 기법(features smoothing techniques)과 함께 크로마 기반 특징(chroma-based features)을 사용하여 얻는다.
# Annotation
= '../data_FMP/FMP_C4_Audio_Brahms_HungarianDances-05_Ormandy.csv'
fn_ann = read_structure_annotation(fn_ann)
ann, color_ann
# SM
= '../data_FMP/FMP_C4_Audio_Brahms_HungarianDances-05_Ormandy.wav'
fn_wav = compute_tempo_rel_set(0.66, 1.5, 5)
tempo_rel_set = compute_sm_from_filename(fn_wav,
x, x_duration, X, Fs_X, S, I =81, H=10, L_smooth=1, thresh=1)
L
# Visualization
= convert_structure_annotation(ann, Fs=Fs_X)
ann_frames = plot_feature_ssm(X, 1, S, 1, ann_frames, x_duration*Fs_X,
fig, ax ='Time (frames)', color_ann=color_ann, clim_X=[0,1], clim=[0,1],
label='Feature rate: %0.0f Hz'%(Fs_X))
title
ipd.Audio(fn_wav)