TRENDSHIFT DAILY #19 · 2026.05.26 · PKALOGIROS

AudioMass
브라우저 한 탭에서 돌아가는 풀스택 오디오 편집기

설치 없이 audiomass.co에 접속하면 그 자리에서 MP3·WAV·FLAC을 잘라 붙이고, 노이즈를 빼고, 컴프레서·EQ·리버브를 걸어 다시 내보낸다. 서버는 한 줄도 거치지 않는다 — 모든 DSP가 브라우저 안에서 끝난다. 2.3k 스타를 가진 8년 된 바닐라 JS 단일 페이지 앱. 프레임워크 없음, 빌드 시스템 없음, npm install 없음. 그저 <script> 태그 24개와 WASM 모듈 3개의 합주.

한 줄 요약

"Audacity를 통째로 브라우저 탭 안에 욱여넣어, 설치·로그인·업로드 없이 바로 쓰게 만든 무료 웹 오디오 편집기"

Adobe Audition 같은 유료 도구는 라이선스가 비싸고, Audacity는 데스크탑 설치가 필요하다. AudioMass는 그 사이 빈틈을 메운다 — 로그인도 없고, 결제도 없고, 파일을 어디 서버로 보내지도 않는다. 드래그&드롭한 음원은 처음부터 끝까지 당신 브라우저 메모리 안에서만 산다. 작업이 끝나면 다시 다운로드할 뿐이다.

8년이 흘러도 살아남은 이유는 두 가지다. ① Web Audio API + WASM가 충분히 성숙해서 데스크탑 앱과 체감 차이가 거의 없다. ② Adobe·Audacity 같은 강자들이 가지 못한 "제로 인스톨 + 프라이버시" 자리를 혼자 차지하고 있다.

0도대체 무엇을 만드는 레포인가

웨이브폼·DSP·WASM — 처음 보는 말부터 정리하고 시작

이 레포는 웹브라우저 한 페이지 안에서 동작하는 본격 오디오 편집기다. 한 페이지짜리 토이가 아니라, Audacity가 데스크탑에서 해 주는 일(자르기·붙이기·노이즈 제거·이펙트·다중 트랙 믹싱·MP3 인코딩)을 거의 다 해낸다.

용어 풀이
웨이브폼 (Waveform)
소리의 크기를 시간 축으로 그린 그림. 오디오 편집기에서 가장 자주 보는 그 "들쭉날쭉한 띠"가 웨이브폼이다. 편집자는 이 그림을 보면서 "이 구간만 잘라" "여기 노이즈 들었네" 같은 판단을 한다. AudioMass는 wavesurfer.js라는 라이브러리로 이 그림을 캔버스에 그린다.
용어 풀이
Web Audio API
2014년 W3C 표준이 된 브라우저 내장 오디오 처리 엔진. AudioContext를 만들어 노드 그래프(소스 → 필터 → 게인 → 출력)를 그리면 그대로 실시간 DSP를 돌려 준다. 데스크탑 오디오 앱이 쓰는 ASIO·Core Audio의 웹 버전이라고 보면 된다. AudioMass의 핵심 엔진이 바로 이 위에 얹혀 있다.
용어 풀이
DSP (Digital Signal Processing)
디지털 신호 처리. 오디오 맥락에서는 "소리에 효과를 거는 모든 수학 연산"을 가리킨다. 컴프레서로 음량 다듬기, EQ로 특정 주파수 올리기, 리버브로 잔향 입히기 모두 DSP다. 보통 C/C++로 짠 무거운 코드인데, WASM 덕분에 브라우저에서도 돌아간다.
용어 풀이
WASM (WebAssembly)
C/C++/Rust로 짠 코드를 브라우저가 거의 네이티브 속도로 실행할 수 있게 해 주는 바이너리 포맷. AudioMass는 세 군데에서 WASM을 쓴다 — libflac(FLAC 인코딩, 138 KB), rnn_denoise(RNNoise 신경망 노이즈 제거, 235 KB), lz4-block-codec(세션 압축, 1.2 KB).
초보자용 비유

