Skip to content
Published on

Web Audio API & 브라우저 오디오 2026 — AudioWorklet / Tone.js / Howler.js / Wavesurfer / Peaks.js / Meyda / Faust / Csound / Web Speech 심층 가이드

Authors

프롤로그 — 브라우저가 오디오 워크스테이션이 된 해

2026년 5월 현재, "브라우저에서 오디오"라는 말의 무게는 5년 전과 완전히 다르다.

  • Web Audio API는 W3C Working Draft에서 Candidate Recommendation으로 올라섰고, Level 2 사양이 안정화됐다.
  • AudioWorklet은 모든 메이저 브라우저(Chrome, Edge, Firefox, Safari)에서 GA가 됐고, ScriptProcessor는 사실상 사망 선고를 받았다.
  • Tone.js는 v15까지 왔고, Yotam Mann이 시작한 이 프로젝트는 이제 음악 프로그래밍의 사실상 표준이다.
  • Howler.js는 HTML5 게임 사운드의 절대 다수가 채택했다.
  • WaveSurfer.js v8, Peaks.js(BBC), Meyda 같은 분석/시각화 라이브러리가 DAW급 UI를 가능하게 한다.
  • Faust2WebAudio와 Csound on WebAssembly가 학술 DSP를 브라우저로 가져왔다.
  • WebRTC + Opus + WebTransport로 50ms 미만의 실시간 음성 협업이 가능해졌다.
  • Web Speech API의 SpeechRecognition·SpeechSynthesis는 데스크톱·모바일 모두에서 안정 동작한다.
  • 한국은 네이버 클로바 TTS·STT, 카카오 i Voice가 사실상 표준이고, 일본은 VOICEVOX·Coeiroink가 로컬·브라우저 양쪽에서 표준이 됐다.

이 글은 그 전체 지도를 한 번에 그린다. 어떤 도구가 어떤 자리를 차지하는지, 무엇이 사라졌고 무엇이 살아남았는지, 그리고 2026년에 새 프로젝트를 시작한다면 무엇을 골라야 하는지.


1. 2026년 Web Audio 지도 — 4분류

생태계는 크게 네 층으로 나뉜다.

[ 1층 ] 사양         — Web Audio API (W3C), Web Speech API
[ 2층 ] 저수준 도구  — AudioContext, AudioWorklet, OfflineAudioContext
[ 3층 ] 라이브러리   — Tone.js, Howler.js, Pizzicato.js, WaveSurfer.js, Peaks.js, Meyda
[ 4층 ] DSL/엔진     — Faust2WebAudio, Csound on Web, Web MIDI 기반 신스
[ 옆 축 ] 실시간/AI  — WebRTC + Opus, WebTransport, Coqui XTTS, Suno API, ElevenLabs API

각 층은 추상화의 수준으로 나뉜다. 1층은 표준이라 바꿀 수 없고, 2층은 모든 브라우저에 들어 있고, 3층은 골라 쓰는 라이브러리, 4층은 DSP 전문가의 영역이다.

영역추천 도구
게임 사운드Howler.js
음악·악기·시퀀서Tone.js
DAW UI 파형WaveSurfer.js
방송용 세그먼트 에디터Peaks.js
특징 추출(BPM, MFCC)Meyda
학술 DSP / 신스Faust2WebAudio, Csound on Web
화상 회의 / 음성 채팅WebRTC + Opus
브라우저 TTSWeb Speech API + 외부 API
한국어 TTS네이버 클로바, 카카오 i Voice
일본어 TTSVOICEVOX, Coeiroink

2. Web Audio API (W3C) — 모든 브라우저에서 GA

Web Audio API의 핵심은 그래프 기반 오디오 라우팅이다. JavaScript에서 노드를 만들어 연결하면, 오디오 처리는 브라우저의 별도 스레드(렌더 스레드)에서 돈다.

const ctx = new AudioContext()

// 노드 생성
const osc = ctx.createOscillator()
const gain = ctx.createGain()

// 그래프 연결: osc -> gain -> 출력
osc.connect(gain)
gain.connect(ctx.destination)

