Saturday, March 19, 2022

연구 주제 선택과 현실적인 측면.

최근에 저와 같은 분야를 연구하는 학생 몇몇분들을 만나서 상담을 해드렸습니다. 나이를 먹을 수록 조언이라는게 참 무모한 행위라는 생각을 합니다. 그러면서도, 더군다나 저같이 음악을 연구하는 후배 연구자 분들을 보면 뭐라도 해드리고싶은 생각이 많이 참 많이 드네요. 상담을 하다보니 후배분들의 고민에 공통점이 있고, 제 생각도 사실 뻔하다보니 이래저래 겹치는 대화를 많이 했네요. 생각나는 내용을 간추려서 적어보겠습니다.

(이 조언은 제 연구분야(공대, 음악 인공지능)와 분야가 다를수록 쓸모가 없어집니다.)

연구 주제 선택과 현실적인 측면.

이미 운명적인 연구주제를 정하셨다면 이런 걱정 따윈 하지 않겠죠. 실제로 그런 경우는 드물고, 우리는 보통 여러 측면을 고려합니다. 

저의 가정: 당신이 재미를 느낄만한 연구 주제가 1개 이상 존재한다.

자. 그러면.. 재미가 있는 여러가지 연구 주제중에 졸업한 뒤에 어떻게든 도움이 되는 주제를 어떻게 찾아야 할까요?

접근 방법: 연구주제를 '문제' x '방법론'으로 나누어서 생각합시다. 예를 들어 "딥러닝을 이용한 음악 분류" 라고 하면 풀고자 하는 문제는 음악 분류가 되고, 이를 위한 방법론으로 딥러닝을 선택한 것이죠.

제안: 문제와 방법론 중에 하나쯤은 타협하시죠. 문제를 유명한걸로 골라서 푸는 경험을 쌓으면 아무튼간에 큰 도움이 됩니다. 반대로 인기가 별로 없는 문제라도, 사용한 방법론이 범용적이면 연구 분야를 조금 (?) 바꾸면서 (예: MIR → 음성, 비전, ..) 취직할 수 있습니다. 

몇가지 사실: 공대 대학원, 특히 박사과정의 의미를 '새로운 문제를 푸는 방법을 배우는 것'이라고들 정의합니다. 이 정의는 장기적으로 보면 맞는 말인데요, 즉 새로운 문제를 풀도록 기회가 주어질 때 까지 버틸 수 있는 경우에 성립합니다. 

그런데 박사 졸업 직후의 취직은 보통 그렇지 않거든요. 석사라면 더 심하구요.

따라서 회사에서는 당장 회사에서 풀려고 하는 문제를 풀어본 사람을 찾습니다. 아니면, 당장 회사에서 관심있는 기술을 써본 사람을 찾던지요. 음성인식 기술 개발이 필요한 회사에서 5년동안 음악 연구한 박사와 2년동안 음성인식 연구실에서 경험을 쌓은 석사를 비교한다면, 대부분의 경우 후자입니다. 회사에서는 그렇게까지 길게 볼 수가 없어요. 코앞에 쌓여있는 할 일이 너무 많아요.


그러므로 최소한 문제와 방법론 중 하나는 현실적인 기준으로 골라야합니다!



Tuesday, December 14, 2021


지난주에 뉴욕대학교 CDS(Center for Data Science)에서 초청강연을 했습니다.
11/27에 했던 한국음악지각인지 학술 세미나 기조강연 자료를 조금 더 보완했고, 데이터사이언스 대학원생을 대상으로 하는 강의라 포커스에 차이가 있습니다. 



이번에도 역시 아래와 같은 2x2 분류법을 제시했습니다.


MFCC도 간략히 설명했고..



컨브넷을 음악 분류에서 많이 쓰는 이유를, 소리의 3요소 중 하나인 음색과 연관지어 설명했습니다. 이상하게도 논문이나 블로그에 이런 자료가 잘 없습니다.




음악AI 연구자들의 향후 연구방향도 간단히 제시했습니다.






강의자료는 아래를 참고하세요.




Friday, December 3, 2021

인공지능의 음악 인지 모델 - 제65차 한국음악지각인지학회 기조강연



인공지능의 음악 인지 모델 - 제65차 한국음악지각인지학회 기조강연 (발표자 최근우, 바이트댄스)



Monday, November 15, 2021

연구 근황

지난주엔 ISMIR 2021이 있었습니다. 

올해 ISMIR는 특별히 공을 들였습니다. 우선 학회 시작하기 전에도 늘상 하듯이 논문 리뷰를 했습니다.

- 논문 리뷰
- LBD세션 논문 리뷰 및 멘토링


학회 기간동안은 공식적으로 다음의 활동이 있었네요.

- 학회 첫 참가자 그룹 리더
- 논문 4편 발표
- LBD 세션 논문 1편 발표
- 회사 소개 발표

