Voice

[ Web Audio API ] Introduction

Design-loving front-end engineer 2022. 8. 31. 14:10

๐Ÿ”ด  Web Audio API

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์˜ค๋””์˜ค ์†Œ์Šค์— ๋ณ€ํ™”๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ์ด๋‹ค.

๊ธฐ๋ณธ์ ์ธ ์Œ์› ๋กœ๋”ฉ, ์žฌ์ƒ, ์ •๋ฆฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒจ๋‹, ๋””์Šคํ† ์…˜, ๋”œ๋ ˆ์ด ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์Œํ–ฅ ํšจ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ , ํŒŒํ˜• ๋ง‰๋Œ€๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋“ฑ ์Œ์› ๋ฐ์ดํ„ฐ์˜ ์‹œ๊ฐํ™”๋„ ์†์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๐ŸŸ   ๋™์ž‘ ๊ณผ์ •

Web Audio API์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ AudioContext ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ์‹œ์ž‘๋œ๋‹ค. AudioContext ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ Audio Node๋“ค์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ Audio Node๋“ค์€ ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“ˆ๋“ค์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ๋…ธ๋“œ๋“ค์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

  • GainNode : ์Œ์›์˜ ๋ณผ๋ฅจ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆ
  • PannerNode : ์Œ์›์— ํŒจ๋‹ ํšจ๊ณผ๋ฅผ ์ ์šฉํ•˜๊ณ  ์กฐ์ ˆ
  • AnalyserNode : ์Œ์›์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœ

ํ•˜๋‚˜์˜ AudioContext ์•ˆ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„๋ฅผ ํ˜•์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

 

๊ธฐ๋ณธ์ ์ธ Web Audio API์˜ ํ๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1๏ธโƒฃ  AudioContext ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

2๏ธโƒฃ  AudioContext ๋‚ด๋ถ€์— ์˜ค๋””์˜ค Source(Audio Input)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์˜ค๋””์˜ค ์†Œ์Šค๋Š” <audio> ํƒœ๊ทธ, Oscillator(๋ฐœ์ง„๊ธฐ), Raw PCM ๋ฐ์ดํ„ฐ, ์‹ค์‹œ๊ฐ„ Stream ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

3๏ธโƒฃ  Gain, Panner ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ Effector Node๋“ค์„ ์ƒ์„ฑํ•œ๋‹ค.

4๏ธโƒฃ  ์˜ค๋””์˜ค๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ์ตœ์ข… ๋ชฉ์ ์ง€๋ฅผ ์ •ํ•œ๋‹ค. ex) ๋…ธํŠธ๋ถ ์Šคํ”ผ์ปค

5๏ธโƒฃ  Source โžก๏ธ Effector โžก๏ธ Destination ์ˆœ์„œ๋Œ€๋กœ ์—ฐ๊ฒฐ์‹œํ‚จ๋‹ค.

 

๐ŸŸก  AudioContext ์ƒ์„ฑํ•˜๊ธฐ

 
const audioContext = new (window.AudioContext || window.webkitAudioContext)();

 

๐ŸŸข  ์˜ค๋””์˜ค Source ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

๐Ÿท๏ธ  createMediaElementSource : <audio /> ํƒœ๊ทธ๋กœ๋ถ€ํ„ฐ mp3, wav ๋“ฑ์˜ ์˜ค๋””์˜ค ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

๐Ÿท๏ธ  createBufferSource : Raw PCM ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ์Œ์› ๋ถˆ๋Ÿฌ์˜ค๊ธฐ.

๐Ÿท๏ธ  createMediaStreamSource : ์„ค์น˜๋œ ๋งˆ์ดํฌ ๋“ฑ์œผ๋กœ๋ถ€ํ„ฐ ์‹ค์‹œ๊ฐ„ ์Œ์› ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๐Ÿท๏ธ  createOscillator : ์ฃผํŒŒ์ˆ˜, ๋ณผ๋ฅจ, ํŒŒํ˜•์„ ๊ณ„์‚ฐํ•ด ๋งŒ๋“ค์–ด๋‚ด๋Š” ์†Œ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

 

