본문 바로가기
ML

웨이브(.wav) 파일 헤더 분석

by nijex 2024. 2. 14.

 

wav 파일을 바이트로 읽었을 때 처음 시작하는 44바이트 파일 헤더에 해당한다.

 

아래는 내가 갖고 있는 임의의 wav파일의 헤더이다.

b'RIFF$`\x01\x00WAVEfmt \x10\x00\x00\x00\x01\x00\x01\x00\x80\xbb\x00\x00\x00w\x01\x00\x02\x00\x10\x00data\x00`\x01\x00'

 

44바이트의 헤더는 크게 3개의 chunk(파일 형식 chunk + 음성 정보 chunk + 데이터 chunk)로 나뉜다. 특히 해당 오디오 데이터를 다룰 때는 samplerate, byterate, channel 등의 정보를 담고 있는 중간 chunk의 내용이 중요하다. 위의 헤더 예시에서 각 byte가 무엇을 의미하는지 아래 간단히 정리하였다.

 

* 주의할 점 : little endian 방식으로 표기하기 때문에, 작은 단위가 앞에온다.

 

 

1.  파일의 형식을 나타내는 chunk (12byte)

1-1. chunk ID (4byte)

   RIFF

   wav 파일에 대한 고정값이다.

 

1-2. chunk size (4byte)

  $`\x01\x00

  파일 전체 사이즈에서 chunk id, chunck size를 제외한 값을 의미한다.(파일 전체 크기 - 8byte)

 

1-3. format (4byte)

    WAVE

    파일 형식을 나타내며, WAVE라는 문자가 고정값이다.

 

 

2. 음성 정보를 담고 있는 chunk (24byte)

2-1. chunk ID (4byte)

    fmt 

    'fmt ' 고정값(뒤에 띄어쓰기 있음에 주의하자)

 

2-2. chunk size (4byte)

    \x10\x00\x00\x00

   현재 헤더에서 뒤이어 나올 부분의 크기로 16byte 고정값

 

2-3. audio format (2byte)

   \x01\x00

   고정값 1

 

2-4. number of channel (2byte)

    \x01\x00

   음성파일의 채널 수를 의미한다. mono라면 1, stereo라면 2, ...

 

2-5. sample rate (4byte)

    \x80\xbb\x00\x00

    1초 동안 저장하는 sample의 수를 의미하며, Hz 단위로 표시한다. (해당 파일의 경우 48000)

 

2-6. byte rate (4byte)

    \x00w\x01\x00

    1초 동안 소리를 내는데 필요한 byte 수 (해당 파일의 경우 96000)

 

2-7. block align (2byte)

    \x02\x00

    sample frame의 크기 (mono라면 sample크기, stereo라면 sample크기X2)

 

2-8. bit per sample (2byte)

    \x10\x00

   sample 1개를 몇 bit로 나타내는지. (해당 파일의 경우 16)

 

 

3.  data chunk (8byte)

2-1. chunk ID (4byte)

    data

    'data' 고정값이다.

 

2-2. chunk size (4byte)

    \x00`\x01\x00'

    실제 오디오 데이터 부분 크기로, pcm파일 크기와 동일하다.

'ML' 카테고리의 다른 글

허깅페이스에 오디오 데이터셋 업로드하기  (0) 2024.01.05

댓글