본문 바로가기
JavaScript

[Javascript] 내 음성을 raw pcm data format 음원에 저장하기.

by teamnova 2023. 5. 26.
728x90

raw pcm data format 음원이란?

header가 없이 raw data만 저장한 파일입니다.

따라서 pcm 포맷으로 저장된 오디오는 별도로 오디오에 대한 정보( sampling rate, bit size, endian, channels )를 가지고 있지 않으면 제대로 play할 수 없습니다.

 

 

저는 sampling rate, bit size, endian, channels 을 

16kHz Sampling rate, 16 bit short-int, little-endian, mono 로 설정했지만

변수값을 바꾸면 다른 값으로도 변경 가능합니다!

 

 

실행결과입니다.

음원을 생성한 뒤 ETRI 서버에게 STT를 요청해서, 생성한 음원을 텍스트로 출력해봤습니다.

 

위의 영상에서 만든 음원입니다!

example (1).wav
0.13MB

 

STT 예제는 아래의 링크를 들어가시면 됩니다.

2023.05.22 - [Nodejs] - [Node.js] ETRI OpenAPI의 음성인식 api 사용해보기 (STT)

 

 

 

전체 코드입니다!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

  <!-- // RecordRTC 라이브러리 로드
  // import RecordRTC from 'recordrtc'; -->
    <script src="https://www.WebRTC-Experiment.com/RecordRTC.js"></script>

    <script>

    let audioRecorder;

    function start(){


      // getUserMedia로 오디오 스트림(나의 음성) 가져오기
      navigator.mediaDevices.getUserMedia({ audio: true })
        .then(function (stream) {
  
          // 오디오 스트림을 녹음하기 위한 RecordRTC 객체 생성
          audioRecorder = RecordRTC(stream, {
            type: 'audio',
            mimeType: 'audio/raw',
            recorderType: StereoAudioRecorder,
            // mono
            numberOfAudioChannels: 1,
            desiredSampRate: 16000,
            bufferSize: 16384,
          });

          // 녹음 시작
          audioRecorder.startRecording();

      })
      .catch(function (error) {
        console.error('getUserMedia error:', error);
      });

    }

  function recordStop(){

    console.log("stop")
    // 녹음 중지
    audioRecorder.stopRecording(function() {
        console.log("stopRecording")
        // 녹음된 오디오 데이터를 Blob 객체로 가져오기
		let audioBlob = audioRecorder.getBlob();
        const url = window.URL.createObjectURL(audioBlob);
        const a = document.createElement('a');
        a.href = url;
        a.download = 'example';
        // 파일 다운로드
        a.click();
        setTimeout(() => {
        window.URL.revokeObjectURL(url);
        }, 100);
        
      });


  }

    </script>
    

    <button onclick="start()">시작</button>
    <button onclick="recordStop()">중지</button>

</body>
</html>