마이크로 폐활량을 측정할 수 있을까? — 비눗방울 게임의 오디오 분석
비눗방울 게임을 구상하면서 가장 먼저 부딪힌 문제는 단순했습니다. 브라우저에서 마이크로 들어오는 "부는 소리"를 어떻게 숫자로 바꿀 것인가. 다행히 웹 오디오 API(Web Audio API)에는 AnalyserNode라는 도구가 있어서, 마이크 입력을 실시간으로 분석할 수 있습니다.
소리 크기를 숫자로 바꾸는 법
가장 흔히 쓰이는 방식은 RMS(Root Mean Square, 제곱평균제곱근)입니다. 짧은 시간 동안의 음압 파형 샘플을 제곱해서 평균 낸 뒤 다시 제곱근을 취하면, 순간적인 잡음에 휘둘리지 않는 안정적인 '평균 음량' 값을 얻을 수 있습니다. 이 값이 일정 기준을 넘으면 "지금 불고 있다"고 판단하는 방식으로 게임을 설계했습니다.
예상치 못한 복병, 브라우저의 친절함
그런데 첫 테스트에서 마이크에 숨을 세게 불어도 반응이 거의 없었습니다. 원인을 찾다가 알게 된 사실은, 브라우저가 기본적으로 영상통화 품질을 위해 마이크 입력에 에코 제거, 자동 이득 조절, 그리고 노이즈 억제 기능을 자동으로 걸어둔다는 것이었습니다. 이 기능들은 사람 목소리를 또렷하게 만들기 위해 설계된 것이라, 정작 "후~" 하는 넓은 대역의 바람 소리는 잡음으로 오인해서 걸러버리고 있었습니다. 이 세 가지 기능을 명시적으로 꺼주고 나서야 숨소리가 온전히 들어오기 시작했습니다.
매 라운드 다시 재는 기준선
또 하나 신경 쓴 부분은, 사람마다 마이크 환경이 다르다는 점입니다. 조용한 방과 시끄러운 카페의 배경 소음 수준은 천차만별이니까요. 그래서 게임을 시작할 때마다 0.7초간 조용히 있게 하고 그동안의 평균 음량을 '소음 기준선'으로 잡은 뒤, 그 위로 얼마나 큰 소리가 들어오는지를 상대적으로 계산합니다. 너무 세게 불면 방울이 터지고, 숨이 끊기면 그 자리에서 크기가 확정되는 것도 전부 이 기준선 위의 상대적인 음량 변화로 판정됩니다. 정밀한 폐활량계는 아니지만, 브라우저 마이크 하나로 이 정도의 재미있는 측정이 가능하다는 게 흥미로웠습니다.