오랜만의 학회 참여라 논문도 재미있게 읽고, 다른 참가자들과 오랜만에 만나서 이야기하니 무척 반갑더군요. 자극도 많이 받았고요.


---


11월 말에는 한국음악지각인지학회 학술세미나에서 기조강연을 합니다.
제목은 일단 정했는데 무슨 강연을 해야할지 걱정도 많이 되네요. 

<제 65차 한국음악지각인지학회 학술세미나>

일시: 2021년 11월 27일 토요일 오후 1시 30분 - 6시 00분

장소: 온라인 (Zoom)

<프로그램>

13:30-14:00 개회

 

13:40-14:40 기조강연  최근우 (ByteDance, Senior Research Scientist)

                                     "인공지능의 음악인지 모델"

14:40-14:50 휴식



---


12월 초에는 뉴욕대학교 조경현 교수님의 수업에서 초청강연을 합니다.


---


강연 자료, 영상 등은 강연이 끝나는대로 올리겠습니다.




Wednesday, November 3, 2021

Monday, October 18, 2021

바이트댄스에서의 1년

이 회사에 입사한지 어느덧 1년 2개월이 지났네요. 시간이 참..
빠르게 성장하는 회사와 팀에 있으면 정말 다양한 업무와 책임이 주어집니다. 저는 지금 팀 내에서 Tech Lead, Project Manager, Individual Contributor/Research Scientist 의 역할을 동시에 수행하고 있습니다. 여기에 잘 대처하여 제가 하고싶은 일을 하고 능력을 키우면서 일상 생활과 제 자신을 보존하는 것이 제 목표입니다.

---

14개월 동안 제 담당 업무로 총 5개의 모델을 배포했습니다. 전 직장에서 2년간 고작 1개의 모델을 배포한것과 비교하면.. 비교가 안되는 비교겠죠. 덕분에 정말 많이 배웠습니다.

현재 진행중인 인턴까지 인턴을 4명이나 지도했습니다. 다들 뛰어난 사람들이라 저는 제가 해줄 수 있는 일에 최대한 집중하고 있습니다. 주제 선정을 돕고, 데이터와 각종 정보를 물어다주고, 잡일도 하고, 회사 내외로 좋은 평을 받을 수 있도록 피드백을 해주었습니다.


프로젝트를 3개 이끌고 있습니다. 마무리한 프로젝트도 있고요. 상사, 프로덕트 팀, 저, 프로젝트 참가자들, 인턴들의 생각, 의도, 목표, 가치관, 능력이 전부 다릅니다. 어디서나 마찬가지겠죠. 제 의견이 옳다는 법도 없고, 설령 그렇다 하더라도 설득을 못하면 꽝이더군요. 성장하는 팀에 있는 덕분에 참 적절한 시점에 이런 경험을 하게되어 다행입니다.


팀이 너무 컸었는데, 저와 기존 상사 사이에 한 명을 뽑았고 그 사람이 지금 제 직속 상사입니다. 음악 연구 관련이 없는 분이라 저는 처음엔 조금 우려했습니다. 겪어보니 제가 속한 연구팀을 너무나도 잘 이끌고있어서 저야말로 매니저의 역할에 대해 아무것도 몰랐다는 걸 깨달았습니다.


팀에서 올해 논문을 많이 냈습니다. 저도 나름 기여했네요. 논문 제출 전에 서로 리뷰를 해주도록 엄청 열심히 주장했습니다. nC2로 모두가 참여한것은 아니지만 나름 효과가 있었습니다. 여러가지 운도 따라줘서 팀에서 ISMIR에 낸 7개의 논문이 전부 억셉되었습니다. ISMIR 총 논문수가 104편인걸 생각하면 엄청난 결과입니다. 전 직장을 포함한 모든 경쟁사를 완벽하게 압도하는 숫자입니다. 

저도 1, 2, 3, 4저자로 총 4개의 논문을 내게 되어 굉장히 기쁩니다. 한편으로는 올해가 운이 좋았고 내년에는 다시 흉작이면 어쩌나하는 생각도 드네요. 뭐, 어찌 되겠죠. 그리고 튜토리얼도 하나 하게 되었고, 회사 대표로 Industry Session에서 발표도 할 예정이라 학회 주간엔 정말 엄청나게 바쁘겠네요. 


주변을 보면 IC(Individual Contributor)로서의 역할과 리더십 역할(테크리드, 인턴 지도, 매니저 등)의 충돌 및 과부하때문에 고민하시는 분들이 많더군요. 저는 어째 그런 스트레스가 전혀 없는데, 아마도 IC로서의 역할에 큰 미련이 없어서 그런듯 합니다. 제가 엄청난 연구자는 아니었지만 유학가기전에 이루고싶었던 꿈을 대부분 이뤘는데, 그것도 애당초 제 꿈이 소박해서 그랬던것 같기도.. 아무튼, 프로젝트와 팀을 이끄는 일이 생각보다 너무너무 어렵고 중요한 일이라 거기에 더 관심이 가는 나날을 보내고 있는 4년차 Research Scientist가 되었네요.



