웹 페이지에서 마이크를 통해 음성을 입력받고, 볼륨을 시각화 하는 과정을 정리합니다.

바닐라로 개발한 예제코드는 아래에서 확인할 수 있습니다. https://codepen.io/vchgekmq-the-flexboxer/pen/MWLVJeO?editors=1111

<aside> 📝 목차

</aside>

1. 마이크를 통해 사용자의 음성을 입력 받기

navigator.mediaDevices
    .getUserMedia({ audio: true }) // 마이크 권한을 요청
    .then((stream) => {            // 마이크 권한 요청 성공
      isReording = true;
      audioStream = stream;
		})

		//
		// (볼륨 시각화 코드)
		//

		.catch((error) => {
			console.error("마이크 권한 획득 실패", error);
		});
};

우선 navigator.mediaDevices.getUserMedia({ audio: true }) 는 사용자에게 마이크 권한을 요청하는 부분입니다.

2. 입력된 오디오 볼륨을 정규화 하기

const context = new AudioContext();
const analyser = context.createAnalyser();
const mediaStreamAudioSourceNode = context.createMediaStreamSource(stream);
mediaStreamAudioSourceNode.connect(analyser, 0);
const pcmData = new Float32Array(analyser.fftSize);

const onFrame = () => {
  analyser.getFloatTimeDomainData(pcmData);
  let sum = 0.0;
  for (const amplitude of pcmData) {
    sum += amplitude * amplitude;
  }
  const rms = Math.sqrt(sum / pcmData.length);
  const normalizedVolume = Math.min(1, rms / 0.5);
  colorVolumeMeter(normalizedVolume);
  onFrameId = window.requestAnimationFrame(onFrame);
};

onFrameId = window.requestAnimationFrame(onFrame);

사용자가 입력하는 오디오의 볼륨을 0~1 사이의 값으로 정규화 하는 과정입니다.