파이썬 최신 버전인 Python 3.13 환경에서 오디오 편집 라이브러리인 pydub를 사용해 from pydub import AudioSegment 코드를 실행하면 아래와 같은 치명적인 에러가 발생하며 스크립트가 중단되는 현상이 발생합니다.
🚨 발생 장황 및 에러 메시지
Plaintext
Traceback (most recent call last):
File "C:\AppData\Local\Programs\Python\Python313\Lib\site-packages\pydub\utils.py", line 14, in <module>
import audioop
ModuleNotFoundError: No module named 'audioop'
During handling of the above exception, another exception occurred:
...
ModuleNotFoundError: No module named 'pyaudioop'
잘 돌아가던 오디오 자동화 코드가 왜 파이썬 3.13에서 갑자기 뻗는 걸까요? 그리고 파이썬 버전을 다운그레이드하지 않고 해결하는 가장 깔끔한 방법은 무엇일까요? 명쾌한 원인과 해결 코드를 정리해 드립니다.
❓ 에러 원인: Python 3.13에서 ‘audioop’ 내장 모듈 완전 제거
구글(Google) 공식 문서에 따르면, 파이썬 내장 오디오 처리 모듈이었던 audioop는 오랜 기간 내장 라이브러리로 자리 잡고 있었으나 Python 3.13 버전부터 공식적으로 완전히 제거(Removed) 되었습니다.
문제는 전 세계 크리에이터들과 개발자들이 오디오 볼륨 평준화나 편집용으로 가장 많이 쓰는 pydub 라이브러리가 내부적으로 이 구형 audioop 모듈에 의존하고 있다는 점입니다. 이 때문에 파이썬 3.13 환경에서 pydub를 호출하면 존재하지 않는 내장 모듈을 찾으려다가 ModuleNotFoundError를 뱉으며 실행이 불가능해집니다.
🛠️ 해결 방법: pedalboard와 numpy를 활용한 수치 연산 우회
파이썬 버전을 예전 버전으로 다운그레이드하는 방법도 있지만, 최신 3.13 버전을 그대로 유지하면서도 훨씬 더 정확하고 현대적인 방식으로 오디오 볼륨(Loudness)을 평준화하는 우회 코드를 구현할 수 있습니다.
스포티파이(Spotify)에서 개발한 고성능 오디오 필터 라이브러리인 pedalboard와 수치 연산 라이브러리인 numpy를 조합하여 볼륨 편차를 정확하게 제어하는 파이프라인을 구축하는 것입니다.
1. 필수 라이브러리 설치
먼저 터미널(CMD 또는 PowerShell)을 열고 아래 명령어를 입력해 파이썬 3.13을 완벽히 지원하는 오디오 엔진 라이브러리를 설치합니다.
PowerShell
pip install pedalboard numpy
2. Python 3.13 호환 오디오 평준화(Normalization) 전체 코드
기존에 pydub를 사용하던 코드를 걷어내고, 아래의 최적화된 코드를 적용합니다. 이 코드는 특정 폴더 내의 MP3 파일들을 읽어 들여 유튜브 표준 오디오 규격인 -14 dB 수준으로 소리 찢어짐(클리핑) 없이 완벽하게 평준화해 줍니다.
Python
import os
import numpy as np
from pedalboard.io import AudioFile
# 오디오 파일이 모여있는 폴더 경로
AUDIO_DIR = "audio_pool"
# 유튜브 표준 라우드니스 타겟 규격 (-14 dB 기준)
TARGET_DB = -14.0
def normalize_audio():
# 폴더 내 .mp3 확장자 파일 목록 가져오기
files = [f for f in os.listdir(AUDIO_DIR) if f.endswith(".mp3")]
if not files:
print("💡 변환할 MP3 파일이 폴더에 없습니다.")
return
print(f"🚀 [Python 3.13 엔진] 총 {len(files)}개 오디오 평준화 시작...\n")
for file_name in files:
file_path = os.path.join(AUDIO_DIR, file_name)
temp_path = file_path + ".tmp.wav" # 안전한 변환을 위한 임시 임포트 파일
try:
# 1. 파일 안전하게 읽기
with AudioFile(file_path) as f:
audio_data = f.read(f.frames)
sr = f.samplerate
num_channels = f.num_channels
# 2. RMS(평균 음량) 및 현재 데시벨(dB) 수학적 계산
rms = np.sqrt(np.mean(audio_data**2))
current_db = 20 * np.log10(rms + 1e-10)
# 3. 목표치(-14dB)와의 차이 계산 및 증폭 배율(Gain) 적용
gain_db = TARGET_DB - current_db
gain = 10 ** (gain_db / 20)
adjusted_audio = audio_data * gain
# 4. 볼륨 맥시마이징 시 소리 찢어짐(Clipping) 방지 안전장치
max_val = np.max(np.abs(adjusted_audio))
if max_val > 0.95:
adjusted_audio = (adjusted_audio / max_val) * 0.95
# 5. 변환된 오디오 임시 저장 후 원본 덮어쓰기
with AudioFile(temp_path, 'w', sr, num_channels) as f:
f.write(adjusted_audio)
# 프로세스 점유 해제 후 파일 교체
os.remove(file_path)
os.rename(temp_path, file_path)
print(f"✅ 변환 성공: {file_name} ({current_db:.1f} dB -> {TARGET_DB} dB 평준화)")
except Exception as e:
if os.path.exists(temp_path):
os.remove(temp_path)
print(f"❌ 에러 발생 ({file_name}): {e}")
print("\n🎉 모든 오디오 파일의 볼륨 균일화 작업이 완료되었습니다!")
if __name__ == "__main__":
normalize_audio()
💡 요약 및 결론
- 원인: Python 3.13에서 구형 내장 모듈인
audioop가 완전히 제거되면서 이를 사용하는pydub가 작동 불능 상태가 됨. - 해결책: 굳이 파이썬 버전을 다운그레이드할 필요 없이, 최신 버전을 완벽히 지원하는
pedalboard와numpy조합을 통해 데이터 기반으로 볼륨을 가공하면 문제가 깔끔하게 해결됨.
유튜브 스트리밍 자동화 시스템이나 오디오 가공 봇을 만들다가 3.13 버전 에러로 막히셨던 분들은 이 컴팩트한 연산 우회 코드로 에러를 탈출해 보시기 바랍니다!