Sunday, January 17, 2021

첫 직장 요약

---
2018년 7월 30일 입사.
하반기: 대충 놀면서 연구함
---
2019년 2월 첫 평가. 결과는 별로. 
4월 드러머넷 논문 제출
여름: 음성 관련 일 시작 (나중에 포기)
가을: 어쿠스틱 벡터 프로젝트 시작
겨울: 오토 레벨링 시작
---
2020년 2월. 해커톤에서 오토레벨링 마무리. 서비스로 올리고싶었으나 실패.
2월 평가는 잘 받음
3월. 어쿠스틱 벡터 마무리. 배포는 남에게 맡김
4월 JointISM 시작. Q2동안 진행.
5월 Instrumentify 데이터셋 만들기 시작
5월 바이트댄스 면접 진행
6월 오퍼 수락
7월 말 비자 완료
8월 초 퇴사
---

Saturday, April 11, 2020

Q&A. 음악 유사도를 이용한 추천엔진 개발


질문


프로젝트로 음악의 특징 유사도를 이용한 내용기반 음악 추천시스템을 만드려 하고 있고, 현재 논문들을 서베이중입니다.
그런데, 음악의 어떤 특징을 추출해야 할지가 고민입니다. 널리 알려진 방법으로는 MFCC를 추출하여 DTW 기법을 활용하여 유사도 계산을 하는 것인데요, 이것이 과연 제 주제에 적합한지 아직 직관이 없습니다.
설문조사 결과, 두 음악이 유사한지를 판단하는 기준 중 가장 많은 표를 받았던 게 음악의 멜로디와 빠르기였는데, MFCC가 이러한 정보를 담을 수 있는지도 모르겠습니다

답변


mfcc에는 그런 정보가 거의 없습니다. 템포는 상대적으로 쉽게 추출가능하지만 (librosa 등) 멜로디는 추출과 유사성 비교 둘 다 까다롭습니다. 어느정도의 성능을 원하시는지 모르겠지만 유사한 곡을 찾는 성능이 프로젝트에서 제일 중요한 핵심이 아니라면 mfcc 기반으로 하셔도 뭔가 작동하긴 할겁니다.


추가 질문


국내 논문을 보던중에 크로마레벨표현으로 멜로디 유사도를 구현한 논문을 읽어봤습니다. 여기서는 MRR이 0.713으로 수치상 꽤 높은 값이 나왔는데, 혹시 멜로디 추출과 유사성 비교가 까다롭다고 하신 이유를 알 수 있을까요?

답변


mfcc는 수식으로 정확하게 정의되고 그 특징이 잘 알려져있죠. 그리고 지금 보니 본문에서 DTW를 활용한다고 하셨는데 그렇다면 음악을 mfcc의 수열로 나타내고 그 수열의 유사성이 음악의 유사성을 나타낸다는 가정일텐데, 더 흔하게는 주어진 음악의 시간축에서의 평균과 표준편차를 씁니다. 이렇게하면 성능이 대단히 뛰어나지는 않겠지만 각 음악 신호가 갖는 소리로서의 특징(음색)이 반영된 추천엔진으로 작동을 합니다. 그리고 음색은 음악을 구성하는 악기나 장르와 관련이 깊으므로 추천엔진이 엄청나게 취향을 저격해주진 않겠지만 크게 실패하지도 않겠죠.
반면 멜로디를 추출하고 거기에서 유사성을 비교한다면, 우선 멜로디가 정확하게 추출된다는 가정이 필요하고 (대충 되긴 합니다만) 여기에서는 정말로 멜로디라는 시계열 데이터가 유사한지 찾아내는 잣대가 필요합니다. 멜로디는 곡 전체를 아우르는 시계열 데이터인데 그렇다면 예컨대 4분짜리 곡 전체의 멜로디가 다 비슷해야 된다는것인지 (물론 그건 아니겠죠), 아니면 일부가 비슷하면 된다는것인지, 그렇다면 일부만 비슷한 멜로디를 어떻게 찾아낼 수 있을지 (메트릭을 잘 디자인해야하고) 등등 문제가 생각나네요. 결정적으로, 유저들은 멜로디가 비슷하면 비슷한 음악이라고는 응답하긴 했지만 글쎄요, 그게 어떤 유사성을 의미하는지 알기도 어렵고, 전혀 다른 장르인데 멜로디가 비슷하면 정말로 그 멜로디의 유사성이 호불호의 중요한 기준이 된다고 말할수있을지 회의적입니다. 따라서 이런 불확실성을 해소하는 것이 프로젝트의 목적이라면 얼마든지 재미있는 연구를 진행할 수 있습니다. 그렇지 않다면 굳이 시간을 들일 필요가 없구요.


