pcm을 wav로 변환해보자!! - pcm to wav(feat.python, ffmpeg)

0

음성처리

목록 보기
3/3

PCM이란?

  • Pulse Code Modulation의 약자로 아날로그 신호를 0과 1의 디지털 신호로 변환하는 방법이다.
  • WAV파일도 기본적으로 PCM 데이터로 입력되기 때문에 내가 생각하기에는 wav파일 형식에 헤더만 없는 것이 PCM이라고 생각한다.

1. PCM To WAV 방법 - ffmpeg

  • Mac OS에서의 방법
  • 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))
        # audio_format, channel_cnt, sample_rate, bytes_rate(sr*blockalign:초당 바이츠수), block_align, bps
        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)
profile
나 응애👶 개발자, 딥린이👨‍💻, 언어 연구자 👨‍🎓

0개의 댓글