개요
파이썬의 aifc 모듈은 AIFF(Audio Interchange File Format)와 AIFF-C 파일을 읽고 쓸 수 있도록 다양한 함수를 제공합니다. AIFF는 디지털 오디오 샘플을 파일에 저장하기 위한 포맷이며, 개선형인 AIFF-C는 오디오 데이터를 압축하는 기능까지 갖추고 있습니다.
참고: aifc 모듈은 Python 3.11에서 폐기(deprecated)되었으며, Python 3.13부터 표준 라이브러리에서 제거되었습니다. 최신 환경에서는 libsndfile 기반의 soundfile 같은 외부 라이브러리 사용을 권장합니다.
오디오 파일의 핵심 파라미터
오디오 파일은 다음과 같은 파라미터들로 오디오 데이터를 정의합니다.
샘플링 레이트(프레임 레이트) — 초당 사운드를 샘플링하는 횟수입니다.
채널 수 — 오디오가 모노, 스테레오, 쿼드 중 어느 것인지 나타냅니다.
프레임(frame) — 채널당 하나의 샘플로 구성됩니다.
샘플 크기(sample size) — 각 샘플의 바이트 단위 크기입니다.
따라서 하나의 프레임은 channels × samplesize 바이트이며, 1초 분량의 오디오 데이터는 channels × samplesize × framerate 바이트가 됩니다.
aifc.open()
aifc.open() 함수는 AIFF 또는 AIFF-C 파일을 열어 모드에 따라 읽기 또는 쓰기용 객체 인스턴스를 반환합니다. 파일을 읽으려면 'r' 또는 'rb' 모드를, 쓰려면 'w' 또는 'wb' 모드를 사용합니다.
쓰기 모드 객체의 주요 메서드
| aiff() | AIFF 파일을 생성합니다. |
| aifc() | AIFF-C 파일을 생성합니다. |
| setnchannels() | 오디오 파일의 채널 수를 지정합니다. |
| setsampwidth() | 오디오 샘플의 바이트 단위 크기를 지정합니다. |
| setframerate() | 초당 프레임 수(샘플링 주파수)를 지정합니다. |
| setnframes() | 오디오 파일에 기록할 프레임 수를 지정합니다. |
| setcomptype() | 압축 방식을 지정합니다. AIFF 파일은 압축이 불가능하며, 지원되는 압축 타입은 b'NONE', b'ULAW', b'ALAW', b'G722'입니다. |
| setparams() | 위의 모든 파라미터를 한 번에 설정합니다. 인자는 각 파라미터 값으로 구성된 튜플입니다. |
| writeframes() | 출력 파일에 데이터를 기록합니다. |
| writeframesraw() | writeframes()와 동일하지만 오디오 파일의 헤더를 갱신하지 않습니다. |
AIFF 파일 생성 예제
다음 프로그램은 무작위 신호 데이터를 담은 AIFF 파일을 생성합니다.
import aifc, struct, random
sampleRate = 44100.0 # 헤르츠(Hz)
duration = 1.0 # 초
frequency = 440.0 # 헤르츠(Hz)
obj = aifc.open('sound.aiff', 'w')
obj.setnchannels(1) # 모노
obj.setsampwidth(2)
obj.setframerate(sampleRate)
for i in range(99999):
value = random.randint(-32767, 32767)
data = struct.pack('<h', value)
obj.writeframesraw(data)
obj.close()
읽기 모드 객체의 주요 메서드
| getnchannels() | 오디오 채널 수를 반환합니다(모노는 1, 스테레오는 2). |
| getsampwidth() | 개별 샘플의 바이트 단위 크기를 반환합니다. |
| getframerate() | 샘플링 레이트(초당 오디오 프레임 수)를 반환합니다. |
| getnframes() | 파일에 저장된 오디오 프레임 수를 반환합니다. |
| getcomptype() | 오디오 파일에 적용된 압축 방식을 나타내는 길이 4의 bytes 배열을 반환합니다. |
| getparams() | (nchannels, sampwidth, framerate, nframes, comptype, compname)으로 구성된 namedtuple을 반환합니다. |
| readframes() | 오디오 파일에서 다음 nframes개 프레임을 읽어 반환합니다. |
| setpos(pos) | 지정한 프레임 번호로 이동(seek)합니다. |
읽기·쓰기 객체 공통 메서드
아래 메서드는 읽기 가능(readable) 객체와 쓰기 가능(writable) 객체 모두에서 사용할 수 있습니다.
| rewind() | 읽기 포인터를 되감습니다. 이후 readframes() 호출은 파일 처음부터 시작됩니다. |
| tell() | 현재 프레임 번호를 반환합니다. |
| close() | AIFF 파일을 닫습니다. 호출 후에는 해당 객체를 더 이상 사용할 수 없습니다. |
예제: AIFF 파일 속성 읽기
다음 프로그램은 앞서 생성한 AIFF 파일의 속성 정보를 읽어 출력합니다.
import aifc
obj = aifc.open('sound.aiff', 'r')
print('채널 수:', obj.getnchannels())
print('샘플 너비:', obj.getsampwidth())
print('프레임 레이트:', obj.getframerate())
print('프레임 수:', obj.getnframes())
print('파라미터:', obj.getparams())
obj.close()
실행 결과
채널 수: 1 샘플 너비: 2 프레임 레이트: 44100 프레임 수: 99999 파라미터: _aifc_params(nchannels=1, sampwidth=2, framerate=44100, nframes=99999, comptype=b'NONE', compname=b'not compressed')