brunch

You can make anything
by writing

C.S.Lewis

by 김범준 Jan 02. 2018

머신러닝으로 드럼 악보를 추출해보자

설계과제

2학년 겨울에 잠깐 드럼 학원을 다닌 적 있었는데, 당시에 드럼을 배우면서 초보자로서 여러 가지 어려움이 많았었다. 나 같은 일반인은 악보 읽기도 어렵고, 사실 또 드럼 악보라는 게 구하기도 쉽지 않잖아. 그런 여러 불편함 들을 공학적인 방법으로 풀 수 있지 않을까 해서, "드럼 악보 추출 및 연주 시스템 구현"이라는 주제로 지난 1년간 설계과제를 하게 되었다. 흔히 말하는 공대 졸업 작품.. 전체적으로 크게 두 파트로 나뉘는데, 드럼에 대한 mp3 파일을 오디오 신호로 다루며 머신러닝을 적용해서 악보를 얻는 과정, 또 하나는 연주 정보에 맞춰서 실제 드럼을 연주할 수 있는 로봇을 구현하는 과정이다. 3명이서 같이 했는데, 오늘 소개할 내용은 내가 주로 담당한 드럼 악보를 추출하는 과정이다.


1) Dataset Preparation

여기서는 드럼 음원(mp3 파일)에 대한 dataset을 얻어 정리하는 것이 목표이다. 이렇게 말로 하면 쉬운데.. 언제나 그렇듯이 머신러닝 프로젝트는 데이터 가공이 상당히 번거로운 작업이다. 제일 중요한 건 드럼 소리가 나타난 지점들을 detect 하는 것인데, 필자의 경우 3-sigma를 벗어나면 outlier로 간주한다는 anomaly detection의 내용에 추가적으로 시간 축에도 적절히 threshold를 잡는 방식으로 구현했다. 아래와 같이 그럭저럭 detection이 가능하다.

여기서 각각의 detect 된 지점에서부터 10,000 point를 잘라낸다. 320 kbps인 mp3 파일에서 sampling frequency는 44,100 Hz로 나타나므로 10,000 point는 실제로는 약 0.2초 정도의 길이인 드럼 소리를 나타낸다. 한편 여기에 DFT(이산 푸리에 변환)를 적용해서 frequency spectrum의 magnitude를 얻고 저장하는데, 이를 머신러닝 모델에 집어넣어 어떤 소리인지(쿵/칫/탓/챙의 4개만)를 분류하고자 한다. 사실 DFT를 하지 않아도 시간 축의 데이터를 바로 활용하는 경우도 있다고 하는데(요즘 RNN이 그렇게 쓰이는 듯) 개인적으로 주파수 축의 데이터를 선호한 이유는, 내가 구현한 detection이라는 게 완전히 정밀하다고 보장하기 힘들고 time shift가 있을 수 있기도 해서.. 그런데 time-shift가 있더라도 frequency spectrum의 magnitude는 영향이 없다고 하니까, 이걸 직접 쓰면 머신러닝의 데이터로 활용하기 적합하지 않을까라는 생각이 들었다(물론 뇌피셜입니다.. 일단 결과는 그럭저럭 좋음..).


추가적으로 머신러닝의 데이터로 활용하기 위해 어떤 드럼의 소리인지를 라벨링 할 필요가 있는데, 역시 사람이 일일이 하려면 상당히 번거롭다. 여기서 Unsupervised Machine Learning 중 하나인 k-means clustering을 활용해서, 데이터가 분포하는 natural grouping을 통해 손쉽게 라벨링 하는 방법을 진행하였다. 4종류의 드럼 소리를 분류하겠다는 목표를 설정했으므로 k를 우리가 정확하게 알고 있기도 하고, 유클리드 거리 기반이라는 게 여기에도 그럭저럭 알맞은 방법으로 보이고, 사실 워낙 k-means가 범용적으로 쓰이지 않던가..


이렇게 최종적으로 605개의 드럼 소리를 dataset으로 준비하였다. 이전에 언급한 것과 같이 frequency spectrum의 magnitude를 모델에 넣을 데이터로 사용하여, 어떤 소리인지에 대한 라벨 정보를 머신러닝으로 분류하는 것이 목표이다.


2. Machine Learning Modeling

요즘 머신러닝 툴이 워낙 좋아져서 MATLAB이든 Python이든 R이든 취향에 맞게 사용하면 된다. 일반적으로 Python에서 scikit-learn과 tensorflow가 요즘 워낙 잘 돼있고, 또 언어 자체도 막 어렵지 않은 쪽이어서 많이 추천되는 편이다. 한편 이왕 하는 거 쉽게쉽게 가자는 의미에서 "MS Azure Machine Learning Studio"를 활용했는데, 이게 정말 기특한 녀석이다. 데이터를 csv 같은 걸로 올리고 적당히 모델을 드래그&드롭하면 머신러닝이 뚝딱 된다. 코딩 없이!!

분류는 드럼의 4개 소리(쿵/칫/탓/챙)에 대해 Multiclass classification을 진행하는데 Decision Forest, Decision Jungle, Logistic Regression, Neural Network 등으로 모델링을 진행해보았으며, 실제로 accuracy가 0.96~0.97 수준으로 상당히 좋은 성능이 나타난다. 그 외에도 비슷하게 MATLAB에서도 nnstart 커맨드로 거의 코딩 없이 Neural Network를 통한 모델링이 가능하고, 옛날에는 Alice라는 툴도 써봤는데 이것도 정말 좋은 툴이더라. 쉽게쉽게 빨리빨리 결과를 내야 될 때 이렇게 좋을 수가 없다. 툴은 점점 좋아지는 추세이고 날이 갈수록 머신러닝도 점점 대중화되겠구나 하는 게 느껴지기도 하고.


3. Visualization

머신러닝은 그렇다 치고, 악보는 어떻게 추출하지? 내가 직접 손으로 음표 하나하나 그릴 수 없잖아.. 그래서 내가 가진 연주 정보를 코딩을 통해 입력하면 자동으로 악보를 그려주는 게 없을까 해서 찾은 게, Lilypond였다. 이게 LaTeX와 비슷한 건데, 규칙에 맞게 script를 작성하면 악보를 이쁘게 그려준다. 전체적인 script의 틀은 고정해두고, BPM이나 드럼 연주 정보만 바꿔서 fprintf로 스크립트 파일을 만들게 하면, 머신러닝에서 분류한 결과에 맞춰서 그대로, 손쉽게, 악보를 얻을 수 있다. BPM의 경우 앞서 드럼 소리를 detection 하면서 나타나는 간격을 통해 계산하면 어렵지 않게 얻을 수 있다. 실제로 악보를 뽑으면 잘 나온다!


마지막으로 시각화 기능을 하나 더 소개하고자 한다. Lilypond에서는 악보뿐만 아니라 MIDI 파일을 출력해주는 기능도 있는데, MAMPlayer의 피아노 롤 기능으로 MIDI 파일을 재생하면 귀로만 듣던 드럼 소리를 시각화하여 눈으로 볼 수 있다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari