HOWTO · Python

Python에서 MP3를 WAV로 변환

이 튜토리얼에서는 Python에서 MP3를 WAV로 변환하는 방법에 대해 설명합니다.

이 페이지의 내용

Python에서 MP3 파일을 WAV로 변환하려면 간결한 라이브러리 인터페이스를 제공하는 pydub를 사용하거나, 명령줄 옵션을 직접 제어하고 싶다면 ffmpeg를 호출하세요. 두 방법 모두 ffmpeg 실행 파일을 사용할 수 있어야 합니다. WAV는 대개 압축되지 않아 MP3보다 파일이 훨씬 클 수 있으며, 손실 압축된 MP3를 변환해도 압축 과정에서 사라진 오디오 세부 정보가 복원되지는 않습니다.

pydub로 MP3를 WAV로 변환하기

스크립트를 실행하는 환경에 python -m pip install pydub 명령으로 pydub를 설치하세요. ffmpeg 실행 파일도 설치되어 있고 PATH에서 찾을 수 있어야 합니다. pydub만 설치한다고 ffmpeg가 함께 설치되는 것은 아닙니다. 자세한 배경은 ffmpeg 안내를 참고하세요. 운영체제마다 설치 방법이 다르므로 해당 시스템에서 지원하는 패키지 관리자나 설치 방법을 이용하세요.

이 예제에서는 input.mp3를 원본으로, test.wav를 저장 경로로 사용합니다. 실제 파일에 맞게 두 경로를 바꾸세요. 코드는 pydub를 가져오기 전에 입력 파일이 있는지 확인하므로 템플릿으로 사용할 수 있습니다. 입력 파일이 있으면 MP3를 불러와 WAV 파일로 내보냅니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path

source_path = Path("input.mp3")
destination_path = Path("test.wav")

if not source_path.is_file():
    print(f"Place an MP3 file at {source_path} and run again.")
else:
    from pydub import AudioSegment

    audio = AudioSegment.from_mp3(str(source_path))
    audio.export(str(destination_path), format="wav")
    print(f"Created {destination_path}")

ffmpeg를 직접 실행해 MP3를 WAV로 변환하기

Python 오디오 라이브러리 없이 터미널에서 ffmpeg를 실행할 수 있습니다. ffmpeg가 설치되어 있고 이름으로 실행 가능한지 확인하세요. 그렇지 않으면 실행 파일의 전체 경로를 사용합니다. -i 인수에 입력 파일을 지정하고 마지막 인수에 출력 경로를 지정합니다. 예를 들면 ffmpeg -i input.mp3 test.wav와 같습니다.

이 명령은 현재 디렉터리에 input.mp3가 있고 test.wav를 기록한다고 가정하며, 아래 Python 예제와 같은 경로를 사용합니다. 입력 파일이 다른 위치에 있다면 올바른 경로를 지정하세요. 기존 파일을 덮어쓰기 전에 ffmpeg가 확인을 요청할 수 있습니다. 새 이름을 선택하거나 해당 파일을 바꾸려는 경우에만 덮어쓰기 옵션을 사용하세요.

Python에서 subprocess로 MP3를 WAV로 변환하기

Python 스크립트에서는 subprocess.run()에 인수 목록을 전달해 외부 ffmpeg 프로그램을 실행할 수 있습니다. 이렇게 하면 셸 명령 문자열을 조립하지 않아도 되고, Python에서 프로세스의 0이 아닌 종료 상태를 감지할 수 있습니다. 이 예제는 다른 방법과 동일하게 input.mp3를 원본으로, test.wav를 저장 경로로 사용합니다. 실제 파일에 맞게 두 경로를 바꾸세요. ffmpeg를 호출하기 전에 원본 파일이 있는지도 확인합니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path
import subprocess

source_path = Path("input.mp3")
destination_path = Path("test.wav")

if not source_path.is_file():
    print(f"Place an MP3 file at {source_path} and run again.")
else:
    subprocess.run(
        ["ffmpeg", "-i", str(source_path), str(destination_path)],
        check=True,
    )
    print(f"Created {destination_path}")

check=True를 지정하면 변환이 실패했을 때 Python이 오류를 알리므로 실패를 무시한 채 계속 진행하지 않습니다. ffmpeg가 출력 오디오 파일을 기록합니다. subprocess가 표준 출력을 WAV 파일로 보내는 것은 아닙니다. 여러 파일을 처리할 때는 subprocess.CalledProcessError를 처리하고, 실패한 파일을 진단할 수 있도록 원본 경로와 오류 세부 정보를 기록하세요.

WAV 출력 확인 및 흔한 문제 해결

세 가지 변환 예제는 모두 input.mp3를 원본으로, test.wav를 저장 경로로 사용합니다. 변환 예제의 저장 경로를 변경했다면 아래의 destination_path도 같은 경로로 바꾸세요. 확인 코드는 먼저 파일이 존재하는지 확인한 다음 Python의 wave 모듈로 파일을 열어 읽을 수 있는 WAV 컨테이너인지 확인합니다. 이 확인은 뒤에 나오는 인위적으로 만든 WAV 픽스처와 별개입니다. 그 픽스처는 WAV 검사 방법을 보여줄 뿐 MP3를 변환하지 않습니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path
import wave

# Match this path to the destination used by the conversion example.
destination_path = Path("test.wav")

if not destination_path.is_file():
    print(f"WAV file not found: {destination_path}")
else:
    try:
        with wave.open(str(destination_path), "rb") as wav_file:
            print(
                f"WAV: {wav_file.getnchannels()} channel(s), "
                f"{wav_file.getframerate()} Hz"
            )
    except (OSError, wave.Error) as error:
        print(f"Could not read WAV file: {error}")

다음의 독립 실행형 예제는 Python 표준 라이브러리로 작은 WAV 픽스처를 만들고 기본 메타데이터를 확인합니다. WAV 검사만 보여주는 예제이며 MP3를 디코딩하지는 않습니다.

from pathlib import Path
import tempfile
import wave

with tempfile.TemporaryDirectory() as directory:
    output_path = Path(directory) / "test.wav"
    with wave.open(str(output_path), "wb") as wav_file:
        wav_file.setnchannels(1)
        wav_file.setsampwidth(2)
        wav_file.setframerate(8000)
        wav_file.writeframes(b"\x00\x00" * 800)

    with wave.open(str(output_path), "rb") as wav_file:
        print(f"WAV: {wav_file.getnchannels()} channel(s), {wav_file.getframerate()} Hz")

출력:

WAV: 1 channel(s), 8000 Hz

출력된 값은 WAV 스트림에 관한 정보이며, 원본 MP3보다 음질이 나은지를 나타내지는 않습니다. Python이 ffmpeg를 찾지 못하면 실행 파일을 설치하거나 해당 디렉터리를 PATH에 추가한 뒤, Python을 실행하는 터미널이나 프로세스를 다시 시작하세요. ffmpeg가 입력 파일을 열 수 없다면 스크립트의 작업 디렉터리를 기준으로 파일 이름과 원본 경로를 확인하세요. 변환이 실패하면 ffmpeg 진단 메시지를 살펴보고 입력 파일을 읽을 수 있는지, 대상 디렉터리에 쓸 수 있는지 확인하세요. 스크립트에서 간결한 API가 적합하다면 pydub를 선택하세요. ffmpeg 옵션과 프로세스 상태를 직접 다루고 싶다면 subprocess를 통해 ffmpeg를 사용하세요.