Wednesday, December 4, 2019

영국과 미국 유학 비교 - 졸업과 취직

2016년 5월에 제가 <영국 박사과정의 특징>이라는 제목으로 글을 하나 썼었습니다. 이번 글은 <영국 박사과정의 특징> 2편이라고 할 수 있겠네요. 자세한 내용은 학교마다 조금 다를 수 있습니다. 기본적으로는 공대/컴공, 201x년을 가정하고 있습니다.

"박사과정 3년"의 의미

흔히 유럽 박사학위 공고에 3년짜리 코스라고 나오는데, 이는 입학한지 3년 뒤에 땡! 하고 졸업이 되어서 PhD를 준다는 의미는 아닙니다

보통 대학원은 다음과 같은 과정을 거칩니다.

---[A. 입학]---
.
.
.
.
.
.
(일반적인 박사과정 학생인 상태. 교수에게 연구지도를 받도록 되어있는 기간.)
.
.
.
.
.
.
---[B. 뿅!]---
.
.
(졸업논문=학위논문 Writing-up stage. 공식적으로 연구지도는 끝남. 이 기간은 대략 3개월쯤 걸림)
.
.
---[C. 박사 학위논문 제출]---
.
.
(취직준비, 놀기, 디펜스 준비 등. 논문 심사 위원이 논문을 읽어야하므로 2달정도 시간이 걸림)
.
.
---[D. 박사 학위논문 심사 = 디펜스. 이게 끝난 날 사람들이 막 뫄뫄 박사라고 불러주며 축하해줌.]---
.
(별 일 없으면, 학위 논문을 마지막으로 열심히 고침. 대충 2달쯤.)
.
---[E. 박사 학위 논문 최종본 제출. 이제 공식적으로 박사학위를 보유함.]---
.
.
---[F. 봄이건 가을이건, 여하간 학교 졸업식. 학위복입고 사진찍는 날]---


그리고 공고에서 나오는 기간은 [A. 입학]에서 [B]까지의 기간이 3년이라는 말입니다. 더 정확히 말하면, 등록금과 생활비를 제공해주며 그 결과 연구지도를 받을 수 있는 기간이 총 3년이라는 말입니다. 
다시말해 3년 이상 줄 돈은 없다는 말입니다.


짧은 박사과정의 장단점

아무튼 학위를 빨리 받을 수 있다는 것은 큰 장점입니다. 그러나 장점만 있는것은 아니죠. 세상은, 정확히는 고용주는, 박사과정 학위가 있다고 해서 모든 사람을 동일하게 취급하지 않습니다. 그리고 일단 취직을 하고 나면 새로운 지식을 쌓기는 어렵고, 따라서 실력을 키우는 일도 쉽지 않습니다. 결과적으로 박사를 졸업하는 순간에 갖고있는 스펙이나 능력치가 갖는 영향력이 상당합니다.

따라서 졸업 시점의 능력치를 비교한다면 당연히 1-2년 더 길게 대학원 다니는게 좋겠죠. 이렇게 보면 짧은 기간이 장점만은 아닙니다.

목표가 미국에 있는 회사에 취직하는 것이라면 미국 대학원이 유리

미국에서 직장을 구하려면 회사에 합격하는 것만큼이나 비자가 중요합니다. 경우에 따라 비자가 더 중요하기도 합니다.

미국에서 대학원을 졸업하면 상대적으로 미국 취직이 쉬워집니다. 미국에 있으면 미국에 있는 회사에서 인턴을 하는 기회가 훨씬 많고, 회사에서 비자 스폰서를 받을 필요가 없으므로 자리를 얻을 확률이 확 올라갑니다. 

졸업 후 직장을 구할때도 마찬가지입니다. 미국 대학원 졸업생은 OTP를 이용할 수 있으므로 첫 일단 비자문제없이 취직이 가능하고, 그 뒤에 H1B로 전환하는 연착륙이 가능합니다. 그렇지 않다면 처음부터 H1B를 받아야하는데 일단 추첨을 통과해야하니 운이 좋아야하고 (요즘은 대략 1:3 이라고 이야기합니다) 이 추첨이 연 1회뿐이라 타이밍이 잘 맞아도 몇달, 잘 안맞으면 1년이 훌쩍 넘게 기다려야합니다. 그렇다면 회사입장에서는 비자때문에 입사 가능성이 불투명하고, 가능하다하더라도 시간이 한참 걸리는 사람에게 오퍼를 주는 것인데, 그러려면 실력이 훨씬 더 뛰어나야합니다. 