๐Ÿ”ต  ์ŠคํŠธ๋ฆผ๊ณผ ๋ฒ„ํผ๋ž€?

์ŠคํŠธ๋ฆผ์ด๋ž€, ๋งˆ์ดํฌ์™€ ๊ฐ™์€ ์ž…๋ ฅ ์žฅ์น˜๋‚˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” ์ผ๋ จ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ฝ์–ด ๋“ค์ด๋ฉด์„œ, ์Šคํ”ผ์ปค์™€ ๊ฐ™์€ ์ถœ๋ ฅ ์žฅ์น˜๋‚˜ ๋™์˜์ƒ ํ”Œ๋ ˆ์ด์–ด๋กœ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๋‚ด๋ณด๋‚ด๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

์ŠคํŠธ๋ฆผ์ด ์žˆ๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ฐ์ดํ„ฐ ์ „์ฒด๊ฐ€ ๋‹ค์šด๋กœ๋“œ ๋˜์–ด์•ผ๋งŒ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ–ˆ์œผ๋‚˜, ์ŠคํŠธ๋ฆผ์ด ๊ฐ€๋Šฅํ•ด์ง€๋ฉด์„œ ๋™์˜์ƒ ์ŠคํŠธ๋ฆฌ๋ฐ, ์˜ค๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ ๋“ฑ์˜ ์„œ๋น„์Šค๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„ ๊ฒƒ์ด๋‹ค.

 

๋ฒ„ํผ๋ž€, ์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ๊ธˆ์”ฉ ์ฝ๊ณ , ์ €์žฅํ•˜๊ณ , ์ฒ˜๋ฆฌํ•˜๊ณ , ๋น„์šฐ๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ RAM ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ๋ถ€ ๊ณต๊ฐ„์ด ๋ฒ„ํผ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฒ„ํผ๋ž€, ํŠน์ • ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด๋‘๋Š” ๊ฐ์ฒด์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์•Œ์•„์„œ ํ™•๋ณดํ•˜๊ณ  ํ•ด์ œํ•˜๋Š” ๋“ฑ์˜ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋  ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ์— ๊ด€์—ฌํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์šฉ๋„๊ฐ€ ๋‹ค์–‘ํ•ด์ง€๋ฉด์„œ ์˜ค๋””์˜ค, ๋น„๋””์˜ค ๋ฐ ์›น์†Œ์ผ“ ํ†ต์‹ ์—์„œ ์‚ฌ์šฉํ•˜๋Š” Raw Binary Data๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฐ ํ•„์š”๊ฐ€ ์ƒ๊ฒผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํผ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

โšช  ArrayBuffer

๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋งŒํผ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

๋‹จ, ArrayBuffer๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ 0์œผ๋กœ ์ €์žฅํ•ด๋‘๋Š” ์—ญํ• ๋งŒ ํ•˜๋ฉฐ, ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์€ ๋ณ„๋„๋กœ ์ œ๊ณต๋˜๋Š” ArrayBufferView๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ArrayBufferView๋ž€ TypedArray, DataView๋ฅผ ํ†ต์นญํ•˜๋Š” ๋ง์ด๋ฉฐ, ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค.
  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, TypedArray๋„ Uint8Array, Float32Array ๋“ฑ์„ ํ†ต์นญํ•˜๋Š” ๋ง์ด๋ฉฐ, ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค.

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒ„ํผ(Buffer): ArrayBuffer, TypedArray ํŒŒํ—ค์น˜๊ธฐ!

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฒ„ํผ(Buffer)๋ฅผ ๊ตฌํ˜„ํ•œ ArrayBuffer, ArrayBufferView๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ ๋‹ค๋ฃฐ ๋‚ด์šฉ์„ ์š”์•ฝํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 1.  ๋ฒ„ํผ(Buffer)๋ž€? - ์ž„์‹œ๋กœ ๋ฐ”

curryyou.tistory.com

 

 

๐ŸŸฃ

 

 

๐ŸŸค