전기 기타로 비유하면 — 음악실에 가서 기타를 빌리고 앰프를 켜고 이펙트 페달을 깔고 녹음 장비를 세팅하는 게 데스크탑 오디오 편집기(Audacity)다. 반면 AudioMass는 "문 열고 들어가면 이미 모든 게 켜져 있고, 마이크 잭만 꽂으면 바로 녹음되는 부스" 같은 것. 설치도 없고, 다음에 와도 환경이 그대로 떠 있다.

다만 부스 안의 장비는 부스에 묶여 있다(브라우저 탭 닫으면 휘발). AudioMass는 .amss(자체 세션 포맷)로 작업을 LZ4로 압축해 IndexedDB에 저장하거나 파일로 내보내어 이 한계를 보완한다.

2.3k
GitHub stars
94%
JavaScript 비중
~10개
오디오 포맷 지원
0개
npm 의존성 (바닐라 JS)

1한 줄 요약 — 무엇을 하는 프로젝트인가

단어 한 개를 뺐을 때 의미가 깨지는 가장 짧은 설명

AudioMass는 "바닐라 자바스크립트와 Web Audio API·WASM만으로 만든, 서버 없이 브라우저에서 완결되는 본격 파형 편집기"다.

한 단어라도 빼면 의미가 깨진다.

한 가지 예시로 감 잡기

"노트북 마이크로 녹음한 잡음 섞인 보이스를 깨끗하게 정리하기"

audiomass.co에 접속해 마이크 권한을 허용하고 녹음 → ② 자동으로 rnn_denoise.wasm(RNNoise 신경망 노이즈 제거기)이 로드돼 잡음 제거 메뉴 활성화 → ③ "Effects → Noise Reduction" 클릭. 235 KB WASM 모델이 마이크 노이즈·키보드 클릭·에어컨 소음을 학습된 가중치로 분리한다.

④ 컴프레서로 다이내믹 다듬고 → ⑤ EQ로 저음 컷, 중음 살짝 부스트 → ⑥ Normalize로 음량 통일 → ⑦ "File → Export As MP3" 클릭하면 lame.js(534 KB의 LAME 인코더 JS 포팅)가 MP3로 인코딩 → 다운로드. 전 과정이 당신의 브라우저 안에서 끝난다.

2왜 8년째 살아남고 다시 트렌딩에 오르는가

2.3k 스타 레포가 2026년 5월 19위에 다시 오른 이유

AudioMass는 2018년부터 존재한 레포다. 그런데 2026년 5월 다시 TrendShift 19위에 올랐다. 새 기능 폭탄이 떨어진 것도, 거대한 마케팅이 있던 것도 아니다. 이유는 "시간이 흘러서 강점이 강점이 됐다"는 데 있다.

① 프라이버시·로컬 처리가 가치를 가진 시대

ChatGPT·Suno·ElevenLabs 시대에 음원 업로드 = 학습 데이터화의 의심이 깔린다. AudioMass는 "파일이 서버에 안 올라간다"가 핵심 가치. 회의 녹음·인터뷰·미공개 음원을 다루는 저널리스트·연구자·아티스트가 다시 찾는 이유다.

② "프레임워크 없는" 코드 자체가 학습 자료

React·Next 14·Svelte 5 같은 마법 같은 프레임워크에 익숙해진 사람들이 "Web Audio API와 Canvas만으로 진짜 앱이 만들어진다"는 사실을 새삼 학습 가치로 인식하기 시작했다. app.js를 열면 고전적인 모듈 패턴 + 이벤트 버스(fireEvent/listenFor) 한 가지로 전체 앱이 엮여 있다 — 프레임워크 없이도 거대한 SPA가 만들어진다는 살아 있는 증거.

③ WASM·AudioWorklet이 무르익은 시점

