본문 바로가기
Projects/Flutter 프로젝트 갈아엎기 - eqTrainer

Flutter 프로젝트 갈아엎기 1

by potatosalad 2023. 4. 3.

eqTrainer?

 

노래 듣는 걸 좋아하는 저는 음향기기나 이론에도 관심이 좀 있어서, 그런 주제로 대화할 수 있는 커뮤니티 여러 곳을 자주 구경하곤 합니다.

그러한 커뮤니티를 둘러보면 여러 고민들을 마주할 수 있는데, 거의 항상 음향인의 모든 고민은 '더 좋은 소리를 듣고 싶다'는 열망에 닿아있는 것 같습니다.

 

맛, 향기, 디자인에도 개개인의 취향이 반영되듯이, '좋은 소리'라는 것에도 취향이 반영되어 있고, 이는 이어폰을 비롯한 음향기기를 생산하는 개발자도 마찬가지이기 때문에 제품들 간의 소리 특성이 사뭇 다른 모습을 갖고 있습니다.

 

문제는, '과연 저 제품이 내 취향에 맞는 소리를 가지고 있을까?'를 예측하기가 쉽지 않다는 점입니다.

내가 가방을 산다고 했을 때, 가방의 디자인이나 색상은 인터넷에 올라온 사진을 보면 쉽게 참고할 수 있고,

얼마 전 출시된 한정 민트초코라떼의 맛이 궁금하다면 직접 카페에 가서 마셔보면 되지만,

 

이어폰, 헤드폰은 비싼 가격도 가격이거니와, 음악 감상이라는 것이 워낙 마이너한 취향인 탓에 소리를 직접 들어볼 수 있도록 제품을 비치해두는 이른바 '청음샵' 자체가 손에 꼽을 정도로 적습니다. 서울은 그나마 환경이 나은 편이지만, 지방에서 거주하시는 분들은 소리를 직접 경험해볼 수 있는 기회가 상당히 한정되어 있다고 봐도 될 정도입니다.

이걸로 뭘 어떻게 비교하라는걸까

그래서 우리가 가방 사진을 찾아보듯이, 소리를 어렴풋이 '예상'할 수 있는 지표로 주파수 응답 그래프라고 하는 측정 데이터를 종종 사용하게 되는데, 아무래도 과학적인 측정 데이터 값을 그래프화한 이미지다보니 이걸 해석하기가 상당히 어렵습니다. 애초에 주파수 응답 그래프만으로 소리를 예측할 수 있느냐는 문제는 여전히 논란의 대상이기도 하고요.

 

어쨌든 한 가지 제품의 그래프만으로 소리를 예상하는 것은 상당한 숙련도가 쌓인 게 아닌 이상 어렵기 때문에, 보통은 내가 들어봤던, 또는 내가 지금 가지고 있는 기기와 그래프를 겹쳐서 비교하는 방식으로 소리를 '예측'하게 됩니다.

 

"초록색 그래프에 비해 상대적으로 80hz 이하의 그래프가 부풀어 있는 에어팟 프로 2는 극저음이 조금 더 잘 나오겠군"

"7~8k가 올라와 있는거보니, 에어팟 프로 2는 ER4XR보다 고음이 조금 더 잘 들리겠군"

이라고 아주 대략적으로 해석할 수는 있겠지만,

 

"나는 여성 보컬이 조금 더 가까이서 들렸으면 좋겠어" 라거나,

"하이햇 소리가 시원시원하게 들리는 이어폰 어디 없나?" 라는 고민을 주파수 그래프 만으로 해결하려면

어떤 주파수에서 어떤 소리가 들리는지 훈련을 통한 숙련도를 쌓을 필요가 있습니다.

이러한 배경 속에서 즐거운 음감생활을 위해 '귀를 훈련'하고자 하는 음향인들은 주로 하만 인터내셔널 그룹의 'How to Listen' 프로그램을 사용하고 있습니다. 한국음향학회에서 주관하는 '골든 이어 선발대회'에서 공식적으로 사용되는 도구이기도 해서, 많은 관심을 끌기도 했었습니다.

 

프로그램의 기능은 간단합니다.

 

재생되는 음악의 특정 주파수를 강조하거나 약하게 하고, 그렇게 변조된 음원 (EQ)와 원음 (Flat)을 서로 비교 청음하면서 어떤 주파수 영역이 변조되었는지 맞추는 퀴즈 형식으로 훈련이 진행됩니다.

 