// 파라미터 설정
osc.frequency.value = 440 // A4
gain.gain.value = 0.2

// 재생
osc.start()
osc.stop(ctx.currentTime + 1)

2026년의 핵심 변화는 두 가지다.

  1. AudioParam 자동화 곡선setValueCurveAtTime이 모든 브라우저에서 정확히 같은 보간을 한다. 더 이상 폴리필이 필요 없다.
  2. AudioRenderCapacity — 렌더 스레드의 부하를 직접 측정해서 동적으로 노드 수를 조절할 수 있다(Chrome 121+, Safari 18+).

W3C 사양 자체의 표면적은 크지 않다. 약 30개의 노드 타입이 전부고, 이 노드들의 조합으로 거의 모든 오디오 처리가 가능하다.

노드 분류대표 노드
소스OscillatorNode, AudioBufferSourceNode, MediaElementSourceNode, MediaStreamSourceNode
이펙트GainNode, BiquadFilterNode, DelayNode, ConvolverNode, DynamicsCompressorNode, WaveShaperNode
분석AnalyserNode
공간PannerNode, StereoPannerNode, AudioListener
사용자 정의AudioWorkletNode
출력AudioDestinationNode, MediaStreamDestination

3. AudioContext + OfflineAudioContext + MediaStream / MediaElement

세 가지 컨텍스트가 있고, 각각 다른 용도다.

AudioContext — 실시간

기본 컨텍스트. 출력은 스피커 또는 헤드폰. 사용자 제스처(클릭, 키 입력)가 있어야 첫 재생이 시작된다. 모바일 Safari는 이걸 특히 엄격하게 본다.

OfflineAudioContext — 비실시간 렌더링

실시간보다 빠르게 오디오를 렌더링한다. WAV 익스포트, 오프라인 분석, 마스터링 미리듣기에 쓴다.

// 44.1kHz, 스테레오, 10초짜리 버퍼
const offline = new OfflineAudioContext(2, 44100 * 10, 44100)

const osc = offline.createOscillator()
osc.connect(offline.destination)
osc.start()
osc.stop(10)

const rendered = await offline.startRendering()
// rendered는 AudioBuffer — 그대로 WAV로 인코딩 가능

MediaElementAudioSourceNode — <audio> / <video>를 그래프에 연결

HTML5 audio/video 요소를 노드로 변환한다. iframe 임베드 비디오에는 못 쓴다 (CORS, autoplay 정책).

const audioEl = document.querySelector('audio')
const ctx = new AudioContext()
const source = ctx.createMediaElementSource(audioEl)
source.connect(ctx.destination)
// 이제 audioEl을 재생하면 ctx 그래프를 거쳐 출력된다

MediaStreamAudioSourceNode — getUserMedia 마이크

마이크 입력을 그래프에 넣는다. WebRTC 입력에도 같은 노드를 쓴다.

const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
const ctx = new AudioContext()
const mic = ctx.createMediaStreamSource(stream)
const analyser = ctx.createAnalyser()
mic.connect(analyser)
// analyser.getByteFrequencyData()로 실시간 스펙트럼을 뽑는다

4. AudioWorklet — ScriptProcessor의 무덤

여기가 2026년 가장 큰 변화 지점이다.

과거: ScriptProcessorNode를 메인 스레드에서 돌렸다. 버퍼 크기 256~16384 샘플, 지연이 컸고 GC가 끼면 클릭(드롭아웃)이 났다.

현재: AudioWorklet은 오디오 렌더 스레드에서 직접 도는 별도의 글로벌 스코프다. 메인 스레드와 무관하게 128 샘플 단위(약 2.6ms)로 계산된다.

// worklet.js — 렌더 스레드에서 도는 코드
class WhiteNoiseProcessor extends AudioWorkletProcessor {
  process(inputs, outputs, parameters) {
    const output = outputs[0]
    for (let channel = 0; channel < output.length; channel++) {
      const ch = output[channel]
      for (let i = 0; i < ch.length; i++) {
        ch[i] = Math.random() * 2 - 1
      }
    }
    return true // 노드를 살려둠
  }
}