2018년 출시 당시엔 RNNoise WASM이 실험적이었고, AudioWorklet도 ScriptProcessorNode 시절이었다. 8년이 지나 둘 다 안정화됐고, AudioMass는 그 모두를 실전에서 합쳐 쓰는 가장 좋은 오픈 예제가 됐다 — 학습 자료 측면에서 다시 부상.

경쟁 제품설치가격다중 트랙특이점
Audacity (데스크탑)필요무료O윈도/맥/리눅스 풀 네이티브
Adobe Audition필요월 23.99$O업계 표준, 무거움
BandLab무료O업로드 필요, 클라우드 저장
SodaPhonic일부 유료X심플하지만 기능 부족
AudioMass없음무료O완전 로컬, 오픈소스, 8년 검증

3기술 스택 전체 지도

왜 이게 "풀스택"이 아니라 사실상 "프론트엔드 올인"인지

프론트엔드 (사실상 전부)

레이어기술역할
언어바닐라 JavaScript (ES5)전체 코드 94.3%, 트랜스파일·번들 없음
스타일plain CSSmain.css 61 KB 한 파일
오디오 코어Web Audio APIAudioContext·BufferSource·AnalyserNode·BiquadFilter
파형 렌더링wavesurfer.js (커스텀 fork)Canvas 기반 파형 그리기·줌·스크롤·리전 선택
실시간 녹음AudioWorkletrecorder-worklet.js — 오디오 스레드에서 PCM 캡처
백그라운드 분석Web Workertempo-worker.js — BPM 추정을 메인 스레드 밖에서
오프라인 동작Service Worker + PWAsw.js + manifest.json — 인터넷 없어도 동작

WASM 모듈 (C/C++ 코드를 브라우저로 가져온 세 가지)

WASM 파일크기원본 라이브러리역할
libflac.wasm138 KBlibFLAC (Xiph.Org)FLAC 인코딩/디코딩 (무손실 압축)
rnn_denoise.wasm235 KBRNNoise (Mozilla)신경망 기반 노이즈 제거
lz4-block-codec.wasm1.2 KBLZ4.amss 세션 압축

순수 JS로 포팅된 코덱

파일크기역할
lame.js534 KBLAME MP3 인코더 JS 포팅 — MP3 export 담당
flac.js3.6 KBlibflac.wasm 래퍼
wav.js3.2 KBWAV 인코더 (RIFF 헤더 + PCM)
id3.js22 KBMP3 ID3 태그 읽기/쓰기 (아티스트·앨범·아트워크)
lzma.js5.9 KBLZ4 블록 코덱 JS 래퍼 (lz4-block-codec-any.js) — IndexedDB 세션 압축

"백엔드"는 사실상 존재하지 않는다

유일한 "서버" 코드는 단 두 파일이며, 둘 다 로컬 개발 편의용이다.

audiomass-server.go (Go, 35줄) - 정적 파일 서버 + WASM MIME 타입 헤더 설정 + JS no-cache - 부팅 시 자동으로 Chrome 열기 (open -a "Google Chrome") - 포트 5055 audiomass-server.py (Python, 6줄) - http.server.SimpleHTTPRequestHandler 그대로 - Go 못 쓰는 사람을 위한 폴백

실제 운영(audiomass.co)도 정적 파일 호스팅 그 자체다. 서버 사이드 로직이 0줄. 백엔드 API 호출도 0회. 그래서 "프라이버시 우선"이 마케팅 멘트가 아니라 아키텍처의 자연스러운 결과다.

4아키텍처 심화 분석

바닐라 JS가 어떻게 거대 SPA를 끌고 가는가

시스템 전체 구조도

