Source code for msaf.algorithms.vmo.segmenter

"""
Variable Markov Oracle algorithm
"""
from msaf.algorithms.interface import SegmenterInterface
from vmo.analysis.segmentation import segmentation
# import sklearn.preprocessing as pre
import vmo
import librosa


[docs]class Segmenter(SegmenterInterface): """ This script identifies the structure of a given track using the Variable Markov Oracle technique described here: Wang, C., Mysore, J. G., Structural Segmentation With The Variable Markov Oracle And Boundary Adjustment. Proc. of the 41st IEEE International Conference on Acoustics, Speech, and Signal Processing (ICASSP). Shanghai, China, 2016 (`PDF`_). .. _PDF: https://ccrma.stanford.edu/~gautham/Site/Publications_files/segmentation-icassp_2016.pdf """ def processFlat(self): """Main process. Returns ------- est_idxs : np.array(N) Estimated indeces the segment boundaries in frame indeces. est_labels : np.array(N-1) Estimated labels for the segments. """ # Preprocess to obtain features (array(n_frames, n_features)) F = self._preprocess() F = librosa.util.normalize(F, axis=0) F = librosa.feature.stack_memory(F.T).T # F = pre.normalize(F, axis=0) ideal_t = vmo.find_threshold(F, dim=F.shape[1]) oracle = vmo.build_oracle(F, flag='a', threshold=ideal_t[0][1], dim=F.shape[1]) my_bounds, my_labels = segmentation(oracle, method=self.config['method'], connectivity=self.config['connectivity']) # Post process estimations est_idxs, est_labels = self._postprocess(my_bounds, my_labels[:-1]) assert est_idxs[0] == 0 and est_idxs[-1] == F.shape[0] - 1 # We're done! return est_idxs, est_labels