registerProcessor('white-noise', WhiteNoiseProcessor)
// main.js — 메인 스레드에서 등록 후 사용
const ctx = new AudioContext()
await ctx.audioWorklet.addModule('worklet.js')
const noise = new AudioWorkletNode(ctx, 'white-noise')
noise.connect(ctx.destination)

AudioWorklet의 진가는 WebAssembly와의 결합이다. Rust나 C++로 짠 DSP 코드를 WASM으로 빌드해서 워클릿 안에서 돌리면, 네이티브에 가까운 성능을 낸다. Faust2WebAudio·Csound on Web 모두 내부적으로 이 패턴을 쓴다.

ScriptProcessorNode는 사양 문서에 DEPRECATED 도장이 찍혔다. 신규 코드에서는 절대 쓰면 안 된다.


5. Tone.js (Yotam Mann) — 음악 프로그래밍의 사실상 표준

Tone.js는 2014년 Yotam Mann이 시작했고, 음악 도메인 — 음표, 박자, 신스, 이펙트 체인 — 을 다루기 위한 추상을 제공한다.

import * as Tone from 'tone'

// 폴리포닉 신스 + 리버브
const reverb = new Tone.Reverb({ decay: 4 }).toDestination()
const synth = new Tone.PolySynth(Tone.AMSynth).connect(reverb)

// 시퀀서 — 16분음표 단위로 도는 루프
const seq = new Tone.Sequence(
  (time, note) => {
    synth.triggerAttackRelease(note, '8n', time)
  },
  ['C4', 'E4', 'G4', 'B4', 'C5', 'B4', 'G4', 'E4'],
  '8n'
)

await Tone.start() // 사용자 제스처 후
Tone.Transport.bpm.value = 120
Tone.Transport.start()
seq.start(0)

핵심 컴포넌트:

카테고리모듈
소스Oscillator, Synth, AMSynth, FMSynth, MonoSynth, PolySynth, Sampler, Player
이펙트Reverb, Delay, FeedbackDelay, Chorus, Distortion, Phaser, AutoFilter, Compressor
시간Transport(BPM 글로벌 클럭), Sequence, Loop, Pattern, Part
시그널Signal, Param, LFO, Envelope, ScaledEnvelope

Tone.js v15는 Note class가 완전 새로 작성됐다. 음표를 'C4' 같은 문자열뿐 아니라 { note: 'C', octave: 4, accidental: '#' } 형태로도 받는다. 음악 이론을 코드로 다룰 때 가장 직관적인 API다.


6. Howler.js — 게임 사운드의 절대 표준

Howler.js는 "복잡한 그래프는 모르겠고, 그냥 BGM이랑 효과음 재생만 하면 된다"인 사람을 위한 라이브러리다.

import { Howl, Howler } from 'howler'

const sfx = new Howl({
  src: ['shoot.webm', 'shoot.mp3'],
  volume: 0.5,
  rate: 1.2, // 피치 보존하면서 1.2배 속도
  sprite: {
    shoot1: [0, 200],
    shoot2: [300, 200],
  },
})

document.getElementById('fire').addEventListener('click', () => {
  sfx.play('shoot1')
})

Howler.volume(0.8) // 글로벌 마스터 볼륨

Howler.js의 장점:

  • 단일 객체로 다중 인스턴스 자동 관리(같은 효과음을 빠르게 여러 번 재생해도 풀링이 알아서)
  • 페이드 인/아웃, 시크, 스프라이트, 3D 패닝, 글로벌 음소거가 일관된 API로 통합
  • 코덱 자동 폴백 — WebM Opus가 안 되면 MP3로
  • 모바일 자동재생 정책 자동 처리

거의 모든 HTML5 게임 엔진(Phaser, Pixi.js + 별도 사운드, Construct 3 등)이 Howler.js를 기본 또는 옵션으로 권장한다.


7. Pizzicato.js — 신예 / 데클러레이티브

Pizzicato는 "오디오 노드 그래프를 객체 지향처럼" 다루게 해주는 라이브러리다. Tone.js보다 더 얇고, Howler.js보다 더 그래프 친화적이다.

import Pizzicato from 'pizzicato'

const sound = new Pizzicato.Sound({
  source: 'wave',
  options: { type: 'square', frequency: 220 },
})

const delay = new Pizzicato.Effects.Delay({
  feedback: 0.5,
  time: 0.3,
  mix: 0.5,
})

sound.addEffect(delay)
sound.play()

장점: API가 단순. 단점: 커뮤니티가 Tone.js만큼 크지 않아서 깊이 들어가면 자료가 부족하다. 실험·교육용으로 좋다.


8. WaveSurfer.js — 파형 시각화의 정석

WaveSurfer.js v8은 DAW 스타일 파형 디스플레이의 사실상 표준이다. 오디오 파일을 받아서 캔버스에 파형을 그리고, 재생 헤드, 영역 선택, 줌, 미니맵까지 모두 플러그인으로 지원한다.

import WaveSurfer from 'wavesurfer.js'
import RegionsPlugin from 'wavesurfer.js/dist/plugins/regions.esm.js'

const ws = WaveSurfer.create({
  container: '#wave',
  waveColor: '#888',
  progressColor: '#4af',
  height: 120,
  url: '/audio/example.mp3',
})

const regions = ws.registerPlugin(RegionsPlugin.create())

ws.on('ready', () => {
  regions.addRegion({
    start: 4,
    end: 8,
    color: 'rgba(0,255,0,0.2)',
    drag: true,
    resize: true,
  })
})

v8의 변화: 렌더링이 OffscreenCanvas + Web Worker로 옮겨가서, 1시간짜리 오디오도 메인 스레드를 멈추지 않고 렌더한다. 모바일에서도 매끄럽다.


9. Peaks.js (BBC R&D) — 방송용 세그먼트 에디터

Peaks.js는 BBC R&D가 만든 라이브러리다. 라디오 / 팟캐스트 편집에서 화자 분리, 광고 구간 마킹, 챕터 표시 같은 작업을 한다.

차별점:

  • 줌 가능한 두 단계 뷰 — 위에 미니맵, 아래에 줌된 상세 뷰
  • 사전 계산된 wave data 포맷(.dat) 지원 — 서버에서 미리 계산해두면 클라이언트는 그걸 받아서 즉시 그린다. 1시간 오디오를 클라이언트에서 디코드하지 않아도 됨
  • 포인트 / 세그먼트 API — 시간 위치에 마커를 찍고, 라벨을 붙이고, 드래그로 이동
import Peaks from 'peaks.js'

const options = {
  zoomview: { container: document.getElementById('zoomview') },
  overview: { container: document.getElementById('overview') },
  mediaElement: document.querySelector('audio'),
  dataUri: { json: '/audio/example.json' }, // 미리 계산된 파형 데이터
}

Peaks.init(options, (err, peaks) => {
  peaks.segments.add({ startTime: 10, endTime: 20, labelText: 'Ad break' })
  peaks.points.add({ time: 15.5, labelText: 'Chapter 2' })
})

방송국 워크플로에 최적화돼 있다. BBC Sounds 같은 서비스가 이걸 내부에서 쓴다.


10. Meyda — 오디오 특징 추출

Meyda는 실시간으로 오디오의 특징(feature) 을 뽑아내는 라이브러리다. MFCC, 에너지, RMS, 제로 크로싱 레이트, 스펙트럼 센트로이드, 크로마, 라우드니스 등.

import Meyda from 'meyda'

const ctx = new AudioContext()
const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
const source = ctx.createMediaStreamSource(stream)

const analyzer = Meyda.createMeydaAnalyzer({
  audioContext: ctx,
  source,
  bufferSize: 1024,
  featureExtractors: ['rms', 'spectralCentroid', 'mfcc', 'chroma'],
  callback: (features) => {
    console.log(features.rms, features.spectralCentroid)
  },
})

analyzer.start()

쓰임새:

  • BPM 추정 — 실시간 RMS 피크 검출
  • 음성 활동 감지(VAD) — RMS 임계값 + 스펙트럼 센트로이드
  • 악기 분류 — MFCC + 머신러닝 모델
  • 시각화 — 크로마를 시각화하면 화성 진행이 보인다

ML 모델과 결합해 브라우저에서 장르 분류, 가창 음성 인식 같은 데모를 만들 때 가장 흔하게 쓰는 도구다.


11. Faust2WebAudio — Faust DSL을 Web Audio로

Faust는 INRIA / GRAME에서 만든 함수형 오디오 DSP 언어다. 한 줄로 신스, 이펙트, 필터를 정의할 수 있고, 컴파일러가 C++/Rust/JS/WASM/AudioWorklet 등 여러 타깃으로 출력한다.

Faust 코드 예시(저역 통과 필터):

import("stdfaust.lib");
process = fi.lowpass(3, hslider("Cutoff", 1000, 50, 20000, 1));

이걸 faust2webaudiowasm 도구로 컴파일하면 AudioWorklet 기반의 JavaScript 노드가 나온다.

import { FaustAudioWorkletNode } from './lowpass.js'

const ctx = new AudioContext()
const node = await FaustAudioWorkletNode.create(ctx, 'lowpass')

document.querySelector('audio').addEventListener('play', (e) => {
  const src = ctx.createMediaElementSource(e.target)
  src.connect(node).connect(ctx.destination)
})

// 파라미터 자동화
node.setParamValue('/Cutoff', 800)

장점: DSP 알고리즘을 수학적으로 깔끔하게 표현. 단점: 학습 곡선. 신호처리 배경이 없으면 진입이 어렵다.


12. Csound on Web — WASM Csound

Csound는 1986년부터 있는 컴퓨터 음악 언어다. WebAssembly로 포팅돼서 브라우저에서 거의 그대로 돈다.

import { Csound } from '@csound/browser'

const csound = await Csound()
await csound.compileOrc(`
  instr 1
    iFreq = p4
    aSig oscili 0.3, iFreq
    outs aSig, aSig
  endin
`)
await csound.readScore('i1 0 2 440\ni1 2 2 880')
await csound.start()

Csound on Web의 의의: 학술·연구·실험 음악의 거대한 자산(40년치)이 브라우저에서 그대로 돈다. 옛 작품을 디지털 박물관에 올리거나, 전자음악 교육에 쓰기에 좋다.

내부적으로는 AudioWorklet + WASM 조합이다. 메인 스레드와 분리돼 있어 부하가 커도 UI는 멈추지 않는다.


13. WebRTC + Opus + WebTransport — 실시간 오디오

영상 회의, 게임 음성 채팅, 라이브 협업 음악의 핵심 스택이다.

WebRTC + Opus

WebRTC는 P2P 미디어 스트리밍의 표준. Opus 코덱은 16~512kbps 범위에서 음성·음악 모두 효율적으로 인코딩한다. 핸드오프 지연이 50ms 미만.

const pc = new RTCPeerConnection()
const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
stream.getTracks().forEach((t) => pc.addTrack(t, stream))

pc.ontrack = (e) => {
  const audio = new Audio()
  audio.srcObject = e.streams[0]
  audio.play()
}

// SDP offer/answer 교환은 별도 시그널링 채널로 — WebSocket 등

WebTransport — 새 옵션

WebTransport(HTTP/3 위의 QUIC 양방향 스트림)는 WebSocket을 대체하는 저지연 채널이다. WebRTC 데이터 채널보다 더 단순하고, 신뢰성 / 비신뢰성을 명시적으로 고를 수 있다. 게임 음성처럼 패킷 로스를 감수하고 지연을 줄이고 싶을 때 좋다.

2026년 현재 Chrome, Edge, Firefox에서 GA. Safari는 26버전부터 지원.


14. AI 오디오 — Coqui XTTS, Suno API, ElevenLabs

브라우저에서 AI 음성 생성은 두 길이다.

길 1: 서버 API 호출

ElevenLabs, OpenAI TTS, Suno(음악 생성) — 모두 REST/streaming API다.

const res = await fetch('https://api.elevenlabs.io/v1/text-to-speech/VOICE_ID/stream', {
  method: 'POST',
  headers: {
    'xi-api-key': API_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    text: 'Hello world',
    model_id: 'eleven_multilingual_v2',
  }),
})