┌─────────────────────────────────────────────────────────┐ │ BROWSER TAB │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ index.html (단 한 페이지) │ │ │ │ ↓ 24개 <script> 태그를 순서대로 로드 │ │ │ └──────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ window.PKAudioEditor (전역 싱글톤) │ │ │ │ ─ fireEvent / listenFor (이벤트 버스) │ │ │ │ ─ _deps = { ui, engine, state, rec, ... } │ │ │ └──────────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ │ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │ ui │ │engine│ │state│ │ rec │ │ mrk │ │ amss│ │ │ │ .js │ │ .js │ │ .js │ │ .js │ │ .js │ │ .js │ │ │ └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘ └─────┘ └─────┘ │ │ │ │ │ │ │ │ │ ▼ │ ▼ │ │ │ ┌─────────┐ │ ┌──────────────┐ │ │ │ │ Web │ │ │ AudioWorklet │ │ │ │ │ Audio │ │ │ (마이크 캡처) │ │ │ │ │ API │ │ └──────────────┘ │ │ │ └────┬────┘ │ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌──────────────────────────────┐ │ │ │ WASM 모듈 / 코덱 │ │ │ │ libflac.wasm (FLAC) │ │ │ │ rnn_denoise.wasm (denoise) │ │ │ │ lame.js (MP3 인코딩) │ │ │ └──────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘ ↑↓ (정적 파일만) audiomass-server.go (포트 5055) ※ 데이터는 절대 서버를 거치지 않음

설계 패턴 ① 전역 싱글톤 + 이벤트 버스

app.js 한 줄에 핵심 설계가 담겨 있다.

// app.js (요약) w.PKAudioEditor = new PKAE (); // 전역 싱글톤 PKAudioList.push (w.PKAudioEditor); // 모든 모듈이 이 이벤트 버스로 대화 q.fireEvent = function (eventName, value, value2) { ... }; q.listenFor = function (eventName, callback) { ... }; q.stopListeningFor = function (eventName, callback) { ... };

모듈끼리 서로 직접 호출하지 않는다. 모두 fireEvent('StateRequestPush', state)처럼 이벤트 이름을 던지고, listenFor로 누가 듣는다. EventEmitter 패턴 — Node.js의 EventEmitter, React의 Context, RxJS의 Subject가 다 같은 뿌리다.

왜 이렇게 만들었나

모듈 24개가 서로 직접 import 한다면 모듈 그래프가 거미줄이 된다. 이벤트 버스를 끼우면 모든 모듈이 "버스 정거장"에 메시지를 던지고 누가 받든 신경 안 쓴다. engine.js가 파형을 바꿨으면 StateRequestPush 던져 두면 state.js가 알아서 undo 스택에 쌓는다. 새 모듈을 추가할 때 기존 코드 한 줄 안 건드린다.

설계 패턴 ② 명령형 Undo/Redo 스택 (state.js)

오디오 편집기에서 가장 까다로운 부분이 "잘라낸 1분짜리 오디오를 어떻게 되돌릴까"다. 텍스트 에디터처럼 줄 단위가 아니라, 수십 메가의 PCM 데이터를 통째로 다뤄야 한다. AudioMass의 해법은 "버퍼 자체를 stack에 push"다.

// state.js (요약) function currentStateFor (state) { var current = { data: app.engine.wavesurfer.backend.buffer // ← AudioBuffer 전체 }; if (state.type === 'mult') current.mt = app.multitrack.getState(); if (state.type === 'mrk') current.markers = app.mrk.ser(state.ctx); return current; } q.pushUndoState = function (state) { if (undo_state_list.length >= _depth) undo_state_list.shift(); // 최대 96개 undo_state_list.push (state); _fireEvent ('StatePush', undo_state_list.length); };

depth 96 — undo를 96번까지 되돌릴 수 있다. 96 × 큰 오디오 버퍼 = 메모리 폭발이 날 수 있지만 JS 엔진의 가비지 컬렉터를 신뢰하고, 96개를 넘으면 가장 오래된 것부터 shift로 버린다.

설계 패턴 ③ 의존성 주입 (_deps)

전역 싱글톤이지만 각 모듈이 자기 자신을 직접 w.PKAudioEditor.ui에 끼우지 않는다. 대신 q._deps.ui = PKUI로 "내 클래스 여기 등록해"라고 적어 두고, init() 시점에 한 번에 q.ui = new q._deps.ui(q)로 인스턴스화한다.

