데이터 수집
이번엔 데이터 수집을 주제로 글을 쓰겠습니다.
기존 데이터셋 사용
음악 데이터 셋은 http://www.audiocontentanalysis.org/data-sets/ 여기에 잘 정리되어있습니다.
오디오 관련 데이터셋은 좀 더 중구난방인데,
- Urbansound8K by Justin Salamon
- DCASE audio detection by Queen Mary University of London
- Bird Audio Detection by Queen Mary University of London
이 정도가 생각나네요.
데이터 수집
살다보면 힘들고 험한 길을 가야할 때가 있죠.
freesound에서 직접 크롤링해서 뭔가 할 수 있지 않을까? 하는 희망을 한번쯤은 품어볼 필요가 있습니다.
아래 코드를 참고하세요. 주소는 여기
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Keunwoo Choi | |
# This example crawl snoring sound by searching keyword 'snore'. | |
from __future__ import print_function | |
import freesound # $ git clone https://github.com/MTG/freesound-python | |
import os | |
import sys | |
api_key = 'YOUR_API_KEY' | |
folder = 'data_freesound/' # folder to save | |
freesound_client = freesound.FreesoundClient() | |
freesound_client.set_token(api_key) | |
try: | |
os.mkdir(folder) | |
except: | |
pass | |
# Search Example | |
print("Searching for 'snore':") | |
print("----------------------------") | |
results_pager = freesound_client.text_search( | |
query="snore", | |
# filter="tag:tenuto duration:[1.0 TO 15.0]", | |
sort="rating_desc", | |
fields="id,name,previews,username" | |
) | |
print("Num results:", results_pager.count) | |
print("\t----- PAGE 1 -----") | |
for sound in results_pager: | |
print("\t-", sound.name, "by", sound.username) | |
filename = sound.id + '_' + sound.name.replace(u'/', '_')+".mp3" | |
if not os.path.exists(folder + filename): | |
sound.retrieve_preview(folder, filename) | |
for page_idx in range(results_pager.count): | |
print("\t----- PAGE {} -----".format()) | |
results_pager = results_pager.next_page(page_idx + 2) | |
for sound in results_pager: | |
print("\t-", sound.name, "by", sound.username) | |
filename = sound.id + '_' + sound.name.replace(u'/', '_')+".mp3" | |
if not os.path.exists(folder + filename): | |
sound.retrieve_preview(folder, filename) | |
print() | |
데이터 정리
데이터를 모으는게 다가 아니죠. 일단, 키워드로 검색을 했으니 특정 소리가 들어있는 음악 파일을 잔뜩 받았다고 해봅시다. 뭘 해야할까요?- Normalisation
import numpy as np
import librosa
x = librosa.core('event1.mp3', sr=None, mono=True)
x = x / np.max(np.abs(x))
- Trimming
앞뒤에 조용한 구간이 있다면 싹둑 잘라주는편이 좋겠죠. 이건 어느정도 대애충 감으로 하는게 편할것같네요. 저라면, hann window같은걸 씌우고, 각 윈도에서 평균 에너지를 구해서 (np.mean(np.abs(windowed_source_x) ** 2)), 그 윈도 별 평균 에너지를 기준으로,아무런 음향 이벤트가 안일어나는 첫 N개의 윈도와 마지막 M개의 윈도를 날리겠습니다.
- Augmentation
데이터가 부족하면 뻥튀기를 하고싶겠죠? 방법은 여러가지가 있습니다. 적당한 구간에서 pitch shift / time expanding을 하시면 무난할테고, 다른 잡음을 적당히 섞어주는것도 좋겠죠 (x = x + gain * noise). 이 정도만 해도 벌써 10배이상 데이터가 늘어날 것 같네요.
- 주의사항
음원이 매우 길다거나해서 여러 개의 학습 데이터 샘플로 쪼개서 쓰는 경우에, 같은 음원에서 나온 샘플 여러개가 training/validation/test 셋에서 섞이지 않도록 주의합시다.
이상입니다.
No comments:
Post a Comment