Python에서 헤더가 없는 base64 오디오 파일을 저장하는 법 - wave 활용하기

Taekyung Ahn·2023년 7월 5일

시행착오

목록 보기
1/3

웹과 서버 간 통신에서 오디오 파일을 주고받기 위해 오디오 파일을 base64형태로 변환하는 경우가 많습니다. 아래 예시처럼 오디오 파일을 바이트 단위로 읽어서 base64로 인코딩한 뒤 utf-8 포맷으로 디코딩을 진행하면 64 종류의 문자로 구성된 긴 스트링 형태로 출력됩니다.

import base64
encode_string = base64.b64encode(open("test.wav", "rb").read()).decode('utf-8')
print(encode_string)

>> UklGRiJAAQBXQVZFZm10IBAAAAABAAEAgD4.....

만약 통신으로 받는 base64 오디오 파일에 헤더가 존재한다면 바이트 단위로 디코딩 한 후 저장해주면 됩니다.

decode_string = base64.b64decode(encode_string)
print(decode_string) # RIFF로 시작하기 때문에 웨이브 헤더가 존재하는 걸 확인할 수 있습니다.

>> b'RIFF"@\x01\x00WAVEfmt..

with open("save.wav", "wb") as wav:
    wav.write(decode_string)

그러나 오디오 처리를 위해서 종종 헤더를 떼어낸 base64 형태의 오디오 파일이 송수신되는 경우가 있습니다. 그런 경우에는 위와 같은 방법으로 오디오를 저장한다면 에러가 발생하거나 정상적으로 저장되지 않습니다. 만약 통신으로 받는 base64 오디오 파일에 헤더가 존재하지 않는다면 wave 라는 파이썬 라이브러리를 통해 헤더를 붙여 저장하면 됩니다.

import wave

decode_string = base64.b64decode(encode_string)
with wave.open("save.wav", 'wb') as wav:
    wav.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
    wav.writeframes(decode_string)

setparams의 argument들은 각각 nchannels(채널 개수), sampwidth(샘플 폭), framerate(샘플 레이트), nframes(오디오 프레임 수 - 실제 작성하는 프레임 수가 다르면 나중에 변경됩니다), comptype( 압축 유형), compname(압축 설명)을 의미합니다. 공식 문서에 따르면 wave는 아직 압축을 지원하지 않아서 압축 유형과 압축 설명을 NONE으로 입력하면 된다고 합니다.

profile
정리좋아휴먼의 기록

0개의 댓글