덕분에 모듈 로딩 순서가 바뀌어도 깨지지 않는다. engine.jsui.js보다 먼저 로드되든 나중이든, 둘 다 _deps에 등록만 해 두면 init()이 알아서 인스턴스를 만든다.

5디렉토리 구조 해부

각 파일의 역할 — 크기로 보는 책임 분배

src/ ├── index.html # 진입점 (단 한 페이지) ├── manifest.json # PWA 매니페스트 ├── audiomass-server.go # 로컬 개발 서버 (Go) ├── audiomass-server.py # 로컬 개발 서버 (Python 폴백) │ ├── app.js 4 KB # 전역 싱글톤 + 이벤트 버스 ├── state.js 3 KB # Undo/Redo 스택 (depth 96) ├── keys.js 3 KB # 단축키 ├── drag.js 5 KB # 드래그&드롭 파일 로딩 ├── contextmenu.js 5 KB # 우클릭 메뉴 ├── modal.js 11 KB # 다이얼로그 시스템 │ ├── engine.js 111 KB ★ 오디오 엔진 (Web Audio API 래핑) ├── ui.js 110 KB ★ 메인 UI 렌더링 (캔버스 + DOM) ├── ui-fx.js 104 KB ★ 이펙트 UI (컴프·EQ·리버브 등의 다이얼로그) ├── actions.js 67 KB ★ 사용자 액션 처리 (잘라내기·붙이기·내보내기) ├── multitrack.js 158 KB ★ 다중 트랙 (DAW 모드) │ ├── fx-pg-eq.js 80 KB # 파라메트릭/그래픽 EQ ├── fx-auto.js 12 KB # 자동화 (Volume/Pan 오토메이션) ├── rnn_denoise.js 84 KB # RNNoise WASM 래퍼 (노이즈 제거) ├── rnn_denoise.wasm 235 KB # RNNoise 모델 바이너리 │ ├── recorder.js 11 KB # 마이크 녹음 ├── recorder-worklet.js 1 KB # AudioWorklet (실시간 PCM 캡처) │ ├── tempo-estimator.js 5 KB # BPM 추정 ├── tempo-worker.js 0.8 KB # Web Worker (BPM 백그라운드 계산) │ ├── lufs.js 5 KB # LUFS 음량 측정 (방송 표준) ├── markers.js 14 KB # 마커/리전 시스템 │ ├── lame.js 534 KB # LAME MP3 인코더 (JS 포팅) ├── libflac.js 339 KB # FLAC 인코더 (JS 래퍼) ├── libflac.wasm 138 KB # FLAC WASM 바이너리 ├── flac.js 4 KB # FLAC 고수준 API ├── wav.js 3 KB # WAV 인코더 ├── id3.js 22 KB # MP3 ID3 태그 │ ├── amss-format.js 9 KB # AudioMass 자체 세션 포맷 ├── lzma.js 6 KB # LZ4 블록 코덱 JS 래퍼 (세션 압축) ├── lz4-block-codec-wasm.js 7 KB # LZ4 압축 ├── lz4-block-codec.wasm 1 KB │ ├── welcome.js 3 KB # 첫 방문 안내 ├── local.js 6 KB # localStorage / IndexedDB 관리 ├── oneup.js 0.7 KB # 단일 인스턴스 lock ├── sw.js 2 KB # Service Worker (PWA 오프라인) │ ├── main.css 62 KB # 전체 스타일 (한 파일) ├── main.build.css 44 KB # minified └── dist/ # wavesurfer.js 빌드 결과

핵심 관찰 — 큰 파일은 거의 다 UI나 이펙트다. Web Audio API 자체가 DSP를 다 해 주기 때문에 "오디오 엔진"보다 "오디오 엔진을 조작하는 UI"가 압도적으로 크다. 데스크탑 앱과 정반대 구조다.

6학습 포인트 (기술별)

