PCM이란?
- Pulse Code Modulation의 약자로 아날로그 신호를 0과 1의 디지털 신호로 변환하는 방법이다.
- WAV파일도 기본적으로 PCM 데이터로 입력되기 때문에 내가 생각하기에는 wav파일 형식에 헤더만 없는 것이 PCM이라고 생각한다.
1. PCM To WAV 방법 - ffmpeg
brew install ffmpeg
- pcm파일은 원시데이터이기 때문에 sample rate와 채널수 등의 정보가 없기 때문에 미리 알고 변환할 때 옵션값으로 줘야 한다.
ffmpeg -f s16le -ar 16k -ac 1 -i sample.pcm sample.wav
2. PCM To WAV 방법 - python
- wav파일을 헤더를 만들어 줘야 한다.
- sample rate 16k와 16비트 양자화 과정을 거친 pcm의 wav 헤더
def make_wav_format(pcm_data:bytes, ch:int) -> bytes:
"""
pcm_data를 통해서 wav 헤더를 만들고 wav 형식으로 저장한다.
:param pcm_data: pcm bytes
:param ch: 채널 수
:return wav: wave bytes
"""
waves = []
waves.append(struct.pack('<4s', b'RIFF'))
waves.append(struct.pack('I', 1))
waves.append(struct.pack('4s', b'WAVE'))
waves.append(struct.pack('4s', b'fmt '))
waves.append(struct.pack('I', 16))
if ch == 2:
waves.append(struct.pack('HHIIHH', 1, 2, 16000, 64000, 4, 16))
else:
waves.append(struct.pack('HHIIHH', 1, 1, 16000, 32000, 2, 16))
waves.append(struct.pack('<4s', b'data'))
waves.append(struct.pack('I', len(pcm_data)))
waves.append(pcm_data)
waves[1] = struct.pack('I', sum(len(w) for w in waves[2:]))
return b''.join(waves)
import struct
pcm_bytes = pathlib.Path("sample.pcm").read_bytes()
wav_bytes = make_wav_format(pcm_bytes, 1)
with open('sample.wav', 'wb') as file:
file.write(wav_bytes)