이 과정을 피하려면 다른 노력이 필요합니다. 피논문 피인용 횟수등을 고려하여 발급해주는 O-1 비자가 있습니다. 다만 충분한 피인용 실적이 있어야합니다. 또는 미국에 있는 회사의 다른 나라 지사(예: 런던, 서울 등)에서 1년동안 근무하면 주재원 비자(L-1 비자)를 발급받을 수 있습니다. 회사에서 이야기가 잘 된다면 비자발급 자체는 상대적으로 수월합니다. 하지만 1년이라는 시간이 걸리고, 미국 국외에 지사가 있고 거기에서 일을 해도 되는 (예컨대 본인이 지원하는 직종이 연구직이라면 연구인력이 미국과 유럽에 모두 있는) 상황이 맞아야하죠. 역시 선택가능한 보기가 줄어듭니다.

다시 강조합니다. 미국 취직에서 비자는 아주 중요한 문제이니 자세히 알아봐야합니다. 

글을 마칩니다. 많은 도움 되었길 바랍니다.

Friday, August 23, 2019

Q&A. 오디오 코덱/디코더와 머신러닝/딥러닝

사운들리 그룹에 올라온 질문과 제 답변을 정리한 글입니다.

----------

질문

오디오 데이터셋의 오디오 포맷이 wav와 flac으로 섞여있습니다. 이를 librosa.load로 불러온 뒤 스펙트로그램이나 mfcc로 변환하려고 합니다. 이 경우에 flac을 wav로 변환해서 전체 파일 포맷을 동일하게 만들어둬야 하나요? 아니면 실시간으로 librosa.load로 불러서 바로 스펙트로그램, mfcc등을 계산하면 되나요?

1줄 답변

미리 변환하지 않고 그냥 librosa.load를 바로 쓰시면 됩니다.

3줄 답변

Flac은 무손실 압축입니다. 즉, 디코더 구현에 관계없이 원본 파형을 그대로 유지해야합니다. 따라서 아무 디코더나 쓰셔도 괜찮습니다.

여러줄 답변

질문의 요지는 "flac을 wav로 변환해서 전체 파일 포맷을 동일하게 만드는 과정"과 "librosa.load에서 사용하는 flac 디코딩 과정"에 차이가 있냐는 것입니다. 일단 flac은 무손실 압축이므로 3줄 답변에서 보듯이 어떻게 디코딩하든간에 차이가 없습니다.

조금 더 알아보면, librosa는 자체적인 오디오 디코더를 가지고 있지 않습니다. librosa는 backend로 시스템에 깔려있는 오디오 디코더를 사용합니다. 만약 디코더가 아예 없다면 에러 메시지를 내보냅니다. 그런데 보통 리눅스나 맥에서는 ffmpeg을 많이 사용하죠. 그리고 아마 직접 flac을 wav로 변환하더라도 마찬가지로 시스템에 설치된 (ffmpeg) 디코더를 사용하겠죠. 따라서 결과는 같습니다.

만약 mp3같이 손실 압축이라면 디코더 버전이나 구현이 중요한가요?

사실, 손실 압축이어도 마찬가지입니다. mp3를 예로 들면, mp3 코덱이 차이가 날 수 있는 부분은 인코더입니다. 공개된 인코더인 LAME같은 경우는 사실 성능이 별로 좋지 못합니다. 대부분의 mp3 인코더는 유료이고, 어떤 mp3 인코더를 쓰느냐에 따라, 같은 스펙 (예: 128 kbps) 이라도 성능(음질)에 차이가 날 수 있습니다.

그런데 질문의 상황은 디코딩 과정이 달라질 수 있냐는 것이죠. 오디오 디코더는 구현 방식에 따른 차이가 (거의) 없습니다. 다만 페북 그룹의 현동일님께서 답변해주신것처럼, 임베디드 시스템에 디코더를 구현한다든지 하면 연산량이나 연산방식 등의 제한으로 인해 다소 오차가 있을 수 있습니다. 하지만 이건 머신러닝에서 데이터를 처리하는 것과는 관련이 없겠죠.

mp3 압축 여부가 학습에 영향을 미치나요?

이건 상황에 따라 다릅니다. 별도의 포스팅으로 정리하도록 하죠.

Sunday, June 9, 2019

딥러닝과 오디오 데이터 전처리