이 레포에서 무엇을 배워 가는가

① Web Audio API의 실전적 활용

engine.js 111 KB를 읽으면 다음을 배운다 — AudioContext 라이프사이클, AudioBuffer를 PCM Float32Array로 직접 다루기, BiquadFilterNode 체인으로 EQ 만들기, DynamicsCompressorNode로 컴프레서/리미터 구현, ConvolverNode로 리버브, ChannelSplitter/ChannelMerger로 채널 분리.

실습 아이디어
"마이크 입력을 받아 5밴드 EQ를 실시간 적용하는 50줄 짜리 데모"

AudioMass의 fx-pg-eq.js에서 BiquadFilter 5개를 직렬 연결하는 패턴만 베껴서 미니 EQ를 만들어 보면 Web Audio API 그래프 사고가 잡힌다.

② WASM을 JS와 섞어 쓰는 법

rnn_denoise.js(84 KB)는 RNNoise C 라이브러리를 Emscripten으로 WASM 변환한 결과다. JS ↔ WASM 메모리 공유(HEAPF32에 PCM 쓰고, WASM 함수가 같은 메모리 읽기), WASM 함수 호출 비용 최소화(작은 호출 여러 번 대신 큰 버퍼 한 번에) 같은 실전 패턴이 들어 있다.

③ 프레임워크 없이 거대 SPA를 끌고 가는 패턴

app.js + state.js 조합을 분석하면 이벤트 버스 + 의존성 주입 + 명령형 undo 스택이라는 세 패턴만으로도 25개 모듈이 협업할 수 있다는 사실을 본다. React/Redux에 익숙해진 사람에게 좋은 역방향 학습.

④ AudioWorklet — 메인 스레드에서 분리된 오디오 처리

recorder-worklet.js는 30줄짜리지만 의미가 크다. 옛 ScriptProcessorNode는 메인 스레드에서 돌아 UI를 끊었다. AudioWorklet은 별도 오디오 렌더링 스레드에서 돌아 글리치가 없다. 마이크 녹음 앱을 만들 때 가장 정확한 현대적 방법.

⑤ PWA + 오프라인 첫 경험

manifest.json + sw.js로 "한 번 열어 두면 인터넷 없어도 동작한다". 모든 정적 자원을 Service Worker가 캐싱한다. 실용 PWA 구조의 최소 예시.

⑥ LUFS — 방송·스트리밍의 음량 표준

lufs.js(5 KB)는 ITU-R BS.1770-4 표준을 구현한다. Spotify·YouTube·넷플릭스가 음량을 맞추는 그 알고리즘이다. K-weighting 필터, gating, integrated/short-term/momentary 세 가지 측정값 계산을 단 5 KB에 담아 둔 좋은 참고 코드.

7하드웨어/시스템 요구사항

브라우저 한 탭이 다지만, 결코 가볍지는 않다

실전 주의
긴 오디오 + 여러 이펙트 = 메모리 한계

30분짜리 팟캐스트(300 MB)에 Undo 10번 + 컴프레서 + EQ 걸면 브라우저 메모리가 3~4 GB로 치솟는다. 모바일 브라우저는 OS가 탭을 죽일 수 있다. 긴 작업은 데스크탑에서, 중간중간 .amss로 저장하는 습관 필요.

8직접 해볼 수 있는 실습 과제

난이도별 5개 — 코드 안 읽고도 시작 가능

난이도 ★

실습 1. 회의 녹음 정리

Zoom·구글미트로 녹음한 1시간짜리 MP3를 AudioMass에 드롭 → 시작 인사·끝 잡담 자르기 → Noise Reduction으로 에어컨 잡음 제거 → Normalize로 음량 통일 → MP3 export.

학습 포인트: 리전 선택, 잘라내기, 이펙트 체인의 일반 흐름.

난이도 ★★

실습 2. 팟캐스트 인트로 만들기