const audio = new Audio()
audio.src = URL.createObjectURL(await res.blob())
audio.play()

스트리밍(MediaSource Extensions + Opus chunks)을 쓰면 첫 음절까지 200~300ms.

길 2: 클라이언트 로컬 추론

Coqui XTTS-v2가 Hugging Face Transformers.js로 브라우저에서 돈다. WebGPU 기반이라 초기 로딩(~500MB)이 크지만, 일단 로드되면 키워드 잠금처럼 외부 호출 없이 합성이 가능하다.

import { pipeline } from '@huggingface/transformers'

const synth = await pipeline('text-to-speech', 'coqui-ai/xtts-v2-onnx', {
  device: 'webgpu',
})

const audio = await synth('Hello from the browser')
const buffer = ctx.createBuffer(1, audio.audio.length, audio.sampling_rate)
buffer.copyToChannel(audio.audio, 0)
// 재생...

선택 기준: 품질 / 즉응성이면 API, 프라이버시 / 오프라인이면 로컬.


15. Web Speech API — 브라우저 내장 인식 + 합성

Web Speech API에는 두 부분이 있다.

SpeechRecognition — 음성 → 텍스트

const SR = window.SpeechRecognition || window.webkitSpeechRecognition
const rec = new SR()
rec.lang = 'ko-KR'
rec.continuous = true
rec.interimResults = true

rec.onresult = (e) => {
  for (const res of e.results) {
    console.log(res[0].transcript, res.isFinal)
  }
}

rec.start()

주의: Chrome은 구글 클라우드 서비스로 데이터를 보낸다. 프라이버시가 중요하면 로컬 Whisper.cpp(WASM)나 Vosk를 써야 한다.

SpeechSynthesis — 텍스트 → 음성

const utter = new SpeechSynthesisUtterance('안녕하세요')
utter.lang = 'ko-KR'
utter.rate = 1.0
utter.pitch = 1.0

const voices = speechSynthesis.getVoices()
utter.voice = voices.find((v) => v.lang === 'ko-KR' && v.name.includes('Yuna'))

speechSynthesis.speak(utter)

OS별 음성 엔진을 그대로 쓴다. macOS/iOS는 Apple의 Neural Voice, Windows는 Edge TTS와 같은 SAPI Voice, Android는 Google TTS. 품질 편차가 크다.


16. 한국 — 클로바 TTS / 카카오 i Voice

한국어 TTS 시장은 두 거인이 있다.

네이버 클로바 Voice

NCP(네이버 클라우드 플랫폼)에서 제공. 약 50개의 보이스 캐릭터(연령·성별·억양 다양), SSML 지원, 감정 톤 조절. 가격은 1000자당 ~3원(2026년 기준 — 정확한 가격은 공식 페이지 확인).

const res = await fetch('https://naveropenapi.apigw.ntruss.com/tts-premium/v1/tts', {
  method: 'POST',
  headers: {
    'X-NCP-APIGW-API-KEY-ID': CLIENT_ID,
    'X-NCP-APIGW-API-KEY': CLIENT_SECRET,
    'Content-Type': 'application/x-www-form-urlencoded',
  },
  body: new URLSearchParams({
    speaker: 'nara',
    text: '안녕하세요. 클로바입니다.',
    volume: '0',
    speed: '0',
    pitch: '0',
    format: 'mp3',
  }),
})
const blob = await res.blob()
new Audio(URL.createObjectURL(blob)).play()

카카오 i Voice

Kakao i Open Builder의 음성합성. 캐릭터 수는 클로바보다 적지만 카카오 생태계(카카오워크, 카카오 챗봇)와 통합이 강하다.

선택 기준:

  • 콘텐츠 캐릭터 다양성이 중요 → 클로바
  • 카카오 챗봇 / 카카오 i와 통합 → 카카오 i Voice
  • 비용 — 사용량별로 비교 견적 필요

브라우저에서 직접 호출은 CORS 때문에 보통 안 되고, 백엔드 프록시를 두고 부른다.


17. 일본 — VOICEVOX, Coeiroink

일본의 TTS 풍경은 한국과 매우 다르다. 무료 / 오픈소스 / 캐릭터 보이스가 강세다.