이번 글에서는 딥러닝과 오디오 데이터 전처리 전반을 살펴보겠습니다. 제가 몇몇 발표 (2017-11-03 판교 혁신센터, "음악과 딥러닝의 사랑과 전쟁" (발표자료))에서 다룬적이 있는데, 이미지랑은 달리 오디오 데이터는 몇가지 특징이 있습니다.

  • 데이터 사이즈가 크다 - 상황에따라 천차만별이지만 오디오는 기본 16비트고 (이미지는 8비트 x 3, 4채널) 1초당 int16짜리 데이터가 44,100개가 있습니다.
  • 디코딩이 느리다 - 데이터가 크기 때문에 음성/음악 코덱 기술이 많이 발달했습니다. 그런데 오디오 코덱은 신호를 시작부터 끝까지 순차적으로 디코딩합니다. 그리고 연산량이 적어서 디코딩 속도가 빠를수록 좋긴 하지만, 한편으론 재생 속도보다 빠르기만 하면 일반적인 오디오 재생에는 별 문제가 없겠죠. 그러다보니 딥러닝 학습과정에선 문제가 될 수 있습니다. 즉, 디코딩 속도가 데이터 로딩의 병목이 될 수 있습니다.
  • 별도의 전처리가 필요할 수 있다 - STFT, Melspectrogram 등의 연산이 여기에 해당합니다.

그 외에, 일반적인 딥러닝 학습을 하다보면 누구나 겪게되는 상황이 있습니다.

  • 데이터가 커서 메모리에 다 안들어간다.
    • HDF? memmap?
  • 데이터를 추가하거나 데이터 전처리 파라미터를 편리하게 변경할 수 있어야한다.

이런 상황을 고려하면 해결책은 아래와 같습니다.

  • 저장 포맷
    • 디코딩이 끝난 오디오 데이터를 그대로, 파일마다 .wav (int16)나 .npy (numpy array, int16/float32/etc)로 저장
    • 예: audio_1.wav, audio_2.wav, ... audio_10000.wav
    • 장점: 로딩이 빠르다
    • 단점: mp3등 압축 코덱 대비 하드디스크 공간을 많이 차지한다. 그러나 대부분의 경우에 현실적으로 큰 문제가 아님. 하드디스크는 별로 안비싸고, 오디오 데이터셋이 보통 그렇게까지 크지 않음. 
  • 로딩 방식
    • 파이토치와 텐서플로 모두 데이터 로딩 모듈이 잘 짜여져있습니다. 각 모듈에서 데이터 인덱스(예: idx=10)를 받아서 파일을 하나 로딩하는걸 구현합니다.
    • 사용할때는 인덱스 ([1, 2, 3,.. ,10000])을 shuffle한 뒤에 순서대로 불러오면 됩니다.
    • 파이토치의 경우엔 예를들면 저는 이렇게 합니다 (소스).
    • 장점: 
      • 데이터를 쉽게 추가할 수 있음. 마찬가지로 shuffle도 다양하게 할 수 있음. (만일 hdf를 쓰면 연속된 메모리에서 불러와야 유리하므로 미리 셔플을하고 저장해야하는데 이 모든 데이터 준비 과정이 시간을 많이 잡아먹음)
      • 배치 사이즈만큼의 데이터를 불러오는 과정은 텐서플로/파이토치의 데이터 로딩이 알아서 멀티프로세싱으로 잘 수행하므로 편리하고 안정적임. 
  • 전처리
    • 가급적 대부분의 전처리를 gpu에서 수행 (stft 등)
      • 장점: 파라미터 변경이 쉬움. 나중에 모델을 배포하고 사용할때도 오디오 파일을 그대로 불러와서 진폭을 바꿔주고 (int16 --> float, [-1.0, 1.0]) 샘플링 레잇만 맞춰주면 바로 모델에 넣을 수 있어서 편리함. Dependency가 적어짐 (librosa같은 외부 라이브러리를 쓰지 않아도 되므로). 
      • 단점: gpu의 연산과 메모리를 조금 더 사용함.


Thursday, May 9, 2019

오디오 노멀라이즈(정규화) 방법 정리


오디오 신호를 입력받는 머신러닝이나 신호처리 시스템을 사용할 때는 입력받은 신호가 사용하기 적합하도록 다양한 처리를 해주곤 합니다. 가장 단순한 방법으로 오디오 신호의 레벨을 조정하는 노멀라이즈가 있습니다. 이번 포스트에서는 다양한 노멀라이즈 기법이 어떤 특징을 가지고 언제 적용할 수 있는지 알아보겠습니다.

용어

노멀라이즈(Normalize)는 정규화라고 번역하는경우가 많은데, 노멀라이즈에는 결과가 특정 기준에서 '1'이 된다는 의미를 함축하고있습니다. 좀 고민이 되는데 그냥 노멀라이즈라고 해버리겠습니다.

레벨 변경

우선 디지털 오디오 신호를 $x[n]$ 혹은 간단히 $x$라고 하겠습니다. 보통 노멀라이즈는 $x_{normalized} = K \times x$ 의 과정이 됩니다. $K>1$ 이면 소리가 더 커지는 증폭(amplification)이 되고 $K<1$이면 소리가 더 작아지는 감쇠(reduction)가 됩니다. 즉, 특별히 주파수별로 처리를 해주지 않는다면 소리의 특성은 그대로 남아있고 레벨만 변합니다. 청취자가 이 소리를 듣는 맥락이라면 이를 흔히 볼륨을 높이거나 낮춘다고 이야기합니다.