다중 트랙(Multitrack) 모드 켜고 → 배경 음악 트랙 + 보이스 트랙 두 개 올리기 → 보이스 시작 4초 전부터 배경 음악 페이드아웃 자동화 → LUFS 측정해서 -16 LUFS(Spotify 권장)에 맞춤 → WAV export.

학습 포인트: 다중 트랙 믹싱, 오토메이션, LUFS 표준.

난이도 ★★★

실습 3. 소스 코드 읽어서 미니 EQ 클론 만들기

engine.js에서 BiquadFilterNode를 어떻게 체인으로 잇는지 분석 → 50~100줄짜리 HTML 한 페이지로 3밴드 EQ(저음·중음·고음) 만들기 → 슬라이더 움직이면 실시간 적용.

학습 포인트: Web Audio API 노드 그래프, 필터 유형(lowshelf/peaking/highshelf), 게인.

난이도 ★★★★

실습 4. AudioWorklet로 마이크 입력 시각화

recorder-worklet.js를 모델로 → 마이크 입력 PCM을 받아 → 같은 워크릿에서 RMS 계산 → 메인 스레드로 postMessage → Canvas에 막대 그래프(VU 미터)로 그리기.

학습 포인트: AudioWorklet 등록·메시지 전달, 오디오 스레드와 메인 스레드 분리.

난이도 ★★★★★

실습 5. AudioMass를 셀프호스트하고 도메인 붙이기