VOICEVOX

VOICEVOX는 Hihosaba Inc.가 운영하는 무료 TTS 엔진이다. 즌다몬, 시키코로네 같은 캐릭터 보이스가 유튜브·니코니코·게임에서 폭발적으로 쓰인다.

본체는 데스크톱 앱이지만, VOICEVOX Core(C++) + WASM 빌드가 있어 브라우저에서 돌릴 수 있다.

import { VoicevoxCore } from 'voicevox-wasm'

const core = await VoicevoxCore.create()
await core.loadModel(1) // 즌다몬

const audioQuery = await core.audioQuery('こんにちは', 1)
const wav = await core.synthesis(audioQuery, 1)

const ctx = new AudioContext()
const buf = await ctx.decodeAudioData(wav)
const src = ctx.createBufferSource()
src.buffer = buf
src.connect(ctx.destination)
src.start()

Coeiroink

Coeiroink는 또 다른 무료 TTS. MYCOEIROINK라는 시스템으로 사용자가 자기 목소리를 학습시킬 수 있다. 개인 크리에이터·유튜버가 자기 보이스를 만들어 쓰는 경우가 많다.

선택 기준:

  • 인기 캐릭터 보이스(즌다몬 등) → VOICEVOX
  • 자기 보이스 학습 / 개인화 → Coeiroink

법적 이용 약관(상업 이용 가부, 크레딧 표기 의무)이 캐릭터마다 다르니 반드시 확인할 것.


18. 누가 무엇을 골라야 하나

매트릭스로 정리.

목적추천 스택
HTML5 게임 BGM/SFXHowler.js
음악 시퀀서 / 신스Tone.js
DAW 스타일 파형 UIWaveSurfer.js + Tone.js
팟캐스트 / 라디오 편집Peaks.js
BPM·악기 분류 MLMeyda + TensorFlow.js
학술 DSP / 신스 연구Faust2WebAudio
전자음악 교육Csound on Web
음성 채팅WebRTC + Opus
저지연 라이브 (게임 음성)WebRTC 또는 WebTransport
브라우저 내장 TTSWeb Speech API
고품질 영어 TTSElevenLabs API
음악 생성Suno API
클라이언트 TTS (오프라인)Coqui XTTS via Transformers.js
한국어 TTS (서비스)클로바 / 카카오 i Voice
일본어 TTS (캐릭터)VOICEVOX
일본어 TTS (자기 목소리)Coeiroink

세 가지 큰 결정 축:

  1. 실시간 vs 비실시간 — 실시간이면 AudioContext + AudioWorklet, 비실시간이면 OfflineAudioContext.
  2. 음악 vs 게임 vs 분석 — 음악은 Tone.js, 게임은 Howler.js, 분석은 Meyda.
  3. 온라인 API vs 로컬 추론 — 품질·간편함이면 API, 프라이버시·오프라인이면 Transformers.js 기반 로컬 모델.

19. 마무리 — 브라우저는 오디오 워크스테이션이 되었다

5년 전만 해도 브라우저에서 오디오를 한다는 건 "장난감 수준"의 일이었다. 2026년의 브라우저는 다르다.

  • AudioWorklet으로 네이티브 수준의 저지연 DSP가 가능하다.
  • WASM으로 C/C++/Rust DSP 알고리즘을 그대로 실행한다.
  • Tone.js·Howler.js·WaveSurfer.js·Peaks.js·Meyda 같은 라이브러리가 각 영역의 사실상 표준이 됐다.
  • Faust2WebAudio·Csound on Web으로 학술 DSP가 브라우저로 들어왔다.
  • WebRTC + Opus + WebTransport로 50ms 미만의 실시간 협업이 가능하다.
  • Web Speech API + 클로바 / 카카오 / VOICEVOX / Coeiroink로 다국어 음성이 자연스럽다.
  • Coqui XTTS, ElevenLabs, Suno로 AI 오디오가 즉시 사용 가능하다.

이제 남은 건 도구를 골라 작품을 만드는 일이다. 이 글이 그 선택의 출발선이 되기를.


참고 / References