이제 노멀라이즈 기법에 대해 알아봅시다.

1. 진폭(Amplitude) 노멀라이즈 

디지털 도메인에서는 신호 $x$의 최댓값, 최솟값이 존재하죠. 정수로 표현하면 비트레잇에 따라 다르겠지만 Float으로 표현하면 $[-1, 1]$의 범위를 갖는것이 일반적입니다. 만일 $\text{max}(|x|)>1$인 신호가 있더라도 이를 오디오 '데이터'로 사용하는데는 별 문제가 없습니다. 즉, 이런 오디오 신호도 머신러닝 시스템의 입력값으로 사용할 수 있다는 말입니다. 물론 i) 시스템이 입력값의 크기와 무관한 성능을 보여야 하는지, ii) 실제로 원하는대로 작동하는지는 따로 점검을 해야겠지만요. 하지만 이를 그대로 재생한다면 진폭이 1이 넘는 구간은 제대로 소리가 나지 않습니다. 재생과정에서 이는 강제로 $[-1, 1]$구간이 되도록 짤리게되는데 이를 클리핑이라고 합니다. 클리핑이 난다, 클리핑이 뜬다, 등의 상황입니다.

정리하면, 재생하려는 오디오 신호는 진폭 노멀라이즈가 필요합니다.

2. 에너지(Energy) 노멀라이즈

에너지 노멀라이즈는 다소 상대적인 개념입니다. 신호 $x$와 $y$가 있을 때, 두 신호의 제곱의 합(의 평균)이 같아지도록 하는 과정입니다. 데이터셋에 신호가 많이 있다면 전체 신호의 제곱의 합(의 평균)이 전부 같아지도록 해야겠죠. 즉.. $\sum_n{x[n] ^ 2} / n $과 $\sum_n{y[n] ^ 2} / n $가 같아지도록 두 신호의 레벨을 조정하는 것입니다. RMS 에너지/볼륨 노멀라이즈라고도 이야기합니다.

진폭과 차이점은, 진폭보다는 에너지가 '실제로 사람이 들었을 때 느껴지는 두 신호의 크기'(=라우드니스)를 더 잘 나타내주기 때문에 에너지 노멀라이즈를 함으로써 두 신호의 '볼륨'이 같아지는 것(을 근사하는 것)이라고 볼 수 있습니다.

에너지 노멀라이즈는 머신러닝에서도 흔히 사용하는 방법입니다. 다만, 위에서도 이야기했듯이 에너지 노멀라이즈를 해주는게 학습하는 시스템의 특성과 잘 맞는지 고민해보고 사용해야합니다.

3. 라우드니스(Loudness) 노멀라이즈

우선 라우드니스의 개념을 알아보겠습니다. 위에서 제가 라우드니스를 '실제로 사람이 들었을 때 느껴지는 두 신호의 크기'라고 이야기했는데, 이 정의를 꼼꼼히 살펴볼 필요가 있습니다.

주관성

우선 소리의 크기 인지는 사람마다 다르므로 근본적으로 라우드니스는 주관적인 개념입니다. 그래도 뭔가 하긴 해야하니 '평균'적인 인지를 가정하겠습니다.

라우드니스는 주파수의 함수

에너지가 소리의 크기를 대략적으로 나타내주긴하지만 정확하진 않습니다. 에너지가 같은 신호라도 주파수가 다르면 라우드니스, 즉 체감상 느끼는 소리의 크기가 달라집니다. 예를 들어 사람은 3-5 kHz 대역의 소리에 예민하고, 주파수가 아주 낮아지거나 아주 높아지면 잘 듣지 못합니다. 그러므로 에너지가 같은 신호라도 $x$의 주 성분이 100 Hz에,  $y$의 주 성분이 3,000 Hz에 있다면 $y$의 라우드니스가 훨씬 큽니다. (물론 이것도 주파수 특성이 평탄한, 즉 100 Hz와 3,000 Hz의 소리를 둘 다 균일하게 재생하는 스피커나 이어폰을 사용하는 경우에 해당합니다.)

따라서 라우드니스를 맞춰주려면 주파수 분석을 해야합니다.

라우드니스는 레벨의 함수

그런데 그게 다가 아니고, 라우드니스는 레벨에 따라 달라집니다. 이걸 한번에 나타내주는 그림이 아래의 등청감곡선인데, i) 값이 주파수에 따라 달라서 선이 구불구불하고, ii) 구불구불한 패턴이 소리의 크기에 따라 다르다는 점을 이해하면 됩니다. 



따라서 정확한 라우드니스를 구하려면 주파수 분석뿐만 아니라 이 신호(signal)가 어떤 크기의 소리(sound)로 재생될지 알아야합니다.