직접 해보면 솔직히 재미는 없지만, 그래도 이 훈련을 반복하다보면 특정 주파수가 소리에 미치는 영향을 학습할 수 있게 되므로, 주파수 응답 그래프만으로 소리를 일부 예측하는데에 도움이 되기도 하고, 이퀄라이저 기능을 통해 이어폰, 헤드폰의 소리를 가다듬는다거나, 제품 비교를 하는데에 많은 도움이 됩니다.

 

가끔 커뮤니티에서 보이는 하우투리슨 개고수의 삶은 어떨까 궁금하기도 하다.

다시 처음으로 돌아와서, 하만의 하우투리슨은 정말 훌륭한 소프트웨어로 많은 음향인들에게 사랑을 받아왔지만, 2011년에 공개된 이후 업데이트가 끊기면서 음악감상의 중심이 스마트폰으로 옮겨온 2020년 이후에는 비슷한 훈련을 스마트폰으로 수행하고 싶어하는 목소리가 꾸준히 있어 왔습니다.

 

그래서 탄생한게 eqTrainer라고 할 수 있습니다.

eqTrainer의 문제점

 

그렇게 완성된 eqTrainer는 구글 플레이스토어에 올라가는데 성공했고, 인생 첫 프로젝트치고 나름 나쁘지 않은 반응을 얻었습니다.

그러나 eqTrainer에 존재하는 문제들로 하여금 완전한 재설계를 고민하게 만들었습니다.

1. Non-Real Time Filtering

제일 핵심과도 같은 문제라고 할 수 있습니다.

지금의 eqTrainer는 앞서 언급한 '특정 주파수를 강조하거나 약화시키는 기능'이 실시간으로 동작하지 않습니다.

 

프로젝트를 계획하기에 앞서, 아이폰과 안드로이드를 비롯한 다양한 플랫폼에서 동작할 수 있도록 Flutter 프레임워크를 사용해 앱을 개발하기로 결정했었는데, 그 때 당시에는 오디오에 실시간으로 필터를 입히는 DSP 관련 기능을 구현할 방법을 찾지 못했습니다.

 

그래서 지금은, 퀴즈를 시작하기에 앞서 사용자가 만든 오디오 클립을 가지고 ffmpeg를 활용하여 필터를 입힌 클립을 하나 더 만든 뒤,

두 개의 오디오 스트림을 만들어놓고 Flat 음원과 EQ 음원을 전환할 때 마다 하나의 스트림을 무음처리하는 방식으로 동작하고 있습니다.

 

실시간 필터링을 구현하지 못해서 궁여지책으로 선택한 방식이었는데,

1. 음원을 전환할 때마다 귀로 쉽게 인지할 수 있을 정도의 큰 딜레이가 발생했고,

2. 세션을 시작하기에 앞서 사용자가 추가한 오디오 클립에 필터를 입히는 변환 과정을 거쳐야하기 때문에 실행 시간 면에서나, 저장 공간 면에서나 비효율적인 모습을 보였습니다.

 

 

이 부분이 항상 마음에 들지 않았었는데, 얼마 전 ChatGPT가 유행할 때 쯤 이 문제를 물어봤더니 친절하게도 DSP 쪽으로 찾아보라는 답변을 해주었습니다.

 

 

물론 그 다음 답변은 형편없었지만 말이죠.

2. 유지보수하기 괴로운 코드

인생 첫 프로젝트였다보니, 기능 하나를 구현하기 위해 여기저기서 패키지를 끌어다 쓰는 과정에서 예시 코드를 무분별하게 가져다 쓰는, 마치 뒤도 돌아보지 않고 블럭 쌓듯이 앱을 만들었던 것 같습니다.

 

단도직입적으로 말하면 코드가 꽤나 복잡해서 차라리 제로베이스에서 시작하는게 낫지 않을까 싶을 정도였습니다.

Future of eqTrainer

이러한 배경을 뒤로 한채, 어떻게 eqTrainer를 효율적으로 개선시킬 수 있을까를 고민했고, 최종적으로는 Faust DSP를 플러터와 결합하면 Real Time 필터링이 가능하지 않을까 싶어서 도전 중입니다.

 

뭐... 예상대로 쉽게 풀리지는 않았네요. 다른 방법을 찾아보거나 조금 더 연구해봐야 할 것 같습니다.
어차피 iOS 개발할 맥도 없는 마당에, 굳이 다트 언어를 사용한 구현 방식을 고집할 필요가 있느냐는 생각도 듭니다.

댓글