리포지토리 clone → go run audiomass-server.go로 로컬 확인 → Nginx 정적 호스팅으로 옮기기 → 자체 도메인 + HTTPS(Let's Encrypt) → 회사 인트라넷 전용 오디오 편집기로 운영.

학습 포인트: 정적 사이트 배포, MIME 타입 설정(WASM은 application/wasm), Service Worker 캐싱 전략, 마이크 권한 요구하는 HTTPS 환경.

9관련 기술 심화 학습 로드맵

8주 코스 — AudioMass를 기반으로 웹 오디오 마스터 되기

1주차 — Web Audio API 기본

MDN Web Audio API 튜토리얼 정독. AudioContext, AudioBufferSourceNode, GainNode, destination 노드 그래프 그려 보기. 가장 단순한 "재생/일시정지/볼륨 조절" 만들기.

2주차 — 노드 종류 마스터

BiquadFilterNode(EQ), DynamicsCompressorNode, ConvolverNode(리버브), DelayNode, AnalyserNode(FFT). 각각 1시간씩 데모 만들기.

3주차 — 파형 시각화

wavesurfer.js 공식 예제 → 직접 Canvas에 그리기로 옮겨 보기. AudioBuffer.getChannelData()로 Float32Array 받아 peak/RMS 계산해서 그리는 알고리즘 익히기.

4주차 — 녹음과 AudioWorklet

getUserMedia로 마이크 권한 받기. AudioWorklet 등록·통신·PCM 캡처. 옛 ScriptProcessorNode와의 차이.

5주차 — AudioMass 코드 리딩

app.js → state.js → engine.js → actions.js 순서로 읽기. 이벤트 버스 패턴 추적. 큰 파일이지만 모든 함수가 이벤트 하나에 묶여 있어 따라가기 쉽다.

6주차 — WASM 통합

Emscripten 설치 → C로 짠 단순 DSP(예: 단순 reverb)를 WASM 빌드 → JS에서 호출. rnn_denoise.js 구조 참고.

7주차 — DSP 이론

"The Scientist and Engineer's Guide to DSP" 1~5장. FFT, 필터 설계, 윈도잉. Web Audio가 가려 주는 수학을 본격 학습.

8주차 — 완성 프로젝트

본인만의 미니 오디오 앱 만들기. 예: 보컬 추출기(스테레오 차 + 노이즈 제거), 라이브 코러스 메이커, 노래방 모드 만들기 등.

10핵심 키워드 사전

레포에 등장하는 기술 용어 한 줄 풀이

FORMAT
AudioBuffer
Web Audio API의 표준 PCM 데이터 컨테이너. Float32Array로 채널별 샘플 값(-1.0 ~ +1.0)을 들고 있다. AudioMass의 모든 편집은 이 객체를 잘라 붙이고 다시 만드는 과정.
DSP
BiquadFilter
2차 IIR(무한 응답) 디지털 필터. 적은 연산으로 lowpass·highpass·peaking·shelf 등 다양한 필터를 만들 수 있어 Web Audio API가 기본 제공. EQ의 기본 단위.
DSP
Compressor / Limiter
큰 소리만 줄여서 전체 음량 폭(다이내믹 레인지)을 좁히는 효과. 컴프레서는 부드럽게, 리미터는 천장처럼 딱 자른다. DynamicsCompressorNode로 구현.
MEASUREMENT
LUFS (Loudness Units Full Scale)
사람이 느끼는 음량을 정량화한 ITU-R BS.1770 표준 단위. Spotify -14 LUFS, YouTube -14 LUFS, 넷플릭스 -27 LUFS 식으로 플랫폼별 권장 값이 다르다.
NEURAL
RNNoise
Mozilla가 만든 작은 RNN(순환신경망) 기반 노이즈 제거 모델. 약 240 KB로 화이트노이즈·키보드 클릭·에어컨 소음 등을 학습 가중치로 분리. AudioMass의 노이즈 제거 메뉴는 이걸 WASM으로 돌린다.
CODEC
LAME
대표적인 무료 MP3 인코더. 원래 C로 작성됐고 AudioMass는 그것의 JS 포팅(lame.js 534 KB)을 사용해 브라우저 안에서 MP3 export를 가능케 한다.
WEB
AudioWorklet
2018년 ScriptProcessorNode를 대체한 차세대 API. 별도 오디오 렌더링 스레드에서 PCM을 처리하므로 메인 스레드 GC·React 렌더로 인한 오디오 글리치가 사라진다. 실시간 녹음·DSP의 표준.
FORMAT
FLAC
Free Lossless Audio Codec. WAV처럼 무손실이지만 50~60% 크기로 압축된다. AudioMass는 libFLAC을 WASM(138 KB)으로 가져와 export를 지원.
CONCEPT
PWA (Progressive Web App)
웹 사이트를 앱처럼 설치하고 오프라인에서도 쓸 수 있게 만드는 표준. manifest.json + Service Worker 두 가지가 핵심. AudioMass는 "홈 화면에 추가"로 데스크탑 아이콘이 박힌다.
CONCEPT
Event Bus / Pub-Sub
모듈끼리 직접 호출 안 하고 "이벤트 이름"을 던지는 패턴. 발신자는 누가 받는지 모르고, 수신자는 누가 보냈는지 모른다. 결합도가 낮아 모듈 추가·제거가 자유롭다. app.jsfireEvent/listenFor가 그 구현체.

11참고 링크

레포·라이브 데모·관련 학습 자료

한 줄로 시작하기

지금 당장 audiomass.co를 열어 본인 목소리를 녹음·편집·export 해 보라

  1. 접속audiomass.co 열기. 설치 없음. 로그인 없음.
  2. 녹음 — 좌상단 마이크 아이콘 → 권한 허용 → 30초 말하기 → Stop.
  3. 편집 — 시작/끝 잡음 구간 드래그 선택 → Delete. 메뉴 "Effects → Noise Reduction" 한 번.
  4. 이펙트 — Effects → Compressor (기본값) → Normalize.
  5. 내보내기 — File → Export As → MP3 (또는 WAV/FLAC). 다운로드되는 그 순간까지 본인 컴퓨터 밖으로 데이터가 나간 적이 0회임을 확인.
분석 기준: 2026.05.26 · TrendShift Daily #19 · pkalogiros/AudioMass · ★ 2.3k / Fork 277 · License MIT · 분석 대상 코드: src/ 디렉터리 전체 (≈40개 파일), README, audiomass-server.go, audiomass-server.py, app.js, state.js, index.html, manifest.json