..그런데 당연히 이걸 알 수가 없겠죠?
도대체 이 신호를 청취자가 들을 때 볼륨을 어떻게 설정하고 들을지 알 수가 없으니까요. 
애당초 디지털 도메인에 있는 신호에는 '라우드니스'라는 개념이 정의되지 않습니다. 

그렇지만 근사적으로 맞춰주고자할때는 위의 등청감곡선의 평균적인 분포를 이용하거나, 이를 더욱 더 근사한 A-weighting같은것을 사용합니다. 조금 신경을 쓴다면 예를들어 0 dBFS를 100 dB SPL과 같다고 가정하고 이를 기준으로 처리하는 방법도 있습니다.

마지막으로, 여러 신호를 균일하게 전처리하려는 목적은 아니지만 음성 신호 처리에서 사용하는 pre-emphasis도 라우드니스가 주파수의 함수이기 때문에 (구체적으로는 사람이 저주파수 성분을 잘 못듣기 때문에) 적용된다고 볼 수 있습니다.

4. Mu-law

Mu-law는 낮은 비트레잇(예: 8비트)으로도 최대한 좋은 음질을 얻기 위해 사용하는 방법입니다. 보통 16비트에서는 잘 사용하지 않습니다. 이 방법은 앞에서 소개한 노멀라이즈랑은 조금 다르지만 같이 소개하겠습니다. 

Mu-law는 웨이브넷에서 사용하면서 유명해졌죠. 웨이브넷은 오디오의 샘플을 직접 생성하는 뉴럴넷입니다. 그런데 최종 레이어에서 Softmax를 사용하고, 진폭 출력을 회귀(Regression)가 아니라 분류(Classification)문제로 보고 값을 예측합니다. 따라서 8비트 오디오를 생성하는 문제는 총 $2^8=256$개의 카테고리 중 정답을 고르는 문제인데, 이걸 16비트 오디오로 비트레잇을 올리면 $2^{16}=65536$개의 카테고리가 되어서 문제가 많이 어려워집니다. 이를 효율적으로 해결하기 위해 8비트 오디오를 사용하지만 mu-law를 활용했습니다. 다시말해, 진폭을 8비트로 양자화하는 방법중에서 결과가 듣기 좋도록(잡음이 덜 들리도록) 최적화하는 방법입니다.

Mu-law는 오디오를 더 높은 비트레잇의 오디오를 (예: 16비트) 더 낮은 비트레잇으로 저장하는 과정에서(예: 8비트) mu-law따라 저장하는것으로 미리 설정해줘야(=mu-law 인코딩을 수행한 뒤 저장)합니다. 다시말해 일반적인 8비트 오디오 신호를 다시 mu-law를 이용해 더 고음질로 저장하는것은 불가능합니다. 

5. 주파수 도메인 (STFT) 노멀라이즈

이건 오디오 신호처리보다 머신러닝에 국한된 이야기입니다. 상당수 연구에서 log STFT Magnitude $\log(M)=\log(|X|)=\log(|\text{stft}(x)|)$의 크기를 특정 구간으로 노멀라이즈합니다. 상황에 따라 $[0, 80]$, $[0, 120]$, $[-120, 0]$, $[-1, 1]$ 등.. 제각각입니다. 이쯤되면 오디오 신호라기보다는 입력 데이터의 값을 컨디셔닝해주는 것으로 보는게 더 알맞겠죠.

진폭에도 해당되는 이야기인데, 특히 오디오 신호나 STFT Magnitude를 생성하는 머신러닝 시스템이라면 출력값의 범위와 최종 레이어의 액티베이션 함수 등을 적절하게 선택해야겠죠. 예컨대 GANSynth에서는 마지막 레이어에 $Tanh$ 함수를 사용하지만, 가급적 함수의 선형 구간에 값이 해당되도록 하기 위해 STFT의 크기와 위상을 $[-1, 1]$로 노멀라이즈했습니다. 



이번 포스트는 여기까지입니다.




Sunday, May 5, 2019

블로그 통계

약 4년간 블로그를 운영했네요. 제 블로그의 방문 현황과 게시물 조회수등을 간략히 공유합니다.

게시물 누적 조회수

45334
29945
14951
13888
May 31, 2016, 9 comments
5076
4490
4016
3169
3106
3008


최근 일주일간 게시물 조회수

201
103
82
82
76
May 31, 2016, 9 comments
75
37
23
22
18


누적 방문 경로 


파편화가 긴했는데 구글과 페이스북이 압도적이군요. 

국가별 페이지뷰

South Korea
210146
United States
17518
Russia
12321
United Kingdom
3143
Japan
2900
Germany
1256
Ukraine
1189
France
915
Canada
786
Unknown Region
610

대략한국 유학생의 분포가 아닐까합니다. 우크라이나가 순위권에 있는것은 조금 의외군요.